]> sourceware.org Git - systemtap.git/commitdiff
traceio.stp example: check for negative $return
authorJonathan Lebon <jlebon@redhat.com>
Fri, 24 May 2013 14:33:06 +0000 (10:33 -0400)
committerJonathan Lebon <jlebon@redhat.com>
Fri, 24 May 2013 21:21:56 +0000 (17:21 -0400)
The I/O reads and writes should only be counted when $return is
nonnegative. A negative $result occurs if an error was met (e.g.
EAGAIN = -11).

We could have instead here used the bytes_read/written variables
provided by the tapset, but this example demonstrates the use of
local vars and is also consistent with the disktop.stp example.

doc/SystemTap_Beginners_Guide/en-US/Useful_Scripts-traceio.xml
testsuite/systemtap.examples/io/traceio.stp

index 6da1e2b20fc9df633dd36d6037eb4d499fed24c4..c12fac15ec1587fed67f0e3d53716d626eb8a5f6 100644 (file)
@@ -106,27 +106,42 @@ pam_timestamp_c r:      138 KiB w:        0 KiB
 <!--
 global reads, writes, total_io
 
-probe kernel.function("vfs_read").return {
-reads[execname()] += $return
+probe vfs.read.return {
+  if ($return > 0) {
+    reads[pid(),execname()] += $return
+    total_io[pid(),execname()] += $return
+  }
 }
 
-probe kernel.function("vfs_write").return {
-writes[execname()] += $return
+probe vfs.write.return {
+  if ($return > 0) {
+    writes[pid(),execname()] += $return
+    total_io[pid(),execname()] += $return
+  }
+}
+
+function humanreadable(bytes) {
+  if (bytes > 1024*1024*1024) {
+    return sprintf("%d GiB", bytes/1024/1024/1024)
+  } else if (bytes > 1024*1024) {
+    return sprintf("%d MiB", bytes/1024/1024)
+  } else if (bytes > 1024) {
+    return sprintf("%d KiB", bytes/1024)
+  } else {
+    return sprintf("%d   B", bytes)
+  }
 }
 
 probe timer.s(1) {
-foreach (p in reads)
-total_io[p] += reads[p]
-foreach (p in writes)
-total_io[p] += writes[p]
-foreach(p in total_io- limit 10)
-printf("%15s r: %8d KiB w: %8d KiB\n",
-p, reads[p]/1024,
-writes[p]/1024)
-printf("\n")
-# Note we don't zero out reads, writes and total_io,
-# so the values are cumulative since the script started.
-}-->
+  foreach([p,e] in total_io- limit 10)
+    printf("%8d %15s r: %12s w: %12s\n",
+           p, e, humanreadable(reads[p,e]),
+           humanreadable(writes[p,e]))
+  printf("\n")
+  # Note we don't zero out reads, writes and total_io,
+  # so the values are cumulative since the script started.
+}
+-->
 
 </section>
 
index 875000cb8e42d958898c35a54e8b1362c2f4ae79..4dcb155c3f1dd17ee2a73762f50691a4be5b4f60 100755 (executable)
 global reads, writes, total_io
 
 probe vfs.read.return {
-  reads[pid(),execname()] += $return
-  total_io[pid(),execname()] += $return
+  if ($return > 0) {
+    reads[pid(),execname()] += $return
+    total_io[pid(),execname()] += $return
+  }
 }
 
 probe vfs.write.return {
-  writes[pid(),execname()] += $return
-  total_io[pid(),execname()] += $return
+  if ($return > 0) {
+    writes[pid(),execname()] += $return
+    total_io[pid(),execname()] += $return
+  }
 }
 
 function humanreadable(bytes) {
This page took 0.03603 seconds and 5 git commands to generate.