public inbox for systemtap@sourceware.org
 help / color / mirror / Atom feed
From: William Cohen <wcohen@redhat.com>
To: SystemTAP <systemtap@sources.redhat.com>
Subject: Simplifying examples by improving vfs tapset
Date: Mon, 27 Oct 2008 14:54:00 -0000	[thread overview]
Message-ID: <4905D5F6.60807@redhat.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 1165 bytes --]

I am looking through the examples being used in the SystemTap
beginners guide and trying to streamline them a bit.  One
simplification is the minimize the use of raw kernel.function() and
module().function() probes by using tapset aliases instead.  Probing
the raw C functions is not so meaningful for average users. Plus they
don't know what arguments might be available at those functions. The
tapsets should minimize raw functions. When looking to convert some of
the probes to use the vfs tapsets, I noticed that a number of the vfs
tapsets don't have dev or devname defined, e.g. vfs.read{.return} and
vfs.write{.return}. This result in ugly code such as in disktop.stp
probe handlers:

		dev = __file_dev($file)
		devname = __find_bdevname(dev,__file_bdev($file))


The dev and devname should be consistently available for vfs
tapset. This would eliminate the need for internal systemtap tapset
functions to be used in the probe handlers and would make examples
such as disktop.stp simpler. There appears to be ugliness in
systemtap.examples/io/iostat-scsi.stp.

Attached is the suggested patch to for the vfs.stp stapset and the disktop.stp 
example.

-Will

[-- Attachment #2: vfs.diff --]
[-- Type: text/x-patch, Size: 3316 bytes --]

diff --git a/tapset/vfs.stp b/tapset/vfs.stp
index 7f2312d..2ac8256 100644
--- a/tapset/vfs.stp
+++ b/tapset/vfs.stp
@@ -800,6 +800,8 @@ probe vfs.read = kernel.function ("vfs_read")
 	pos = $pos
 	buf = $buf
 	bytes_to_read = $count
+	dev = __file_dev($file)
+	devname = __find_bdevname(dev, __file_bdev($file))
 }
 
 probe vfs.read.return = kernel.function ("vfs_read").return
@@ -808,6 +810,8 @@ probe vfs.read.return = kernel.function ("vfs_read").return
 	pos = $pos
 	buf = $buf
 	bytes_to_read = $count
+	dev = __file_dev($file)
+	devname = __find_bdevname(dev, __file_bdev($file))
 
 	ret = $return
 	bytes_read = ret > 0 ? ret : 0
@@ -844,6 +848,8 @@ probe vfs.write = kernel.function ("vfs_write")
 	pos = $pos
 	buf = $buf
 	bytes_to_write = $count
+	dev = __file_dev($file)
+	devname = __find_bdevname(dev, __file_bdev($file))
 }
 
 probe vfs.write.return = kernel.function ("vfs_write").return
@@ -852,6 +858,8 @@ probe vfs.write.return = kernel.function ("vfs_write").return
 	pos = $pos
 	buf = $buf
 	bytes_to_write = $count
+	dev = __file_dev($file)
+	devname = __find_bdevname(dev, __file_bdev($file))
 
 	ret = $return
 	bytes_written = ret > 0 ? ret : 0
diff --git a/testsuite/systemtap.examples/io/disktop.stp b/testsuite/systemtap.examples/io/disktop.stp
index e2c4fc3..20462f0 100755
--- a/testsuite/systemtap.examples/io/disktop.stp
+++ b/testsuite/systemtap.examples/io/disktop.stp
@@ -16,9 +16,6 @@ global read_bytes,write_bytes
 
 probe vfs.read.return {
 	if ($return>0) {
-		dev = __file_dev($file)
-		devname = __find_bdevname(dev,__file_bdev($file))
-
 		if (devname!="N/A") {/*skip read from cache*/
 			io_stat[pid(),execname(),uid(),ppid(),"R"] += $return
 			device[pid(),execname(),uid(),ppid(),"R"] = devname
@@ -29,9 +26,6 @@ probe vfs.read.return {
 
 probe vfs.write.return {
 	if ($return>0) {
-		dev = __file_dev($file)
-		devname = __find_bdevname(dev,__file_bdev($file))
-
 		if (devname!="N/A") { /*skip update cache*/
 			io_stat[pid(),execname(),uid(),ppid(),"W"] += $return
 			device[pid(),execname(),uid(),ppid(),"W"] = devname
@@ -43,16 +37,21 @@ probe vfs.write.return {
 probe timer.ms(5000) {
 	/* skip non-read/write disk */
 	if (read_bytes+write_bytes) {
-
-		printf("\n%-25s, %-8s%4dKb/sec, %-7s%6dKb, %-7s%6dKb\n\n",ctime(gettimeofday_s()),"Average:",
-      		((read_bytes+write_bytes)/1024)/5,"Read:",read_bytes/1024,"Write:",write_bytes/1024)
+		printf("\n%-25s, %-8s%4dKb/sec, %-7s%6dKb, %-7s%6dKb\n\n",
+				 ctime(gettimeofday_s()),"Average:",
+      		((read_bytes+write_bytes)/1024)/5,"Read:",
+				read_bytes/1024,"Write:",write_bytes/1024)
 
 		/* print header */
-		printf("%8s %8s %8s %25s %8s %4s %12s\n","UID","PID","PPID","CMD","DEVICE","T","BYTES")
+		printf("%8s %8s %8s %25s %8s %4s %12s\n",
+			    "UID","PID","PPID","CMD","DEVICE","T","BYTES")
 	}
 	/* print top ten I/O */
 	foreach ([process,cmd,userid,parent,action] in io_stat- limit 10)
-	  printf("%8d %8d %8d %25s %8s %4s %12d\n",userid,process,parent,cmd,device[process,cmd,userid,parent,action],action,io_stat[process,cmd,userid,parent,action])
+	  printf("%8d %8d %8d %25s %8s %4s %12d\n",
+	  	      userid,process,parent,cmd,
+		      device[process,cmd,userid,parent,action],
+		      action,io_stat[process,cmd,userid,parent,action])
 
 	/* clear data */
 	delete io_stat

             reply	other threads:[~2008-10-27 14:54 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-10-27 14:54 William Cohen [this message]
2008-10-28 15:40 ` Jeff Moyer
2008-11-10 17:58   ` William Cohen
2008-11-10 18:23     ` Jeff Moyer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4905D5F6.60807@redhat.com \
    --to=wcohen@redhat.com \
    --cc=systemtap@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).