115db2897SKrishnendu Sadhukhan - Sun Microsystems /*
215db2897SKrishnendu Sadhukhan - Sun Microsystems  * CDDL HEADER START
315db2897SKrishnendu Sadhukhan - Sun Microsystems  *
415db2897SKrishnendu Sadhukhan - Sun Microsystems  * The contents of this file are subject to the terms of the
515db2897SKrishnendu Sadhukhan - Sun Microsystems  * Common Development and Distribution License (the "License").
615db2897SKrishnendu Sadhukhan - Sun Microsystems  * You may not use this file except in compliance with the License.
715db2897SKrishnendu Sadhukhan - Sun Microsystems  *
815db2897SKrishnendu Sadhukhan - Sun Microsystems  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
915db2897SKrishnendu Sadhukhan - Sun Microsystems  * or http://www.opensolaris.org/os/licensing.
1015db2897SKrishnendu Sadhukhan - Sun Microsystems  * See the License for the specific language governing permissions
1115db2897SKrishnendu Sadhukhan - Sun Microsystems  * and limitations under the License.
1215db2897SKrishnendu Sadhukhan - Sun Microsystems  *
1315db2897SKrishnendu Sadhukhan - Sun Microsystems  * When distributing Covered Code, include this CDDL HEADER in each
1415db2897SKrishnendu Sadhukhan - Sun Microsystems  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1515db2897SKrishnendu Sadhukhan - Sun Microsystems  * If applicable, add the following below this CDDL HEADER, with the
1615db2897SKrishnendu Sadhukhan - Sun Microsystems  * fields enclosed by brackets "[]" replaced with your own identifying
1715db2897SKrishnendu Sadhukhan - Sun Microsystems  * information: Portions Copyright [yyyy] [name of copyright owner]
1815db2897SKrishnendu Sadhukhan - Sun Microsystems  *
1915db2897SKrishnendu Sadhukhan - Sun Microsystems  * CDDL HEADER END
2015db2897SKrishnendu Sadhukhan - Sun Microsystems  */
2115db2897SKrishnendu Sadhukhan - Sun Microsystems /*
2215db2897SKrishnendu Sadhukhan - Sun Microsystems  * Copyright (c) 2008-2009, Intel Corporation.
2315db2897SKrishnendu Sadhukhan - Sun Microsystems  * All Rights Reserved.
2415db2897SKrishnendu Sadhukhan - Sun Microsystems  */
2515db2897SKrishnendu Sadhukhan - Sun Microsystems 
2615db2897SKrishnendu Sadhukhan - Sun Microsystems #define	MAX_TAG		8
2715db2897SKrishnendu Sadhukhan - Sun Microsystems #define	MAX_STACK	64
2815db2897SKrishnendu Sadhukhan - Sun Microsystems 
2915db2897SKrishnendu Sadhukhan - Sun Microsystems #pragma D option aggsize=8m
3015db2897SKrishnendu Sadhukhan - Sun Microsystems #pragma D option bufsize=16m
3115db2897SKrishnendu Sadhukhan - Sun Microsystems #pragma D option dynvarsize=16m
3215db2897SKrishnendu Sadhukhan - Sun Microsystems #pragma D option aggrate=0
3315db2897SKrishnendu Sadhukhan - Sun Microsystems #pragma D option stackframes=MAX_STACK
3415db2897SKrishnendu Sadhukhan - Sun Microsystems /*
3515db2897SKrishnendu Sadhukhan - Sun Microsystems  * Our D script needs to compile even if some of the TRANSLATE probes cannot
3615db2897SKrishnendu Sadhukhan - Sun Microsystems  * be found. Missing probes can be caused by older kernel, different
3715db2897SKrishnendu Sadhukhan - Sun Microsystems  * architecture, unloaded modules etc.
3815db2897SKrishnendu Sadhukhan - Sun Microsystems  */
3915db2897SKrishnendu Sadhukhan - Sun Microsystems #pragma D option zdefs
4015db2897SKrishnendu Sadhukhan - Sun Microsystems 
4115db2897SKrishnendu Sadhukhan - Sun Microsystems #if defined(ENABLE_SCHED)
42*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #if defined(TRACE_PID)
43*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER    / pid == 0 || pid == TRACE_PID /
44*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER_COND(a)    / (pid == 0 || pid == TRACE_PID) && (a) /
45*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #elif defined(TRACE_PGID)
46*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER    / pid == 0 || curpsinfo->pr_pgid == TRACE_PGID /
47*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER_COND(a)
48*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems     / (pid == 0 || curpsinfo->pr_pgid == TRACE_PGID) && (a) /
49*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #else
5015db2897SKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER
5115db2897SKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER_COND(a)	/ (a) /
52*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #endif
53*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #else	/* ENABLE_SCHED */
54*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #if defined(TRACE_PID)
55*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER    / pid == TRACE_PID /
56*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER_COND(a)    / (pid == TRACE_PID) && (a) /
57*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #elif defined(TRACE_PGID)
58*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER    / curpsinfo->pr_pgid == TRACE_PGID /
59*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER_COND(a)    / (curpsinfo->pr_pgid == TRACE_PGID) && (a) /
6015db2897SKrishnendu Sadhukhan - Sun Microsystems #else
6115db2897SKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER	/ pid != 0 /
62*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #define TRACE_FILTER_COND(a)    / (pid != 0) && (a) /
6315db2897SKrishnendu Sadhukhan - Sun Microsystems #endif
64*a9c12afdSKrishnendu Sadhukhan - Sun Microsystems #endif /* ENABLE_SCHED */
6515db2897SKrishnendu Sadhukhan - Sun Microsystems 
6615db2897SKrishnendu Sadhukhan - Sun Microsystems /* Threshold to filter WAKEABLE latencies. */
6715db2897SKrishnendu Sadhukhan - Sun Microsystems #define FILTER_THRESHOLD	5000000
6815db2897SKrishnendu Sadhukhan - Sun Microsystems /* From thread.h */
6915db2897SKrishnendu Sadhukhan - Sun Microsystems #define T_WAKEABLE		2
7015db2897SKrishnendu Sadhukhan - Sun Microsystems 
7115db2897SKrishnendu Sadhukhan - Sun Microsystems /*
7215db2897SKrishnendu Sadhukhan - Sun Microsystems  * This array is used to store timestamp of when threads are enqueued
7315db2897SKrishnendu Sadhukhan - Sun Microsystems  * to dispatch queue.
7415db2897SKrishnendu Sadhukhan - Sun Microsystems  * self-> is not accessible when enqueue happens.
7515db2897SKrishnendu Sadhukhan - Sun Microsystems  */
7615db2897SKrishnendu Sadhukhan - Sun Microsystems unsigned long long lt_timestamps[int, int];
7715db2897SKrishnendu Sadhukhan - Sun Microsystems 
7815db2897SKrishnendu Sadhukhan - Sun Microsystems self unsigned int lt_is_block_wakeable;
7915db2897SKrishnendu Sadhukhan - Sun Microsystems self unsigned long long lt_sleep_start;
8015db2897SKrishnendu Sadhukhan - Sun Microsystems self unsigned long long lt_sleep_duration;
8115db2897SKrishnendu Sadhukhan - Sun Microsystems self unsigned long long lt_sch_delay;
8215db2897SKrishnendu Sadhukhan - Sun Microsystems self unsigned int lt_counter;		/* only used in low overhead */
8315db2897SKrishnendu Sadhukhan - Sun Microsystems self unsigned long long lt_timestamp;	/* only used in low overhead */
8415db2897SKrishnendu Sadhukhan - Sun Microsystems self unsigned int lt_stackp;
8515db2897SKrishnendu Sadhukhan - Sun Microsystems self unsigned int lt_prio[int];
8615db2897SKrishnendu Sadhukhan - Sun Microsystems self string lt_cause[int];
8715db2897SKrishnendu Sadhukhan - Sun Microsystems 
8815db2897SKrishnendu Sadhukhan - Sun Microsystems this unsigned int priority;
8915db2897SKrishnendu Sadhukhan - Sun Microsystems this string cause;
9015db2897SKrishnendu Sadhukhan - Sun Microsystems 
9115db2897SKrishnendu Sadhukhan - Sun Microsystems /*
9215db2897SKrishnendu Sadhukhan - Sun Microsystems  * Clean up everything, otherwise we will run out of memory.
9315db2897SKrishnendu Sadhukhan - Sun Microsystems  */
9415db2897SKrishnendu Sadhukhan - Sun Microsystems proc:::lwp-exit
9515db2897SKrishnendu Sadhukhan - Sun Microsystems {
9615db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_timestamps[curpsinfo->pr_pid, curlwpsinfo->pr_lwpid] = 0;
9715db2897SKrishnendu Sadhukhan - Sun Microsystems 
9815db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sleep_start = 0;
9915db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_is_block_wakeable = 0;
10015db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_counter = 0;
10115db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_timestamp = 0;
10215db2897SKrishnendu Sadhukhan - Sun Microsystems 
10315db2897SKrishnendu Sadhukhan - Sun Microsystems 	/*
10415db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * Workaround: no way to clear associative array.
10515db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * We have to manually clear 0 ~ (MAX_TAG-1).
10615db2897SKrishnendu Sadhukhan - Sun Microsystems 	 */
10715db2897SKrishnendu Sadhukhan - Sun Microsystems 
10815db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[0] = 0;
10915db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[1] = 0;
11015db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[2] = 0;
11115db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[3] = 0;
11215db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[4] = 0;
11315db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[5] = 0;
11415db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[6] = 0;
11515db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[7] = 0;
11615db2897SKrishnendu Sadhukhan - Sun Microsystems 
11715db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[0] = 0;
11815db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[1] = 0;
11915db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[2] = 0;
12015db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[3] = 0;
12115db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[4] = 0;
12215db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[5] = 0;
12315db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[6] = 0;
12415db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[7] = 0;
12515db2897SKrishnendu Sadhukhan - Sun Microsystems }
12615db2897SKrishnendu Sadhukhan - Sun Microsystems 
12715db2897SKrishnendu Sadhukhan - Sun Microsystems #if !defined(ENABLE_LOW_OVERHEAD)
12815db2897SKrishnendu Sadhukhan - Sun Microsystems /*
12915db2897SKrishnendu Sadhukhan - Sun Microsystems  * Log timestamp when a thread is taken off the CPU.
13015db2897SKrishnendu Sadhukhan - Sun Microsystems  */
13115db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:off-cpu
13215db2897SKrishnendu Sadhukhan - Sun Microsystems TRACE_FILTER_COND(curlwpsinfo->pr_state == SSLEEP)
13315db2897SKrishnendu Sadhukhan - Sun Microsystems {
13415db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sleep_start = timestamp;
13515db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_is_block_wakeable = curthread->t_flag & T_WAKEABLE;
13615db2897SKrishnendu Sadhukhan - Sun Microsystems 
13715db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_timestamps[curpsinfo->pr_pid, curlwpsinfo->pr_lwpid] =
13815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_sleep_start;
13915db2897SKrishnendu Sadhukhan - Sun Microsystems }
14015db2897SKrishnendu Sadhukhan - Sun Microsystems 
14115db2897SKrishnendu Sadhukhan - Sun Microsystems /*
14215db2897SKrishnendu Sadhukhan - Sun Microsystems  * Log timestamp when a thread is put on a dispatch queue and becomes runnable.
14315db2897SKrishnendu Sadhukhan - Sun Microsystems  */
14415db2897SKrishnendu Sadhukhan - Sun Microsystems sched:::enqueue
14515db2897SKrishnendu Sadhukhan - Sun Microsystems /lt_timestamps[args[1]->pr_pid, args[0]->pr_lwpid] != 0/
14615db2897SKrishnendu Sadhukhan - Sun Microsystems {
14715db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_timestamps[args[1]->pr_pid, args[0]->pr_lwpid] = timestamp;
14815db2897SKrishnendu Sadhukhan - Sun Microsystems }
14915db2897SKrishnendu Sadhukhan - Sun Microsystems 
15015db2897SKrishnendu Sadhukhan - Sun Microsystems /*
15115db2897SKrishnendu Sadhukhan - Sun Microsystems  * Calculate latency when the thread is actually on the CPU.
15215db2897SKrishnendu Sadhukhan - Sun Microsystems  * This is necessary in order to get the right stack.
15315db2897SKrishnendu Sadhukhan - Sun Microsystems  */
15415db2897SKrishnendu Sadhukhan - Sun Microsystems this unsigned long long end;
15515db2897SKrishnendu Sadhukhan - Sun Microsystems this unsigned long long now;
15615db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:on-cpu
15715db2897SKrishnendu Sadhukhan - Sun Microsystems /self->lt_sleep_start != 0/
15815db2897SKrishnendu Sadhukhan - Sun Microsystems {
15915db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->end = lt_timestamps[curpsinfo->pr_pid, curlwpsinfo->pr_lwpid];
16015db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->now = timestamp;
16115db2897SKrishnendu Sadhukhan - Sun Microsystems 	lt_timestamps[curpsinfo->pr_pid, curlwpsinfo->pr_lwpid] = 0;
16215db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->end = (this->end != 0 && this->end != self->lt_sleep_start)
16315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    ? this->end : this->now;
16415db2897SKrishnendu Sadhukhan - Sun Microsystems 
16515db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sch_delay = this->now - this->end;
16615db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sleep_duration = this->end - self->lt_sleep_start;
16715db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sleep_start = 0;
16815db2897SKrishnendu Sadhukhan - Sun Microsystems }
16915db2897SKrishnendu Sadhukhan - Sun Microsystems 
17015db2897SKrishnendu Sadhukhan - Sun Microsystems /*
17115db2897SKrishnendu Sadhukhan - Sun Microsystems  * Filter: drop all "large" latency when it is interruptible, i.e., sleep()
17215db2897SKrishnendu Sadhukhan - Sun Microsystems  * etc.
17315db2897SKrishnendu Sadhukhan - Sun Microsystems  */
17415db2897SKrishnendu Sadhukhan - Sun Microsystems #if defined(ENABLE_FILTER)
17515db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:on-cpu
17615db2897SKrishnendu Sadhukhan - Sun Microsystems /self->lt_sleep_duration > FILTER_THRESHOLD &&
17715db2897SKrishnendu Sadhukhan - Sun Microsystems   self->lt_is_block_wakeable != 0/
17815db2897SKrishnendu Sadhukhan - Sun Microsystems {
17915db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sch_delay = 0;
18015db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sleep_duration = 0;
18115db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_is_block_wakeable = 0;
18215db2897SKrishnendu Sadhukhan - Sun Microsystems }
18315db2897SKrishnendu Sadhukhan - Sun Microsystems #endif /* defined(ENABLE_FILTER) */
18415db2897SKrishnendu Sadhukhan - Sun Microsystems 
18515db2897SKrishnendu Sadhukhan - Sun Microsystems /*
18615db2897SKrishnendu Sadhukhan - Sun Microsystems  * Write sleep time to the aggregation.
18715db2897SKrishnendu Sadhukhan - Sun Microsystems  * lt_sleep_duration is the duration between the time when a thread is taken
18815db2897SKrishnendu Sadhukhan - Sun Microsystems  * off the CPU and the time when it is enqueued again.
18915db2897SKrishnendu Sadhukhan - Sun Microsystems  */
19015db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:on-cpu
19115db2897SKrishnendu Sadhukhan - Sun Microsystems /self->lt_sleep_duration != 0/
19215db2897SKrishnendu Sadhukhan - Sun Microsystems {
19315db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->cause = self->lt_stackp > 0 ?
19415db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_cause[self->lt_stackp - 1] : "";
19515db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->priority = self->lt_stackp > 0 ?
19615db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_prio[self->lt_stackp - 1] : 0;
19715db2897SKrishnendu Sadhukhan - Sun Microsystems 
19815db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_count[pid, tid, stack(), this->cause,
19915db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = count();
20015db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_sum[pid, tid, stack(), this->cause,
20115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = sum(self->lt_sleep_duration);
20215db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_max[pid, tid, stack(),  this->cause,
20315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = max(self->lt_sleep_duration);
20415db2897SKrishnendu Sadhukhan - Sun Microsystems 
20515db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_is_block_wakeable = 0;	/* Clear the flag to avoid leak */
20615db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sleep_duration = 0;
20715db2897SKrishnendu Sadhukhan - Sun Microsystems }
20815db2897SKrishnendu Sadhukhan - Sun Microsystems 
20915db2897SKrishnendu Sadhukhan - Sun Microsystems /*
21015db2897SKrishnendu Sadhukhan - Sun Microsystems  * Write time spent in queue to the aggregation.
21115db2897SKrishnendu Sadhukhan - Sun Microsystems  * lt_sch_delay is the interval between the time when a thread becomes
21215db2897SKrishnendu Sadhukhan - Sun Microsystems  * runnable and the time when it is actually on the CPU.
21315db2897SKrishnendu Sadhukhan - Sun Microsystems  */
21415db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:on-cpu
21515db2897SKrishnendu Sadhukhan - Sun Microsystems /self->lt_sch_delay != 0/
21615db2897SKrishnendu Sadhukhan - Sun Microsystems {
21715db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_count[pid, tid, "Wait for available CPU"] = count();
21815db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_sum[pid, tid, "Wait for available CPU"] =
21915db2897SKrishnendu Sadhukhan - Sun Microsystems 	    sum(self->lt_sch_delay);
22015db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_max[pid, tid, "Wait for available CPU"] =
22115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    max(self->lt_sch_delay);
22215db2897SKrishnendu Sadhukhan - Sun Microsystems 
22315db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_sch_delay = 0;
22415db2897SKrishnendu Sadhukhan - Sun Microsystems }
22515db2897SKrishnendu Sadhukhan - Sun Microsystems 
22615db2897SKrishnendu Sadhukhan - Sun Microsystems /*
22715db2897SKrishnendu Sadhukhan - Sun Microsystems  * Probes to track latency caused by spinning on a lock.
22815db2897SKrishnendu Sadhukhan - Sun Microsystems  */
22915db2897SKrishnendu Sadhukhan - Sun Microsystems lockstat:::adaptive-spin
23015db2897SKrishnendu Sadhukhan - Sun Microsystems TRACE_FILTER
23115db2897SKrishnendu Sadhukhan - Sun Microsystems {
23215db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_count[pid, tid, "Adapt. lock spin"] = count();
23315db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_sum[pid, tid, "Adapt. lock spin"] = sum(arg1);
23415db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_max[pid, tid, "Adapt. lock spin"] = max(arg1);
23515db2897SKrishnendu Sadhukhan - Sun Microsystems }
23615db2897SKrishnendu Sadhukhan - Sun Microsystems 
23715db2897SKrishnendu Sadhukhan - Sun Microsystems lockstat:::spin-spin
23815db2897SKrishnendu Sadhukhan - Sun Microsystems TRACE_FILTER
23915db2897SKrishnendu Sadhukhan - Sun Microsystems {
24015db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_count[pid, tid, "Spinlock spin"] = count();
24115db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_sum[pid, tid, "Spinlock spin"] = sum(arg1);
24215db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_max[pid, tid, "Spinlock spin"] = max(arg1);
24315db2897SKrishnendu Sadhukhan - Sun Microsystems }
24415db2897SKrishnendu Sadhukhan - Sun Microsystems 
24515db2897SKrishnendu Sadhukhan - Sun Microsystems /*
24615db2897SKrishnendu Sadhukhan - Sun Microsystems  * Probes to track latency caused by blocking on a lock.
24715db2897SKrishnendu Sadhukhan - Sun Microsystems  */
24815db2897SKrishnendu Sadhukhan - Sun Microsystems lockstat:::adaptive-block
24915db2897SKrishnendu Sadhukhan - Sun Microsystems TRACE_FILTER
25015db2897SKrishnendu Sadhukhan - Sun Microsystems {
25115db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_count[pid, tid, "#Adapt. lock block"] = count();
25215db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_sum[pid, tid, "#Adapt. lock block"] = sum(arg1);
25315db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_max[pid, tid, "#Adapt. lock block"] = max(arg1);
25415db2897SKrishnendu Sadhukhan - Sun Microsystems }
25515db2897SKrishnendu Sadhukhan - Sun Microsystems 
25615db2897SKrishnendu Sadhukhan - Sun Microsystems lockstat:::rw-block
25715db2897SKrishnendu Sadhukhan - Sun Microsystems TRACE_FILTER
25815db2897SKrishnendu Sadhukhan - Sun Microsystems {
25915db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_count[pid, tid, "#RW. lock block"] = count();
26015db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_sum[pid, tid, "#RW. lock block"] = sum(arg1);
26115db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_named_max[pid, tid, "#RW. lock block"] = max(arg1);
26215db2897SKrishnendu Sadhukhan - Sun Microsystems }
26315db2897SKrishnendu Sadhukhan - Sun Microsystems 
26415db2897SKrishnendu Sadhukhan - Sun Microsystems #if defined(ENABLE_SYNCOBJ)
26515db2897SKrishnendu Sadhukhan - Sun Microsystems /*
26615db2897SKrishnendu Sadhukhan - Sun Microsystems  * Probes to track latency caused by synchronization objects.
26715db2897SKrishnendu Sadhukhan - Sun Microsystems  */
26815db2897SKrishnendu Sadhukhan - Sun Microsystems this int stype;
26915db2897SKrishnendu Sadhukhan - Sun Microsystems this unsigned long long wchan;
27015db2897SKrishnendu Sadhukhan - Sun Microsystems this unsigned long long wtime;
27115db2897SKrishnendu Sadhukhan - Sun Microsystems 
27215db2897SKrishnendu Sadhukhan - Sun Microsystems sched:::wakeup
27315db2897SKrishnendu Sadhukhan - Sun Microsystems /*
27415db2897SKrishnendu Sadhukhan - Sun Microsystems  * Currently we are unable to track wakeup from sched, because all its LWP IDs
27515db2897SKrishnendu Sadhukhan - Sun Microsystems  * are zero when we trace it and that makes lt_timestamps unusable.
27615db2897SKrishnendu Sadhukhan - Sun Microsystems  */
27715db2897SKrishnendu Sadhukhan - Sun Microsystems /args[1]->pr_pid != 0 &&
27815db2897SKrishnendu Sadhukhan - Sun Microsystems     lt_timestamps[args[1]->pr_pid, args[0]->pr_lwpid] != 0/
27915db2897SKrishnendu Sadhukhan - Sun Microsystems {
28015db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->stype = args[0]->pr_stype;
28115db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->wchan = args[0]->pr_wchan;
28215db2897SKrishnendu Sadhukhan - Sun Microsystems 	/*
28315db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * We can use lt_timestamps[] here, because
28415db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * wakeup is always fired before enqueue.
28515db2897SKrishnendu Sadhukhan - Sun Microsystems 	 * After enqueue, lt_timestamps[] will be overwritten.
28615db2897SKrishnendu Sadhukhan - Sun Microsystems 	 */
28715db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->wtime = timestamp - lt_timestamps[args[1]->pr_pid,
28815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    args[0]->pr_lwpid];
28915db2897SKrishnendu Sadhukhan - Sun Microsystems 
29015db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_sync_count[args[1]->pr_pid, args[0]->pr_lwpid, this->stype,
29115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->wchan] = count();
29215db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_sync_sum[args[1]->pr_pid, args[0]->pr_lwpid, this->stype,
29315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->wchan] = sum(this->wtime);
29415db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_sync_max[args[1]->pr_pid, args[0]->pr_lwpid, this->stype,
29515db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->wchan] = max(this->wtime);
29615db2897SKrishnendu Sadhukhan - Sun Microsystems }
29715db2897SKrishnendu Sadhukhan - Sun Microsystems #endif /* defined(ENABLE_SYNCOBJ) */
29815db2897SKrishnendu Sadhukhan - Sun Microsystems 
29915db2897SKrishnendu Sadhukhan - Sun Microsystems #else /* !defined(ENABLE_LOW_OVERHEAD) */
30015db2897SKrishnendu Sadhukhan - Sun Microsystems 
30115db2897SKrishnendu Sadhukhan - Sun Microsystems /*
30215db2897SKrishnendu Sadhukhan - Sun Microsystems  * This is the low overhead mode.
30315db2897SKrishnendu Sadhukhan - Sun Microsystems  * In order to reduce the number of instructions executed during each
30415db2897SKrishnendu Sadhukhan - Sun Microsystems  * off-cpu and on-cpu event, we do the following:
30515db2897SKrishnendu Sadhukhan - Sun Microsystems  *
30615db2897SKrishnendu Sadhukhan - Sun Microsystems  *	1. Use sampling and update aggregations only roughly 1/100 times
30715db2897SKrishnendu Sadhukhan - Sun Microsystems  *		(SAMPLE_TIMES).
30815db2897SKrishnendu Sadhukhan - Sun Microsystems  *	2. Do not track anything other than what is needed for "main" window.
30915db2897SKrishnendu Sadhukhan - Sun Microsystems  *	3. Use as few thread local variables as possible.
31015db2897SKrishnendu Sadhukhan - Sun Microsystems  */
31115db2897SKrishnendu Sadhukhan - Sun Microsystems 
31215db2897SKrishnendu Sadhukhan - Sun Microsystems #define SAMPLE_TIMES		100
31315db2897SKrishnendu Sadhukhan - Sun Microsystems #define SAMPLE_THRESHOLD	50000000
31415db2897SKrishnendu Sadhukhan - Sun Microsystems 
31515db2897SKrishnendu Sadhukhan - Sun Microsystems /*
31615db2897SKrishnendu Sadhukhan - Sun Microsystems  * Log timestamp when a thread is off CPU.
31715db2897SKrishnendu Sadhukhan - Sun Microsystems  */
31815db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:off-cpu
31915db2897SKrishnendu Sadhukhan - Sun Microsystems TRACE_FILTER_COND(curlwpsinfo->pr_state == SSLEEP)
32015db2897SKrishnendu Sadhukhan - Sun Microsystems {
32115db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_timestamp = timestamp;
32215db2897SKrishnendu Sadhukhan - Sun Microsystems #if defined(ENABLE_FILTER)
32315db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_is_block_wakeable = curthread->t_flag & T_WAKEABLE;
32415db2897SKrishnendu Sadhukhan - Sun Microsystems #endif /* defined(ENABLE_FILTER) */
32515db2897SKrishnendu Sadhukhan - Sun Microsystems }
32615db2897SKrishnendu Sadhukhan - Sun Microsystems 
32715db2897SKrishnendu Sadhukhan - Sun Microsystems /*
32815db2897SKrishnendu Sadhukhan - Sun Microsystems  * Calculate latency when a thread is actually on the CPU.
32915db2897SKrishnendu Sadhukhan - Sun Microsystems  */
33015db2897SKrishnendu Sadhukhan - Sun Microsystems this int need_skip;
33115db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:on-cpu
33215db2897SKrishnendu Sadhukhan - Sun Microsystems /self->lt_timestamp != 0/
33315db2897SKrishnendu Sadhukhan - Sun Microsystems {
33415db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_timestamp = timestamp - self->lt_timestamp;
33515db2897SKrishnendu Sadhukhan - Sun Microsystems 
33615db2897SKrishnendu Sadhukhan - Sun Microsystems #if defined(ENABLE_FILTER)
33715db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_timestamp =
33815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    (self->lt_timestamp > FILTER_THRESHOLD &&
33915db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_is_block_wakeable != 0) ? 0 : self->lt_timestamp;
34015db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_is_block_wakeable = 0;
34115db2897SKrishnendu Sadhukhan - Sun Microsystems #endif /* defined(ENABLE_FILTER) */
34215db2897SKrishnendu Sadhukhan - Sun Microsystems 
34315db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->need_skip = (self->lt_counter < (SAMPLE_TIMES - 1) &&
34415db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_timestamp <= SAMPLE_THRESHOLD) ? 1 : 0;
34515db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_timestamp = this->need_skip ? 0 : self->lt_timestamp;
34615db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_counter += this->need_skip;
34715db2897SKrishnendu Sadhukhan - Sun Microsystems }
34815db2897SKrishnendu Sadhukhan - Sun Microsystems 
34915db2897SKrishnendu Sadhukhan - Sun Microsystems /*
35015db2897SKrishnendu Sadhukhan - Sun Microsystems  * Track large latency first.
35115db2897SKrishnendu Sadhukhan - Sun Microsystems  */
35215db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:on-cpu
35315db2897SKrishnendu Sadhukhan - Sun Microsystems /self->lt_timestamp > SAMPLE_THRESHOLD/
35415db2897SKrishnendu Sadhukhan - Sun Microsystems {
35515db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->cause = self->lt_stackp > 0 ?
35615db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_cause[self->lt_stackp - 1] : "";
35715db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->priority = self->lt_stackp > 0 ?
35815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_prio[self->lt_stackp - 1] : 0;
35915db2897SKrishnendu Sadhukhan - Sun Microsystems 
36015db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_count[pid, tid, stack(), this->cause,
36115db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = sum(1);
36215db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_sum[pid, tid, stack(), this->cause,
36315db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = sum(self->lt_timestamp);
36415db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_max[pid, tid, stack(), this->cause,
36515db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = max(self->lt_timestamp);
36615db2897SKrishnendu Sadhukhan - Sun Microsystems 
36715db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_timestamp = 0;
36815db2897SKrishnendu Sadhukhan - Sun Microsystems }
36915db2897SKrishnendu Sadhukhan - Sun Microsystems 
37015db2897SKrishnendu Sadhukhan - Sun Microsystems /*
37115db2897SKrishnendu Sadhukhan - Sun Microsystems  * If we fall back to this probe, that means the latency is small and counter
37215db2897SKrishnendu Sadhukhan - Sun Microsystems  * has reached SAMPLE_TIMES.
37315db2897SKrishnendu Sadhukhan - Sun Microsystems  */
37415db2897SKrishnendu Sadhukhan - Sun Microsystems sched::resume:on-cpu
37515db2897SKrishnendu Sadhukhan - Sun Microsystems /self->lt_timestamp != 0/
37615db2897SKrishnendu Sadhukhan - Sun Microsystems {
37715db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->cause = self->lt_stackp > 0 ?
37815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_cause[self->lt_stackp - 1] : "";
37915db2897SKrishnendu Sadhukhan - Sun Microsystems 	this->priority = self->lt_stackp > 0 ?
38015db2897SKrishnendu Sadhukhan - Sun Microsystems 	    self->lt_prio[self->lt_stackp - 1] : 0;
38115db2897SKrishnendu Sadhukhan - Sun Microsystems 
38215db2897SKrishnendu Sadhukhan - Sun Microsystems 	/* Need +1 because lt_counter has not been updated in this cycle. */
38315db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_count[pid, tid, stack(), this->cause,
38415db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = sum(self->lt_counter + 1);
38515db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_sum[pid, tid, stack(), this->cause,
38615db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = sum((self->lt_counter + 1) * self->lt_timestamp);
38715db2897SKrishnendu Sadhukhan - Sun Microsystems 	@lt_call_max[pid, tid, stack(), this->cause,
38815db2897SKrishnendu Sadhukhan - Sun Microsystems 	    this->priority] = max(self->lt_timestamp);
38915db2897SKrishnendu Sadhukhan - Sun Microsystems 
39015db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_timestamp = 0;
39115db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_counter = 0;
39215db2897SKrishnendu Sadhukhan - Sun Microsystems }
39315db2897SKrishnendu Sadhukhan - Sun Microsystems 
39415db2897SKrishnendu Sadhukhan - Sun Microsystems #endif /* !defined(ENABLE_LOW_OVERHEAD) */
39515db2897SKrishnendu Sadhukhan - Sun Microsystems 
39615db2897SKrishnendu Sadhukhan - Sun Microsystems #define	TRANSLATE(entryprobe, returnprobe, cause, priority)		\
39715db2897SKrishnendu Sadhukhan - Sun Microsystems entryprobe								\
39815db2897SKrishnendu Sadhukhan - Sun Microsystems TRACE_FILTER_COND(self->lt_stackp == 0 ||				\
39915db2897SKrishnendu Sadhukhan - Sun Microsystems     (self->lt_stackp < MAX_TAG &&					\
40015db2897SKrishnendu Sadhukhan - Sun Microsystems     self->lt_prio[self->lt_stackp - 1] <= priority) )			\
40115db2897SKrishnendu Sadhukhan - Sun Microsystems {									\
40215db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_prio[self->lt_stackp] = priority;			\
40315db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[self->lt_stackp] = cause;			\
40415db2897SKrishnendu Sadhukhan - Sun Microsystems 	++self->lt_stackp;						\
40515db2897SKrishnendu Sadhukhan - Sun Microsystems }									\
40615db2897SKrishnendu Sadhukhan - Sun Microsystems returnprobe								\
40715db2897SKrishnendu Sadhukhan - Sun Microsystems TRACE_FILTER_COND(self->lt_stackp > 0 &&				\
40815db2897SKrishnendu Sadhukhan - Sun Microsystems     self->lt_cause[self->lt_stackp - 1] == cause)			\
40915db2897SKrishnendu Sadhukhan - Sun Microsystems {									\
41015db2897SKrishnendu Sadhukhan - Sun Microsystems 	--self->lt_stackp;						\
41115db2897SKrishnendu Sadhukhan - Sun Microsystems 	self->lt_cause[self->lt_stackp] = NULL;				\
41215db2897SKrishnendu Sadhukhan - Sun Microsystems }
41315db2897SKrishnendu Sadhukhan - Sun Microsystems 
41415db2897SKrishnendu Sadhukhan - Sun Microsystems /*
41515db2897SKrishnendu Sadhukhan - Sun Microsystems  * Syscalls have a priority of 10. This is to make sure that latency is
41615db2897SKrishnendu Sadhukhan - Sun Microsystems  * traced to one of the syscalls only if nothing else matches.
41715db2897SKrishnendu Sadhukhan - Sun Microsystems  * We put this special probe here because it uses "probefunc" variable instead
41815db2897SKrishnendu Sadhukhan - Sun Microsystems  * of a constant string.
41915db2897SKrishnendu Sadhukhan - Sun Microsystems  */
42015db2897SKrishnendu Sadhukhan - Sun Microsystems 
42115db2897SKrishnendu Sadhukhan - Sun Microsystems TRANSLATE(syscall:::entry, syscall:::return, probefunc, 10)
422