File: sleepingBeauties.stp

package info (click to toggle)
systemtap 5.1-5
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 47,964 kB
  • sloc: cpp: 80,838; ansic: 54,757; xml: 49,725; exp: 43,665; sh: 11,527; python: 5,003; perl: 2,252; tcl: 1,312; makefile: 1,006; javascript: 149; lisp: 105; awk: 101; asm: 91; java: 70; sed: 16
file content (55 lines) | stat: -rwxr-xr-x 1,369 bytes parent folder | download | duplicates (7)
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
#! /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://sourceware.org/bugzilla/show_bug.cgi?id=6436
*/


probe kernel.function("wait_for_completion").return
{
  if ([tid()] in bored) {
    patience = time() - backtime[tid()]
    printf ("thread %d (%s) bored for %d %s\n", 
            tid(), name[tid()], patience, time_name)
  }

  delete bored[tid()]
  delete back[tid()]
  delete name[tid()]
  delete backtime[tid()]
}


probe kernel.function("wait_for_completion").call
{ 
  back[tid()]=backtrace()
  name[tid()]=execname()
  backtime[tid()]=time()
  delete bored[tid()]
}


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_syms (back[tid])
      printf ("\n")
      bored[tid] = 1 # defer further reports to wakeup
    }
  }
}