Sophie

Sophie

distrib > Fedora > 13 > i386 > media > os > by-pkgid > 95299258dbdf9a86cefd89b97c0d81e5 > files > 284

systemtap-1.2-1.fc13.i686.rpm

#!/usr/bin/stap

/*
 * Copyright (C) 2006-2007 Red Hat Inc.
 * 
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU General Public License v.2.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Print out the amount of time spent in the nanosleep and compat_nanosleep
 * systemcalls. This can help find which processes are waking based on time
 * rather than some real event than needs to be handled.
 *
 * Format is:
 * 12799538 3389 (xchat) nanosleep: 9547
 * 12846944 2805 (NetworkManager) nanosleep: 100964
 * 12947924 2805 (NetworkManager) nanosleep: 100946
 * 13002925 4757 (sleep) nanosleep: 13000717
 */

global start
global entry_nanosleep

function timestamp:long() {
  return gettimeofday_us() - start
}

function proc:string() {
  return sprintf("%d (%s)", pid(), execname())
}

probe begin {
 start = gettimeofday_us()
}

probe syscall.nanosleep {
  t = gettimeofday_us(); p = pid()
  entry_nanosleep[p] = t
}

probe syscall.nanosleep.return {
  t = gettimeofday_us(); p = pid()
  elapsed_time = t - entry_nanosleep[p]
  printf("%d %s nanosleep: %d\n",  timestamp(), proc(), elapsed_time)
  delete entry_nanosleep[p]
}

probe syscall.compat_nanosleep ? {
  t = gettimeofday_us(); p = pid()
  entry_nanosleep[p] = t
}

probe syscall.compat_nanosleep.return ? {
  t = gettimeofday_us(); p = pid()
  elapsed_time = t - entry_nanosleep[p]
  printf("%d %s compat_nanosleep: %d\n",  timestamp(), proc(), elapsed_time)
  delete entry_nanosleep[p]
}