1*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 2*15db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER START 3*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 4*15db2897SKrishnendu Sadhukhan - Sun Microsystems * The contents of this file are subject to the terms of the 5*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Common Development and Distribution License (the "License"). 6*15db2897SKrishnendu Sadhukhan - Sun Microsystems * You may not use this file except in compliance with the License. 7*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 8*15db2897SKrishnendu Sadhukhan - Sun Microsystems * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*15db2897SKrishnendu Sadhukhan - Sun Microsystems * or http://www.opensolaris.org/os/licensing. 10*15db2897SKrishnendu Sadhukhan - Sun Microsystems * See the License for the specific language governing permissions 11*15db2897SKrishnendu Sadhukhan - Sun Microsystems * and limitations under the License. 12*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 13*15db2897SKrishnendu Sadhukhan - Sun Microsystems * When distributing Covered Code, include this CDDL HEADER in each 14*15db2897SKrishnendu Sadhukhan - Sun Microsystems * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*15db2897SKrishnendu Sadhukhan - Sun Microsystems * If applicable, add the following below this CDDL HEADER, with the 16*15db2897SKrishnendu Sadhukhan - Sun Microsystems * fields enclosed by brackets "[]" replaced with your own identifying 17*15db2897SKrishnendu Sadhukhan - Sun Microsystems * information: Portions Copyright [yyyy] [name of copyright owner] 18*15db2897SKrishnendu Sadhukhan - Sun Microsystems * 19*15db2897SKrishnendu Sadhukhan - Sun Microsystems * CDDL HEADER END 20*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 21*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 22*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Copyright (c) 2008-2009, Intel Corporation. 23*15db2897SKrishnendu Sadhukhan - Sun Microsystems * All Rights Reserved. 24*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 25*15db2897SKrishnendu Sadhukhan - Sun Microsystems 26*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <unistd.h> 27*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdio.h> 28*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <dtrace.h> 29*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <string.h> 30*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <stdlib.h> 31*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <memory.h> 32*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include <limits.h> 33*15db2897SKrishnendu Sadhukhan - Sun Microsystems 34*15db2897SKrishnendu Sadhukhan - Sun Microsystems #include "latencytop.h" 35*15db2897SKrishnendu Sadhukhan - Sun Microsystems 36*15db2897SKrishnendu Sadhukhan - Sun Microsystems static dtrace_hdl_t *g_dtp = NULL; /* dtrace handle */ 37*15db2897SKrishnendu Sadhukhan - Sun Microsystems static pid_t pid_self = -1; /* PID of our own process */ 38*15db2897SKrishnendu Sadhukhan - Sun Microsystems 39*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 40*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Ignore sched if sched is not tracked. 41*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Also ignore ourselves (i.e., latencytop). 42*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 43*15db2897SKrishnendu Sadhukhan - Sun Microsystems #define SHOULD_IGNORE(pid) \ 44*15db2897SKrishnendu Sadhukhan - Sun Microsystems ((!g_config.lt_cfg_trace_sched && 0 == (pid)) || pid_self == (pid)) 45*15db2897SKrishnendu Sadhukhan - Sun Microsystems 46*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 47*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Get an integer value from dtrace record. 48*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 49*15db2897SKrishnendu Sadhukhan - Sun Microsystems static uint64_t 50*15db2897SKrishnendu Sadhukhan - Sun Microsystems rec_get_value(void *a, size_t b) 51*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 52*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t ret = 0; 53*15db2897SKrishnendu Sadhukhan - Sun Microsystems 54*15db2897SKrishnendu Sadhukhan - Sun Microsystems switch (b) { 55*15db2897SKrishnendu Sadhukhan - Sun Microsystems case sizeof (uint64_t): 56*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = *((uint64_t *)(a)); 57*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 58*15db2897SKrishnendu Sadhukhan - Sun Microsystems case sizeof (uint32_t): 59*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = *((uint32_t *)(a)); 60*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 61*15db2897SKrishnendu Sadhukhan - Sun Microsystems case sizeof (uint16_t): 62*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = *((uint16_t *)(a)); 63*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 64*15db2897SKrishnendu Sadhukhan - Sun Microsystems case sizeof (uint8_t): 65*15db2897SKrishnendu Sadhukhan - Sun Microsystems ret = *((uint8_t *)(a)); 66*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 67*15db2897SKrishnendu Sadhukhan - Sun Microsystems default: 68*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 69*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 70*15db2897SKrishnendu Sadhukhan - Sun Microsystems 71*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (ret); 72*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 73*15db2897SKrishnendu Sadhukhan - Sun Microsystems 74*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 75*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Callback to process aggregation lt_call_* (related to on/off cpu 76*15db2897SKrishnendu Sadhukhan - Sun Microsystems * activities) in the snapshot. 77*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 78*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 79*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggwalk_call(const dtrace_aggdata_t *data, lt_stat_type_t stat_type) 80*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 81*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_aggdesc_t *aggdesc = data->dtada_desc; 82*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_syminfo_t dts; 83*15db2897SKrishnendu Sadhukhan - Sun Microsystems GElf_Sym sym; 84*15db2897SKrishnendu Sadhukhan - Sun Microsystems caddr_t addr; 85*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid_t pid; 86*15db2897SKrishnendu Sadhukhan - Sun Microsystems id_t tid; 87*15db2897SKrishnendu Sadhukhan - Sun Microsystems unsigned int stack_depth; 88*15db2897SKrishnendu Sadhukhan - Sun Microsystems unsigned int pc_size; 89*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t pc; 90*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t agg_value; 91*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *ptr = NULL; 92*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *buffer = NULL; 93*15db2897SKrishnendu Sadhukhan - Sun Microsystems int ptrsize; 94*15db2897SKrishnendu Sadhukhan - Sun Microsystems unsigned int buffersize; 95*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *tag = NULL; 96*15db2897SKrishnendu Sadhukhan - Sun Microsystems unsigned int priority; 97*15db2897SKrishnendu Sadhukhan - Sun Microsystems enum { REC_PID = 1, REC_TID, REC_STACK, REC_TAG, REC_PRIO, REC_AGG, 98*15db2897SKrishnendu Sadhukhan - Sun Microsystems NREC }; 99*15db2897SKrishnendu Sadhukhan - Sun Microsystems 100*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Check action type */ 101*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((aggdesc->dtagd_nrecs < NREC) || 102*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_PID].dtrd_action != DTRACEACT_DIFEXPR) || 103*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TID].dtrd_action != DTRACEACT_DIFEXPR) || 104*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TAG].dtrd_action != DTRACEACT_DIFEXPR) || 105*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_PRIO].dtrd_action != DTRACEACT_DIFEXPR) || 106*15db2897SKrishnendu Sadhukhan - Sun Microsystems (!DTRACEACT_ISAGG(aggdesc->dtagd_rec[REC_AGG].dtrd_action)) || 107*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_STACK].dtrd_action != DTRACEACT_STACK)) { 108*15db2897SKrishnendu Sadhukhan - Sun Microsystems 109*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 110*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 111*15db2897SKrishnendu Sadhukhan - Sun Microsystems 112*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid = rec_get_value( 113*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_PID].dtrd_offset, 114*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_PID].dtrd_size); 115*15db2897SKrishnendu Sadhukhan - Sun Microsystems 116*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (SHOULD_IGNORE(pid)) { 117*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 118*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 119*15db2897SKrishnendu Sadhukhan - Sun Microsystems 120*15db2897SKrishnendu Sadhukhan - Sun Microsystems tid = rec_get_value( 121*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_TID].dtrd_offset, 122*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_TID].dtrd_size); 123*15db2897SKrishnendu Sadhukhan - Sun Microsystems 124*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Parse stack array from dtagd_rec */ 125*15db2897SKrishnendu Sadhukhan - Sun Microsystems stack_depth = aggdesc->dtagd_rec[REC_STACK].dtrd_arg; 126*15db2897SKrishnendu Sadhukhan - Sun Microsystems pc_size = aggdesc->dtagd_rec[REC_STACK].dtrd_size / stack_depth; 127*15db2897SKrishnendu Sadhukhan - Sun Microsystems addr = data->dtada_data + aggdesc->dtagd_rec[REC_STACK].dtrd_offset; 128*15db2897SKrishnendu Sadhukhan - Sun Microsystems buffersize = (stack_depth * (2 * PATH_MAX + 2) + 1) * sizeof (char); 129*15db2897SKrishnendu Sadhukhan - Sun Microsystems buffer = (char *)lt_malloc(buffersize); 130*15db2897SKrishnendu Sadhukhan - Sun Microsystems ptr = buffer; 131*15db2897SKrishnendu Sadhukhan - Sun Microsystems ptrsize = buffersize; 132*15db2897SKrishnendu Sadhukhan - Sun Microsystems 133*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Print the stack */ 134*15db2897SKrishnendu Sadhukhan - Sun Microsystems while (stack_depth > 0) { 135*15db2897SKrishnendu Sadhukhan - Sun Microsystems pc = rec_get_value(addr, pc_size); 136*15db2897SKrishnendu Sadhukhan - Sun Microsystems 137*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (pc == 0) { 138*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 139*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 140*15db2897SKrishnendu Sadhukhan - Sun Microsystems 141*15db2897SKrishnendu Sadhukhan - Sun Microsystems addr += pc_size; 142*15db2897SKrishnendu Sadhukhan - Sun Microsystems 143*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrace_lookup_by_addr(g_dtp, pc, &sym, &dts) == 0) { 144*15db2897SKrishnendu Sadhukhan - Sun Microsystems int len; 145*15db2897SKrishnendu Sadhukhan - Sun Microsystems len = snprintf(ptr, ptrsize, 146*15db2897SKrishnendu Sadhukhan - Sun Microsystems "%s`%s ", dts.dts_object, dts.dts_name); 147*15db2897SKrishnendu Sadhukhan - Sun Microsystems ptrsize -= len; 148*15db2897SKrishnendu Sadhukhan - Sun Microsystems 149*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (ptrsize <= 0) { 150*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 151*15db2897SKrishnendu Sadhukhan - Sun Microsystems * snprintf returns "desired" length, so 152*15db2897SKrishnendu Sadhukhan - Sun Microsystems * reaching here means our buffer is full. 153*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Move ptr to the last byte of the buffer and 154*15db2897SKrishnendu Sadhukhan - Sun Microsystems * break. 155*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 156*15db2897SKrishnendu Sadhukhan - Sun Microsystems ptr = &buffer[buffersize-1]; 157*15db2897SKrishnendu Sadhukhan - Sun Microsystems break; 158*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 159*15db2897SKrishnendu Sadhukhan - Sun Microsystems ptr += len; 160*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 161*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 162*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 163*15db2897SKrishnendu Sadhukhan - Sun Microsystems 164*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (ptr != buffer) { 165*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 166*15db2897SKrishnendu Sadhukhan - Sun Microsystems * We have printed something, so it is safe to remove 167*15db2897SKrishnendu Sadhukhan - Sun Microsystems * the last ' '. 168*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 169*15db2897SKrishnendu Sadhukhan - Sun Microsystems *(ptr-1) = '\0'; 170*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 171*15db2897SKrishnendu Sadhukhan - Sun Microsystems 172*15db2897SKrishnendu Sadhukhan - Sun Microsystems tag = (char *)data->dtada_data + 173*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_TAG].dtrd_offset; 174*15db2897SKrishnendu Sadhukhan - Sun Microsystems 175*15db2897SKrishnendu Sadhukhan - Sun Microsystems priority = rec_get_value( 176*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_PRIO].dtrd_offset, 177*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_PRIO].dtrd_size); 178*15db2897SKrishnendu Sadhukhan - Sun Microsystems 179*15db2897SKrishnendu Sadhukhan - Sun Microsystems agg_value = rec_get_value( 180*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_AGG].dtrd_offset, 181*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_AGG].dtrd_size); 182*15db2897SKrishnendu Sadhukhan - Sun Microsystems 183*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_update(pid, tid, buffer, tag, priority, stat_type, agg_value); 184*15db2897SKrishnendu Sadhukhan - Sun Microsystems 185*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (buffer != NULL) { 186*15db2897SKrishnendu Sadhukhan - Sun Microsystems free(buffer); 187*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 188*15db2897SKrishnendu Sadhukhan - Sun Microsystems 189*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 190*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 191*15db2897SKrishnendu Sadhukhan - Sun Microsystems 192*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 193*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Callback to process aggregation lt_named_* (related to lock spinning etc.), 194*15db2897SKrishnendu Sadhukhan - Sun Microsystems * in the snapshot. 195*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 196*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 197*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggwalk_named(const dtrace_aggdata_t *data, lt_stat_type_t stat_type) 198*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 199*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_aggdesc_t *aggdesc = data->dtada_desc; 200*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid_t pid; 201*15db2897SKrishnendu Sadhukhan - Sun Microsystems id_t tid; 202*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t agg_value; 203*15db2897SKrishnendu Sadhukhan - Sun Microsystems int cause_id; 204*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *type = NULL; 205*15db2897SKrishnendu Sadhukhan - Sun Microsystems enum { REC_PID = 1, REC_TID, REC_TYPE, REC_AGG, NREC }; 206*15db2897SKrishnendu Sadhukhan - Sun Microsystems 207*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Check action type */ 208*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((aggdesc->dtagd_nrecs < NREC) || 209*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_PID].dtrd_action != DTRACEACT_DIFEXPR) || 210*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TID].dtrd_action != DTRACEACT_DIFEXPR) || 211*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TYPE].dtrd_action != DTRACEACT_DIFEXPR) || 212*15db2897SKrishnendu Sadhukhan - Sun Microsystems (!DTRACEACT_ISAGG(aggdesc->dtagd_rec[REC_AGG].dtrd_action))) { 213*15db2897SKrishnendu Sadhukhan - Sun Microsystems 214*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 215*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 216*15db2897SKrishnendu Sadhukhan - Sun Microsystems 217*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid = rec_get_value( 218*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_PID].dtrd_offset, 219*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_PID].dtrd_size); 220*15db2897SKrishnendu Sadhukhan - Sun Microsystems 221*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (SHOULD_IGNORE(pid)) { 222*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 223*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 224*15db2897SKrishnendu Sadhukhan - Sun Microsystems 225*15db2897SKrishnendu Sadhukhan - Sun Microsystems tid = rec_get_value( 226*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_TID].dtrd_offset, 227*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_TID].dtrd_size); 228*15db2897SKrishnendu Sadhukhan - Sun Microsystems 229*15db2897SKrishnendu Sadhukhan - Sun Microsystems type = (char *)data->dtada_data 230*15db2897SKrishnendu Sadhukhan - Sun Microsystems + aggdesc->dtagd_rec[REC_TYPE].dtrd_offset; 231*15db2897SKrishnendu Sadhukhan - Sun Microsystems cause_id = lt_table_cause_from_name(type, 1, CAUSE_FLAG_SPECIAL); 232*15db2897SKrishnendu Sadhukhan - Sun Microsystems 233*15db2897SKrishnendu Sadhukhan - Sun Microsystems agg_value = rec_get_value( 234*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_AGG].dtrd_offset, 235*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_AGG].dtrd_size); 236*15db2897SKrishnendu Sadhukhan - Sun Microsystems 237*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_update_cause(pid, tid, cause_id, stat_type, agg_value); 238*15db2897SKrishnendu Sadhukhan - Sun Microsystems 239*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 240*15db2897SKrishnendu Sadhukhan - Sun Microsystems 241*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 242*15db2897SKrishnendu Sadhukhan - Sun Microsystems 243*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 244*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Callback to process aggregation lt_sync_* (related to synchronization 245*15db2897SKrishnendu Sadhukhan - Sun Microsystems * objects), in the snapshot. 246*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 247*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 248*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggwalk_sync(const dtrace_aggdata_t *data, lt_stat_type_t stat_type) 249*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 250*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_aggdesc_t *aggdesc = data->dtada_desc; 251*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid_t pid; 252*15db2897SKrishnendu Sadhukhan - Sun Microsystems id_t tid; 253*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t agg_value; 254*15db2897SKrishnendu Sadhukhan - Sun Microsystems int stype; 255*15db2897SKrishnendu Sadhukhan - Sun Microsystems unsigned long long wchan; 256*15db2897SKrishnendu Sadhukhan - Sun Microsystems enum { REC_PID = 1, REC_TID, REC_STYPE, REC_WCHAN, REC_AGG, NREC }; 257*15db2897SKrishnendu Sadhukhan - Sun Microsystems 258*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Check action type */ 259*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((aggdesc->dtagd_nrecs < NREC) || 260*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_PID].dtrd_action != DTRACEACT_DIFEXPR) || 261*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TID].dtrd_action != DTRACEACT_DIFEXPR) || 262*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_STYPE].dtrd_action != DTRACEACT_DIFEXPR) || 263*15db2897SKrishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_WCHAN].dtrd_action != DTRACEACT_DIFEXPR) || 264*15db2897SKrishnendu Sadhukhan - Sun Microsystems (!DTRACEACT_ISAGG(aggdesc->dtagd_rec[REC_AGG].dtrd_action))) { 265*15db2897SKrishnendu Sadhukhan - Sun Microsystems 266*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 267*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 268*15db2897SKrishnendu Sadhukhan - Sun Microsystems 269*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid = rec_get_value( 270*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_PID].dtrd_offset, 271*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_PID].dtrd_size); 272*15db2897SKrishnendu Sadhukhan - Sun Microsystems 273*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (SHOULD_IGNORE(pid)) { 274*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 275*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 276*15db2897SKrishnendu Sadhukhan - Sun Microsystems 277*15db2897SKrishnendu Sadhukhan - Sun Microsystems tid = rec_get_value( 278*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_TID].dtrd_offset, 279*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_TID].dtrd_size); 280*15db2897SKrishnendu Sadhukhan - Sun Microsystems 281*15db2897SKrishnendu Sadhukhan - Sun Microsystems stype = rec_get_value( 282*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_STYPE].dtrd_offset, 283*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_STYPE].dtrd_size); 284*15db2897SKrishnendu Sadhukhan - Sun Microsystems 285*15db2897SKrishnendu Sadhukhan - Sun Microsystems wchan = rec_get_value( 286*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_WCHAN].dtrd_offset, 287*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_WCHAN].dtrd_size); 288*15db2897SKrishnendu Sadhukhan - Sun Microsystems 289*15db2897SKrishnendu Sadhukhan - Sun Microsystems agg_value = rec_get_value( 290*15db2897SKrishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_AGG].dtrd_offset, 291*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_AGG].dtrd_size); 292*15db2897SKrishnendu Sadhukhan - Sun Microsystems 293*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_update_sobj(pid, tid, stype, wchan, stat_type, agg_value); 294*15db2897SKrishnendu Sadhukhan - Sun Microsystems 295*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 296*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 297*15db2897SKrishnendu Sadhukhan - Sun Microsystems 298*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 299*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Callback to process various aggregations in the snapshot. Called by 300*15db2897SKrishnendu Sadhukhan - Sun Microsystems * different aggwalk_* functions. 301*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 302*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* ARGSUSED */ 303*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 304*15db2897SKrishnendu Sadhukhan - Sun Microsystems aggwalk(const dtrace_aggdata_t *data, void *arg) 305*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 306*15db2897SKrishnendu Sadhukhan - Sun Microsystems char *tmp; 307*15db2897SKrishnendu Sadhukhan - Sun Microsystems char buffer[32]; 308*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_stat_type_t stat_type; 309*15db2897SKrishnendu Sadhukhan - Sun Microsystems int (*func)(const dtrace_aggdata_t *, lt_stat_type_t); 310*15db2897SKrishnendu Sadhukhan - Sun Microsystems 311*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) strncpy(buffer, data->dtada_desc->dtagd_name, sizeof (buffer)); 312*15db2897SKrishnendu Sadhukhan - Sun Microsystems buffer[sizeof (buffer) - 1] = '\0'; 313*15db2897SKrishnendu Sadhukhan - Sun Microsystems tmp = strtok(buffer, "_"); 314*15db2897SKrishnendu Sadhukhan - Sun Microsystems 315*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (tmp == NULL || strcmp(tmp, "lt") != 0) { 316*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto done; 317*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 318*15db2897SKrishnendu Sadhukhan - Sun Microsystems 319*15db2897SKrishnendu Sadhukhan - Sun Microsystems tmp = strtok(NULL, "_"); 320*15db2897SKrishnendu Sadhukhan - Sun Microsystems 321*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (tmp == NULL) { 322*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto done; 323*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "call") == 0) { 324*15db2897SKrishnendu Sadhukhan - Sun Microsystems func = aggwalk_call; 325*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "named") == 0) { 326*15db2897SKrishnendu Sadhukhan - Sun Microsystems func = aggwalk_named; 327*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "sync") == 0) { 328*15db2897SKrishnendu Sadhukhan - Sun Microsystems func = aggwalk_sync; 329*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 330*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto done; 331*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 332*15db2897SKrishnendu Sadhukhan - Sun Microsystems 333*15db2897SKrishnendu Sadhukhan - Sun Microsystems tmp = strtok(NULL, "_"); 334*15db2897SKrishnendu Sadhukhan - Sun Microsystems 335*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (tmp == NULL) { 336*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto done; 337*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "count") == 0) { 338*15db2897SKrishnendu Sadhukhan - Sun Microsystems stat_type = LT_STAT_COUNT; 339*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "sum") == 0) { 340*15db2897SKrishnendu Sadhukhan - Sun Microsystems stat_type = LT_STAT_SUM; 341*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "max") == 0) { 342*15db2897SKrishnendu Sadhukhan - Sun Microsystems stat_type = LT_STAT_MAX; 343*15db2897SKrishnendu Sadhukhan - Sun Microsystems } else { 344*15db2897SKrishnendu Sadhukhan - Sun Microsystems goto done; 345*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 346*15db2897SKrishnendu Sadhukhan - Sun Microsystems 347*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) func(data, stat_type); 348*15db2897SKrishnendu Sadhukhan - Sun Microsystems 349*15db2897SKrishnendu Sadhukhan - Sun Microsystems done: 350*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* We have our data, so remove it from DTrace now */ 351*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (DTRACE_AGGWALK_REMOVE); 352*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 353*15db2897SKrishnendu Sadhukhan - Sun Microsystems 354*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 355*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Callback to handle event caused by DTrace dropping data. 356*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 357*15db2897SKrishnendu Sadhukhan - Sun Microsystems /*ARGSUSED*/ 358*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 359*15db2897SKrishnendu Sadhukhan - Sun Microsystems drop_handler(const dtrace_dropdata_t *data, void *user) 360*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 361*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Drop: %s\n", data->dtdda_msg); 362*15db2897SKrishnendu Sadhukhan - Sun Microsystems 363*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Pretend nothing happened, so just continue */ 364*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (DTRACE_HANDLE_OK); 365*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 366*15db2897SKrishnendu Sadhukhan - Sun Microsystems 367*15db2897SKrishnendu Sadhukhan - Sun Microsystems #ifndef EMBED_CONFIGS 368*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 369*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Copy the content from a "real" file into a temp file. 370*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 371*15db2897SKrishnendu Sadhukhan - Sun Microsystems static int 372*15db2897SKrishnendu Sadhukhan - Sun Microsystems copy_tmp_file(const char *src, FILE *dst) 373*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 374*15db2897SKrishnendu Sadhukhan - Sun Microsystems FILE *tmp = NULL; 375*15db2897SKrishnendu Sadhukhan - Sun Microsystems char buffer[256]; 376*15db2897SKrishnendu Sadhukhan - Sun Microsystems int bytes; 377*15db2897SKrishnendu Sadhukhan - Sun Microsystems 378*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((tmp = fopen(src, "r")) == NULL) { 379*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 380*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 381*15db2897SKrishnendu Sadhukhan - Sun Microsystems 382*15db2897SKrishnendu Sadhukhan - Sun Microsystems while ((bytes = fread(buffer, 1, sizeof (buffer), tmp)) > 0) { 383*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (fwrite(buffer, bytes, 1, dst) != 1) { 384*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 385*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 386*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 387*15db2897SKrishnendu Sadhukhan - Sun Microsystems 388*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fclose(tmp); 389*15db2897SKrishnendu Sadhukhan - Sun Microsystems 390*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 391*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 392*15db2897SKrishnendu Sadhukhan - Sun Microsystems #endif 393*15db2897SKrishnendu Sadhukhan - Sun Microsystems 394*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 395*15db2897SKrishnendu Sadhukhan - Sun Microsystems * DTrace initialization. D script starts running when this function returns. 396*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 397*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 398*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_dtrace_init(void) 399*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 400*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_prog_t *prog; 401*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_proginfo_t info; 402*15db2897SKrishnendu Sadhukhan - Sun Microsystems int err; 403*15db2897SKrishnendu Sadhukhan - Sun Microsystems FILE *fp_script = NULL; 404*15db2897SKrishnendu Sadhukhan - Sun Microsystems 405*15db2897SKrishnendu Sadhukhan - Sun Microsystems pid_self = getpid(); 406*15db2897SKrishnendu Sadhukhan - Sun Microsystems 407*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((g_dtp = dtrace_open(DTRACE_VERSION, 0, &err)) == NULL) { 408*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot open dtrace library: %s\n", 409*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(NULL, err)); 410*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 411*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 412*15db2897SKrishnendu Sadhukhan - Sun Microsystems 413*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrace_handle_drop(g_dtp, &drop_handler, NULL) == -1) { 414*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot install DTrace handle: %s\n", 415*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(NULL, err)); 416*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 417*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 418*15db2897SKrishnendu Sadhukhan - Sun Microsystems 419*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_enable_filter) { 420*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define", 421*15db2897SKrishnendu Sadhukhan - Sun Microsystems "ENABLE_FILTER")) != 0) { 422*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 423*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Failed to set option ENABLE_FILTER.\n"); 424*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (err); 425*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 426*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 427*15db2897SKrishnendu Sadhukhan - Sun Microsystems 428*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_trace_syncobj) { 429*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define", 430*15db2897SKrishnendu Sadhukhan - Sun Microsystems "ENABLE_SYNCOBJ")) != 0) { 431*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 432*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Failed to set option ENABLE_SYNCOBJ.\n"); 433*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (err); 434*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 435*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 436*15db2897SKrishnendu Sadhukhan - Sun Microsystems 437*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_trace_sched) { 438*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define", 439*15db2897SKrishnendu Sadhukhan - Sun Microsystems "ENABLE_SCHED")) != 0) { 440*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 441*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Failed to set option ENABLE_SYNCOBJ.\n"); 442*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (err); 443*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 444*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 445*15db2897SKrishnendu Sadhukhan - Sun Microsystems 446*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_low_overhead_mode) { 447*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define", 448*15db2897SKrishnendu Sadhukhan - Sun Microsystems "ENABLE_LOW_OVERHEAD")) != 0) { 449*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error( 450*15db2897SKrishnendu Sadhukhan - Sun Microsystems "Failed to set option ENABLE_SYNCOBJ.\n"); 451*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (err); 452*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 453*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 454*15db2897SKrishnendu Sadhukhan - Sun Microsystems 455*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Create a temp file; libdtrace needs it for cpp(1) */ 456*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((fp_script = tmpfile()) == NULL) { 457*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot create tmp file\n"); 458*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 459*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 460*15db2897SKrishnendu Sadhukhan - Sun Microsystems 461*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Copy the main D script into the temp file */ 462*15db2897SKrishnendu Sadhukhan - Sun Microsystems #ifdef EMBED_CONFIGS 463*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (fwrite(&latencytop_d_start, 464*15db2897SKrishnendu Sadhukhan - Sun Microsystems (size_t)(&latencytop_d_end - &latencytop_d_start), 1, fp_script) 465*15db2897SKrishnendu Sadhukhan - Sun Microsystems != 1) { 466*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Could not copy D script, fwrite() failed\n"); 467*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script); 468*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 469*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 470*15db2897SKrishnendu Sadhukhan - Sun Microsystems #else 471*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (copy_tmp_file(DEFAULT_D_SCRIPT_NAME, fp_script) != 0) { 472*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot open script file %s\n", 473*15db2897SKrishnendu Sadhukhan - Sun Microsystems DEFAULT_D_SCRIPT_NAME); 474*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script); 475*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 476*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 477*15db2897SKrishnendu Sadhukhan - Sun Microsystems #endif /* EMBED_CONFIGS */ 478*15db2897SKrishnendu Sadhukhan - Sun Microsystems 479*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (lt_table_append_trans(fp_script) != 0) { 480*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script); 481*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 482*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 483*15db2897SKrishnendu Sadhukhan - Sun Microsystems 484*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fseek(fp_script, 0, SEEK_SET); 485*15db2897SKrishnendu Sadhukhan - Sun Microsystems 486*15db2897SKrishnendu Sadhukhan - Sun Microsystems if ((prog = dtrace_program_fcompile(g_dtp, fp_script, 487*15db2897SKrishnendu Sadhukhan - Sun Microsystems DTRACE_C_CPP, 0, NULL)) == NULL) { 488*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to compile D script.\n"); 489*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script); 490*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (dtrace_errno(g_dtp)); 491*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 492*15db2897SKrishnendu Sadhukhan - Sun Microsystems 493*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script); 494*15db2897SKrishnendu Sadhukhan - Sun Microsystems 495*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* Execute the D script */ 496*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrace_program_exec(g_dtp, prog, &info) == -1) { 497*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to enable probes.\n"); 498*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (dtrace_errno(g_dtp)); 499*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 500*15db2897SKrishnendu Sadhukhan - Sun Microsystems 501*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrace_go(g_dtp) != 0) { 502*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to run D script.\n"); 503*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (dtrace_errno(g_dtp)); 504*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 505*15db2897SKrishnendu Sadhukhan - Sun Microsystems 506*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 507*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 508*15db2897SKrishnendu Sadhukhan - Sun Microsystems 509*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 510*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Worker function to move aggregate data to user space. Called periodically 511*15db2897SKrishnendu Sadhukhan - Sun Microsystems * to prevent the kernel from running out of memory. 512*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 513*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 514*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_dtrace_work(int force) 515*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 516*15db2897SKrishnendu Sadhukhan - Sun Microsystems static uint64_t last_snap = 0; 517*15db2897SKrishnendu Sadhukhan - Sun Microsystems uint64_t now = lt_millisecond(); 518*15db2897SKrishnendu Sadhukhan - Sun Microsystems 519*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (!force && now - last_snap < g_config.lt_cfg_snap_interval) { 520*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (last_snap + g_config.lt_cfg_snap_interval - now); 521*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 522*15db2897SKrishnendu Sadhukhan - Sun Microsystems 523*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrace_status(g_dtp) == -1) { 524*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed when getting status: %s\n", 525*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(g_dtp, dtrace_errno(g_dtp))); 526*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 527*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 528*15db2897SKrishnendu Sadhukhan - Sun Microsystems 529*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrace_aggregate_snap(g_dtp) != 0) { 530*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to snap aggregate: %s\n", 531*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(g_dtp, dtrace_errno(g_dtp))); 532*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 533*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 534*15db2897SKrishnendu Sadhukhan - Sun Microsystems 535*15db2897SKrishnendu Sadhukhan - Sun Microsystems last_snap = now; 536*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 537*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 538*15db2897SKrishnendu Sadhukhan - Sun Microsystems 539*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 540*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Walk through dtrace aggregator and collect data for latencytop to display. 541*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Called immediately before UI update. 542*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 543*15db2897SKrishnendu Sadhukhan - Sun Microsystems int 544*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_dtrace_collect(void) 545*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 546*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (lt_dtrace_work(1) != 0) { 547*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 548*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 549*15db2897SKrishnendu Sadhukhan - Sun Microsystems 550*15db2897SKrishnendu Sadhukhan - Sun Microsystems if (dtrace_aggregate_walk(g_dtp, aggwalk, NULL) != 0) { 551*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to sort aggregate: %s\n", 552*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(g_dtp, dtrace_errno(g_dtp))); 553*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (-1); 554*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 555*15db2897SKrishnendu Sadhukhan - Sun Microsystems 556*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 557*15db2897SKrishnendu Sadhukhan - Sun Microsystems * Probably we don't need to clear again, because we have removed 558*15db2897SKrishnendu Sadhukhan - Sun Microsystems * everything. Paranoid ? 559*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 560*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_aggregate_clear(g_dtp); 561*15db2897SKrishnendu Sadhukhan - Sun Microsystems 562*15db2897SKrishnendu Sadhukhan - Sun Microsystems return (0); 563*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 564*15db2897SKrishnendu Sadhukhan - Sun Microsystems 565*15db2897SKrishnendu Sadhukhan - Sun Microsystems /* 566*15db2897SKrishnendu Sadhukhan - Sun Microsystems * dtrace clean up. 567*15db2897SKrishnendu Sadhukhan - Sun Microsystems */ 568*15db2897SKrishnendu Sadhukhan - Sun Microsystems void 569*15db2897SKrishnendu Sadhukhan - Sun Microsystems lt_dtrace_deinit(void) 570*15db2897SKrishnendu Sadhukhan - Sun Microsystems { 571*15db2897SKrishnendu Sadhukhan - Sun Microsystems (void) dtrace_stop(g_dtp); 572*15db2897SKrishnendu Sadhukhan - Sun Microsystems dtrace_close(g_dtp); 573*15db2897SKrishnendu Sadhukhan - Sun Microsystems } 574