15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * CDDL HEADER START
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems *
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * The contents of this file are subject to the terms of the
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Common Development and Distribution License (the "License").
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * You may not use this file except in compliance with the License.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems *
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * or http://www.opensolaris.org/os/licensing.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * See the License for the specific language governing permissions
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * and limitations under the License.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems *
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * When distributing Covered Code, include this CDDL HEADER in each
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * If applicable, add the following below this CDDL HEADER, with the
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * fields enclosed by brackets "[]" replaced with your own identifying
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * information: Portions Copyright [yyyy] [name of copyright owner]
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems *
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * CDDL HEADER END
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Copyright (c) 2008-2009, Intel Corporation.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * All Rights Reserved.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#include <unistd.h>
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#include <stdio.h>
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#include <dtrace.h>
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#include <string.h>
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#include <stdlib.h>
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#include <memory.h>
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#include <limits.h>
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#include "latencytop.h"
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic dtrace_hdl_t *g_dtp = NULL; /* dtrace handle */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic pid_t pid_self = -1; /* PID of our own process */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Ignore sched if sched is not tracked.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Also ignore ourselves (i.e., latencytop).
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#define SHOULD_IGNORE(pid) \
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ((!g_config.lt_cfg_trace_sched && 0 == (pid)) || pid_self == (pid))
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Get an integer value from dtrace record.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic uint64_t
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsrec_get_value(void *a, size_t b)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems uint64_t ret = 0;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems switch (b) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems case sizeof (uint64_t):
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ret = *((uint64_t *)(a));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems break;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems case sizeof (uint32_t):
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ret = *((uint32_t *)(a));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems break;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems case sizeof (uint16_t):
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ret = *((uint16_t *)(a));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems break;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems case sizeof (uint8_t):
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ret = *((uint8_t *)(a));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems break;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems default:
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems break;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (ret);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Callback to process aggregation lt_call_* (related to on/off cpu
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * activities) in the snapshot.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic int
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsaggwalk_call(const dtrace_aggdata_t *data, lt_stat_type_t stat_type)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_aggdesc_t *aggdesc = data->dtada_desc;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_syminfo_t dts;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems GElf_Sym sym;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems caddr_t addr;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pid_t pid;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems id_t tid;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems unsigned int stack_depth;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems unsigned int pc_size;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems uint64_t pc;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems uint64_t agg_value;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems char *ptr = NULL;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems char *buffer = NULL;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems int ptrsize;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems unsigned int buffersize;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems char *tag = NULL;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems unsigned int priority;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems enum { REC_PID = 1, REC_TID, REC_STACK, REC_TAG, REC_PRIO, REC_AGG,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems NREC };
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Check action type */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((aggdesc->dtagd_nrecs < NREC) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_PID].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TID].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TAG].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_PRIO].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (!DTRACEACT_ISAGG(aggdesc->dtagd_rec[REC_AGG].dtrd_action)) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_STACK].dtrd_action != DTRACEACT_STACK)) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pid = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_PID].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_PID].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (SHOULD_IGNORE(pid)) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems tid = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_TID].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_TID].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Parse stack array from dtagd_rec */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems stack_depth = aggdesc->dtagd_rec[REC_STACK].dtrd_arg;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pc_size = aggdesc->dtagd_rec[REC_STACK].dtrd_size / stack_depth;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems addr = data->dtada_data + aggdesc->dtagd_rec[REC_STACK].dtrd_offset;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems buffersize = (stack_depth * (2 * PATH_MAX + 2) + 1) * sizeof (char);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems buffer = (char *)lt_malloc(buffersize);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ptr = buffer;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ptrsize = buffersize;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Print the stack */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems while (stack_depth > 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pc = rec_get_value(addr, pc_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (pc == 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems break;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems addr += pc_size;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (dtrace_lookup_by_addr(g_dtp, pc, &sym, &dts) == 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems int len;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems len = snprintf(ptr, ptrsize,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems "%s`%s ", dts.dts_object, dts.dts_name);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ptrsize -= len;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (ptrsize <= 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * snprintf returns "desired" length, so
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * reaching here means our buffer is full.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Move ptr to the last byte of the buffer and
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * break.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ptr = &buffer[buffersize-1];
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems break;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems ptr += len;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (ptr != buffer) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * We have printed something, so it is safe to remove
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * the last ' '.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems *(ptr-1) = '\0';
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems tag = (char *)data->dtada_data +
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_TAG].dtrd_offset;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems priority = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_PRIO].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_PRIO].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems agg_value = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_AGG].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_AGG].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_stat_update(pid, tid, buffer, tag, priority, stat_type, agg_value);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (buffer != NULL) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems free(buffer);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Callback to process aggregation lt_named_* (related to lock spinning etc.),
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * in the snapshot.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic int
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsaggwalk_named(const dtrace_aggdata_t *data, lt_stat_type_t stat_type)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_aggdesc_t *aggdesc = data->dtada_desc;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pid_t pid;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems id_t tid;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems uint64_t agg_value;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems int cause_id;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems char *type = NULL;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems enum { REC_PID = 1, REC_TID, REC_TYPE, REC_AGG, NREC };
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Check action type */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((aggdesc->dtagd_nrecs < NREC) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_PID].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TID].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TYPE].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (!DTRACEACT_ISAGG(aggdesc->dtagd_rec[REC_AGG].dtrd_action))) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pid = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_PID].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_PID].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (SHOULD_IGNORE(pid)) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems tid = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_TID].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_TID].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems type = (char *)data->dtada_data
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems + aggdesc->dtagd_rec[REC_TYPE].dtrd_offset;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems cause_id = lt_table_cause_from_name(type, 1, CAUSE_FLAG_SPECIAL);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems agg_value = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_AGG].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_AGG].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_stat_update_cause(pid, tid, cause_id, stat_type, agg_value);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Callback to process aggregation lt_sync_* (related to synchronization
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * objects), in the snapshot.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic int
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsaggwalk_sync(const dtrace_aggdata_t *data, lt_stat_type_t stat_type)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_aggdesc_t *aggdesc = data->dtada_desc;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pid_t pid;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems id_t tid;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems uint64_t agg_value;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems int stype;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems unsigned long long wchan;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems enum { REC_PID = 1, REC_TID, REC_STYPE, REC_WCHAN, REC_AGG, NREC };
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Check action type */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((aggdesc->dtagd_nrecs < NREC) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_PID].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_TID].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_STYPE].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (aggdesc->dtagd_rec[REC_WCHAN].dtrd_action != DTRACEACT_DIFEXPR) ||
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (!DTRACEACT_ISAGG(aggdesc->dtagd_rec[REC_AGG].dtrd_action))) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pid = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_PID].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_PID].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (SHOULD_IGNORE(pid)) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems tid = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_TID].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_TID].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems stype = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_STYPE].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_STYPE].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems wchan = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_WCHAN].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_WCHAN].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems agg_value = rec_get_value(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems data->dtada_data + aggdesc->dtagd_rec[REC_AGG].dtrd_offset,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems aggdesc->dtagd_rec[REC_AGG].dtrd_size);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_stat_update_sobj(pid, tid, stype, wchan, stat_type, agg_value);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Callback to process various aggregations in the snapshot. Called by
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * different aggwalk_* functions.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/* ARGSUSED */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic int
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsaggwalk(const dtrace_aggdata_t *data, void *arg)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems char *tmp;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems char buffer[32];
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_stat_type_t stat_type;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems int (*func)(const dtrace_aggdata_t *, lt_stat_type_t);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) strncpy(buffer, data->dtada_desc->dtagd_name, sizeof (buffer));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems buffer[sizeof (buffer) - 1] = '\0';
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems tmp = strtok(buffer, "_");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (tmp == NULL || strcmp(tmp, "lt") != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems goto done;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems tmp = strtok(NULL, "_");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (tmp == NULL) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems goto done;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "call") == 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems func = aggwalk_call;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "named") == 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems func = aggwalk_named;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "sync") == 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems func = aggwalk_sync;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems goto done;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems tmp = strtok(NULL, "_");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (tmp == NULL) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems goto done;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "count") == 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems stat_type = LT_STAT_COUNT;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "sum") == 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems stat_type = LT_STAT_SUM;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else if (strcmp(tmp, "max") == 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems stat_type = LT_STAT_MAX;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems } else {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems goto done;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) func(data, stat_type);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsdone:
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* We have our data, so remove it from DTrace now */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (DTRACE_AGGWALK_REMOVE);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Callback to handle event caused by DTrace dropping data.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*ARGSUSED*/
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic int
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsdrop_handler(const dtrace_dropdata_t *data, void *user)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Drop: %s\n", data->dtdda_msg);
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems lt_drop_detected = B_TRUE;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Pretend nothing happened, so just continue */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (DTRACE_HANDLE_OK);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#ifndef EMBED_CONFIGS
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Copy the content from a "real" file into a temp file.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsstatic int
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemscopy_tmp_file(const char *src, FILE *dst)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems FILE *tmp = NULL;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems char buffer[256];
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems int bytes;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((tmp = fopen(src, "r")) == NULL) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems while ((bytes = fread(buffer, 1, sizeof (buffer), tmp)) > 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (fwrite(buffer, bytes, 1, dst) != 1) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) fclose(tmp);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#endif
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * DTrace initialization. D script starts running when this function returns.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsint
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemslt_dtrace_init(void)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_prog_t *prog;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_proginfo_t info;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems int err;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems FILE *fp_script = NULL;
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems char tmp[64];
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems pid_self = getpid();
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((g_dtp = dtrace_open(DTRACE_VERSION, 0, &err)) == NULL) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot open dtrace library: %s\n",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(NULL, err));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (dtrace_handle_drop(g_dtp, &drop_handler, NULL) == -1) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot install DTrace handle: %s\n",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(NULL, err));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_enable_filter) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems "ENABLE_FILTER")) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems "Failed to set option ENABLE_FILTER.\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (err);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_trace_syncobj) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems "ENABLE_SYNCOBJ")) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error(
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems "Failed to set option ENABLE_SYNCOBJ.\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (err);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_trace_sched) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems "ENABLE_SCHED")) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error(
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems "Failed to set option ENABLE_SCHED.\n");
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems return (err);
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems }
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems }
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_trace_pid != 0) {
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "TRACE_PID=%u",
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_trace_pid);
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define", tmp)) != 0) {
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems lt_display_error(
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems "Failed to set option TRACE_PID.\n");
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems return (err);
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems }
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems }
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_trace_pgid != 0) {
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems (void) snprintf(tmp, sizeof (tmp), "TRACE_PGID=%u",
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems g_config.lt_cfg_trace_pgid);
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define", tmp)) != 0) {
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems lt_display_error(
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems "Failed to set option TRACE_PGID.\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (err);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (g_config.lt_cfg_low_overhead_mode) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((err = dtrace_setopt(g_dtp, "define",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems "ENABLE_LOW_OVERHEAD")) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error(
a9c12afde877c596eed286ac3f1d518246e5cd1eKrishnendu Sadhukhan - Sun Microsystems "Failed to set option ENABLE_LOW_OVERHEAD.\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (err);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Create a temp file; libdtrace needs it for cpp(1) */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((fp_script = tmpfile()) == NULL) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot create tmp file\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Copy the main D script into the temp file */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#ifdef EMBED_CONFIGS
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (fwrite(&latencytop_d_start,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (size_t)(&latencytop_d_end - &latencytop_d_start), 1, fp_script)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems != 1) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Could not copy D script, fwrite() failed\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#else
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (copy_tmp_file(DEFAULT_D_SCRIPT_NAME, fp_script) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Cannot open script file %s\n",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems DEFAULT_D_SCRIPT_NAME);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems#endif /* EMBED_CONFIGS */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (lt_table_append_trans(fp_script) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) fseek(fp_script, 0, SEEK_SET);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if ((prog = dtrace_program_fcompile(g_dtp, fp_script,
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems DTRACE_C_CPP, 0, NULL)) == NULL) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to compile D script.\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (dtrace_errno(g_dtp));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems (void) fclose(fp_script);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /* Execute the D script */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (dtrace_program_exec(g_dtp, prog, &info) == -1) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to enable probes.\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (dtrace_errno(g_dtp));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (dtrace_go(g_dtp) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to run D script.\n");
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (dtrace_errno(g_dtp));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Worker function to move aggregate data to user space. Called periodically
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * to prevent the kernel from running out of memory.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsint
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemslt_dtrace_work(int force)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems static uint64_t last_snap = 0;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems uint64_t now = lt_millisecond();
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (!force && now - last_snap < g_config.lt_cfg_snap_interval) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (last_snap + g_config.lt_cfg_snap_interval - now);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (dtrace_status(g_dtp) == -1) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed when getting status: %s\n",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(g_dtp, dtrace_errno(g_dtp)));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (dtrace_aggregate_snap(g_dtp) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to snap aggregate: %s\n",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(g_dtp, dtrace_errno(g_dtp)));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems last_snap = now;
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Walk through dtrace aggregator and collect data for latencytop to display.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Called immediately before UI update.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemsint
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemslt_dtrace_collect(void)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (lt_dtrace_work(1) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems if (dtrace_aggregate_walk(g_dtp, aggwalk, NULL) != 0) {
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems lt_display_error("Failed to sort aggregate: %s\n",
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(g_dtp, dtrace_errno(g_dtp)));
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (-1);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems }
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems /*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * Probably we don't need to clear again, because we have removed
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * everything. Paranoid ?
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_aggregate_clear(g_dtp);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems return (0);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems/*
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems * dtrace clean up.
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems */
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystemsint
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystemslt_dtrace_deinit(void)
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems{
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems int ret = 0;
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems if (dtrace_stop(g_dtp) != 0) {
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems lt_display_error("dtrace_stop failed: %s\n",
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems dtrace_errmsg(g_dtp, dtrace_errno(g_dtp)));
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems ret = -1;
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems }
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems dtrace_close(g_dtp);
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems
1a1f79f5a554655d51ccfdc74953bc86dc99d174Krishnendu Sadhukhan - Sun Microsystems return (ret);
15db28971f91c98efb449aebf46024ac72779fa3Krishnendu Sadhukhan - Sun Microsystems}