#!/usr/bin/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 } } }