#!/usr/bin/stap --all-modules # Copyright (C) 2011 Red Hat, Inc. # Written by William Cohen # # A little script to give an idea what periodic things are running on # the system global last_expire, period, funct, data probe kernel.trace("timer_expire_entry") { old_expire = last_expire[$timer] new_expire = gettimeofday_us() if (old_expire) { elapsed = new_expire - old_expire period[$timer] <<< elapsed funct[$timer] = $timer->function data[$timer] = $timer->data } last_expire[$timer] = new_expire } probe end { printf("#%-16s %-35s %12s %10s\n", "timer", "function", "period(us)", "count") # print out the various timers firing foreach([timer] in period-) { fname = symname(funct[timer]) if (fname == "process_timeout") { fname = sprintf("%s(%d)", kernel_string_n(@cast(data[timer], "struct task_struct")->comm, 16), @cast(data[timer], "struct task_struct")->pid) } else if (fname == "delayed_work_timer_fn") { fname = sprintf("%s[dq]", symname(@cast(data[timer], "struct delayed_work")->work->func)) } printf("%16p %-35s %12d %10d\n", timer, fname, @avg(period[timer]), @count(period[timer])) } }