This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: Simplifying examples by improving vfs tapset
- From: Jeff Moyer <jmoyer at redhat dot com>
- To: systemtap at sourceware dot org
- Date: Tue, 28 Oct 2008 11:39:33 -0400
- Subject: Re: Simplifying examples by improving vfs tapset
- References: <4905D5F6.60807@redhat.com>
William Cohen <wcohen@redhat.com> writes:
> 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
> 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
What about readv and writev? I had modified my local copy of
disktop.stp to take these into account (hooking into do_readv_writev).
I will post those updates if you like, once I figure out why I ran into
a problem with the array assignments. (I had to read from the io_stat
array before writing to it, otherwise the written values didn't show
up.)
One other improvement that could be made to the script is AIO support.
Cheers,
Jeff