blob: 143fbe1cdcee07973575d3a96ff491d040bf821f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#! /usr/bin/env stap
function time () { return gettimeofday_ms() }
global time_name = "ms"
global boredom = 10 # in time units
global name, back, backtime, bored
/* Note: the order that the probes are listed should not matter.
However, the following order for
probe kernel.function("wait_for_completion").return and
probe kernel.function("wait_for_completion").call
avoids have the kretprobe stuff in the backtrace.
for more information see:
http://sources.redhat.com/bugzilla/show_bug.cgi?id=6436
*/
probe kernel.function("wait_for_completion").return
{
t=tid()
if ([t] in bored) {
patience = time() - backtime[t]
printf ("thread %d (%s) bored for %d %s\n",
t, name[t], patience, time_name)
}
delete bored[t]
delete back[t]
delete name[t]
delete backtime[t]
}
probe kernel.function("wait_for_completion").call
{
t=tid()
back[t]=backtrace()
name[t]=execname()
backtime[t]=time()
delete bored[t]
}
probe timer.profile {
foreach (tid+ in back) {
if ([tid] in bored) continue
patience = time() - backtime[tid]
if (patience >= boredom) {
printf ("thread %d (%s) impatient after %d %s\n",
tid, name[tid], patience, time_name)
print_stack (back[tid])
printf ("\n")
bored[tid] = 1 # defer further reports to wakeup
}
}
}
|