This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch 2/2] Enhancements to vfs.stp (with minor modifications)


This patch provides enhancements to probe several significant VFS subsystem related
functions apart from providing additional worker C routines.

Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
Signed-off-by: Mike Mason <mmlnx@us.ibm.com>
---
 tapset/vfs.stp |  297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 291 insertions(+), 6 deletions(-)

Index: systemtap/tapset/vfs.stp
===================================================================
--- systemtap.orig/tapset/vfs.stp
+++ systemtap/tapset/vfs.stp
@@ -57,6 +57,18 @@ function __page_ino:long (page:long) %{ 
 	CATCH_DEREF_FAULT();
 %}
 
+function __address_inode:long (page:long) %{ /* pure */
+	struct page *page = (struct page *)(long)THIS->page;
+	struct address_space *mapping =
+			(struct address_space *)(long)THIS;
+	if (mapping == NULL) {
+		THIS->__retvalue = -1;
+	} else {
+		THIS->__retvalue = (long)kread(&(mapping->host));
+	}
+	CATCH_DEREF_FAULT();
+%}
+
 function __page_dev:long (page:long) %{ /* pure */
 	struct page *page = (struct page *)(long)THIS->page;
 	struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
@@ -152,11 +164,47 @@ function __file_filename:string (file:lo
 	CATCH_DEREF_FAULT();
 %}
 
+function __inode_num:long(file:long)
+%{
+	struct file *file = NULL;
+	struct dentry *dentry = NULL;
+	struct inode *inode = NULL;
+
+	file = (struct file *)(long)THIS->file;
+	dentry = file? kread(&(file->f_dentry)) : NULL;
+	inode = dentry? kread(&(dentry->d_inode)) : NULL;
+	THIS->__retvalue = inode? (long)(kread(&(inode->i_ino))) : 0;
+	CATCH_DEREF_FAULT();
+%}
+
+function _get_fopv_size:long (iov:long, nr_segs:long)
+%{
+	struct iovec *iovp = (struct iovec *)(long)THIS->iov;
+	if (iovp) {
+		int i;
+		THIS->__retvalue = 0;
+		for (i = 0 ; i < THIS->nr_segs ; i++)
+			THIS->__retvalue += kread(&(iovp[i].iov_len));
+	} else
+		THIS->__retvalue = -1;
+
+	CATCH_DEREF_FAULT();
+%}
+
+function _dev_minor:long (dev:long) %{ /* pure */
+	THIS->__retvalue = (long)MINOR((dev_t)THIS->dev);
+%}
+
+function _dev_major:long (dev:long) %{ /* pure */
+	THIS->__retvalue = (long)MAJOR((dev_t)THIS->dev);
+%}
+
 probe generic.fop.llseek = kernel.function ("generic_file_llseek")
 {
 	dev = __file_dev($file)
 	devname = __find_bdevname(dev, __file_bdev($file))
 	ino = __file_ino($file)
+	file = $file
 
 	offset = $offset
 	origin = $origin
@@ -168,11 +216,19 @@ probe generic.fop.llseek = kernel.functi
 probe generic.fop.llseek.return = kernel.function ("generic_file_llseek").return
 {
 	name = "generic_file_llseek"
-	retstr = returnstr(1)
+	name = "generic_file_llseek"
+	retstr = $return
+	file = $file
+	offset = $offset
+	origin = $origin
+
+	error = $return < 0 ? $return : 0
+	error_str = error ? errno_str(error) : ""
 }
 
 probe generic.fop.aio_read = kernel.function ("generic_file_aio_read")
 {
+	file = $iocb->ki_filp
 	dev = __file_dev($iocb->ki_filp)
 	devname = __find_bdevname(dev, __file_bdev($iocb->ki_filp))
 	ino = __file_ino($iocb->ki_filp)
@@ -194,9 +250,15 @@ probe generic.fop.aio_read = kernel.func
 }
 probe generic.fop.aio_read.return = kernel.function ("generic_file_aio_read").return
 {
+	file = $iocb->ki_filp
+	nr_segs = $nr_segs
 	name = "generic_file_aio_read"
 	retstr = sprintf("%d", $return)
 
+	bytes_read = $return > 0 ? $return : 0
+	error = $return < 0 ? $return : 0
+ 	error_str = error ? errno_str(error) : ""
+
 	if ($return > 0) {
 		size = $return
 		units = "bytes"
@@ -205,6 +267,7 @@ probe generic.fop.aio_read.return = kern
 
 probe generic.fop.aio_write = kernel.function ("generic_file_aio_write")
 {
+	file = $iocb->ki_filp
 	dev = __file_dev($iocb->ki_filp)
 	devname = __find_bdevname(dev, __file_bdev($iocb->ki_filp))
 	ino = __file_ino($iocb->ki_filp)
@@ -226,6 +289,7 @@ probe generic.fop.aio_write = kernel.fun
 }
 probe generic.fop.aio_write.return = kernel.function ("generic_file_aio_write").return
 {
+	file = $iocb->ki_filp
 	name = "generic_file_aio_write"
 	retstr = sprintf("%d", $return)
 
@@ -280,9 +344,14 @@ probe generic.fop.writev = kernel.functi
 }
 probe generic.fop.writev.return = kernel.function ("generic_file_writev").return ?
 {
+	file = $file
 	name = "generic_file_writev"
 	retstr = sprintf("%d", $return)
 
+	bytes_written = $return > 0 ? $return : 0
+	error = $return < 0 ? $return : 0
+	error_str = error ? errno_str(error) : ""
+
 	if ($return > 0) {
 		size = $return
 		units = "bytes"
@@ -296,6 +365,7 @@ probe generic.fop.writev.return = kernel
    add filemap_nopage, filemap_populate */
 probe generic.fop.mmap = kernel.function ("generic_file_mmap")
 {
+	file = $file
 	dev = __file_dev($file)
 	devname = __find_bdevname(dev, __file_bdev($file))
 	ino = __file_ino($file)
@@ -309,8 +379,12 @@ probe generic.fop.mmap = kernel.function
 }
 probe generic.fop.mmap.return = kernel.function ("generic_file_mmap").return
 {
+	file = $file
 	name = "generic_file_mmap"
 	retstr = sprintf("%d", $return)
+
+	error = $return < 0 ? $return : 0
+	error_str = error ? errno_str(error) : ""
 }
 
 probe generic.fop.open = kernel.function ("generic_file_open")
@@ -365,6 +439,7 @@ probe generic.fop.splice_read = kernel.f
 	dev = __file_dev($in)
 	devname = __find_bdevname(dev, __file_bdev($in))
 	ino = __file_ino($in)
+	file = $in
 
 	len = $len
 	flags = $flags
@@ -379,9 +454,17 @@ probe generic.fop.splice_read.return = k
 {
 	name = "generic_file_splice_read"
 	retstr = sprintf("%d", $return)
+	file = $in
+	ino = __file_ino($in)
+	dev_major = _dev_major(_dev)
+	dev_minor = _dev_minor(_dev)
 
-	if ($return > 0) {
-		size = $return
+	ret = $return
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+
+	if (error) {
+		size = ret
 		units = "bytes"
 	}
 }
@@ -391,6 +474,7 @@ probe generic.fop.splice_write = kernel.
 	dev = __file_dev($out)
 	devname = __find_bdevname(dev, __file_bdev($out))
 	ino = __file_ino($out)
+	file = $out
 
 	len = $len
 	flags = $flags
@@ -406,7 +490,12 @@ probe generic.fop.splice_write.return = 
 	name = "generic_file_splice_write"
 	retstr = sprintf("%d", $return)
 
-	if ($return > 0) {
+	file = $out
+
+	error = $return < 0 ? $return : 0
+	error_str = error ? errno_str(error) : ""
+
+	if (error) {
 		size = $return
 		units = "bytes"
 	}
@@ -499,12 +588,19 @@ probe vfs.do_sync_read = kernel.function
 
 	size = len
 	units = "bytes"
+	bytes_to_read = len
 }
 probe vfs.do_sync_read.return = kernel.function ("do_sync_read").return
 {
 	name = "do_sync_read"
 	retstr = sprintf("%d", $return)
 
+	bytes_to_read = $len
+	ret = $return
+	bytes_read = ret > 0 ? ret : 0
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+
 	if ($return > 0) {
 		size = $return
 		units = "bytes"
@@ -520,6 +616,7 @@ probe vfs.do_sync_write = kernel.functio
 	len = $len
 	pos = ppos_pos($ppos)
 	buf = $buf
+	bytes_to_write = len
 
 	name = "do_sync_write"
 	argstr = sprintf("%d, %d , %p", len, pos, buf)
@@ -532,8 +629,15 @@ probe vfs.do_sync_write.return = kernel.
 	name = "do_sync_write"
 	retstr = sprintf("%d", $return)
 
-	if ($return > 0) {
-		size = $return
+	bytes_to_write = $len
+	ppos = $ppos
+	ret = $return
+	bytes_written = ret > 0 ? ret : 0
+	error = $return < 0 ? ret : 0
+ 	error_str = error ? errno_str(error) : ""
+
+	if (error) {
+		size = ret
 		units = "bytes"
 	}
 }
@@ -682,3 +786,185 @@ probe vfs.remove_from_page_cache.return 
 	retstr = sprintf("N/A")
 }
 
+probe vfs.read = kernel.function ("vfs_read")
+{
+	file = $file
+	pos = $pos
+	buf = $buf
+	bytes_to_read = $count
+}
+
+probe vfs.read.return = kernel.function ("vfs_read").return
+{
+	file = $file
+	pos = $pos
+	buf = $buf
+	bytes_to_read = $count
+
+	ret = $return
+	bytes_read = ret > 0 ? ret : 0
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+}
+
+probe vfs.readv = kernel.function ("vfs_readv")
+{
+	file = $file
+	pos = $pos
+	vec = $vec
+	vlen = $vlen
+	bytes_to_read = _get_fopv_size($vec, $vlen)
+}
+
+probe vfs.readv.return = kernel.function ("vfs_readv").return
+{
+	file = $file
+	pos = $pos
+	vec = $vec
+	vlen = $vlen
+	bytes_to_read = _get_fopv_size($vec, $vlen)
+
+	ret = $return
+	bytes_read = ret > 0 ? ret : 0
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+}
+
+probe vfs.write = kernel.function ("vfs_write")
+{
+	file = $file
+	pos = $pos
+	buf = $buf
+	bytes_to_write = $count
+}
+
+probe vfs.write.return = kernel.function ("vfs_write").return
+{
+	file = $file
+	pos = $pos
+	buf = $buf
+	bytes_to_write = $count
+
+	ret = $return
+	bytes_written = ret > 0 ? ret : 0
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+}
+
+probe vfs.writev = kernel.function("vfs_writev")
+{
+	file = $file
+	pos = $pos
+	vlen = $vlen
+	vec = $vec
+	bytes_to_write = _get_fopv_size($vec, $vlen)
+}
+
+probe vfs.writev.return = kernel.function ("vfs_writev").return
+{
+	file = $file
+	pos = $pos
+	vlen = $vlen
+	vec = $vec
+	bytes_to_write = _get_fopv_size($vec, $vlen)
+
+	ret = $return
+	bytes_written = ret > 0 ? ret : 0
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+}
+
+probe _vfs.generic_file_readonly_mmap =
+kernel.function("generic_file_readonly_mmap")
+{
+	file = $file
+	vma = $vma
+}
+
+probe _vfs.generic_file_readonly_mmap.return = kernel.function ("generic_file_readonly_mmap").return
+{
+	file = $file
+	vma = $vma
+
+	ret = $return
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+}
+
+probe _vfs.generic_block_bmap = kernel.function ("generic_block_bmap")
+{
+	mapping = $mapping
+	block = $block
+	get_block = $get_block
+}
+
+probe _vfs.generic_commit_write = kernel.function ("generic_commit_write")
+{
+	file = $file
+	page = $page
+	from = $from
+	to = $to
+}
+
+probe _vfs.block_prepare_write = kernel.function ("__block_prepare_write")
+{
+	_inode = $inode
+	page = $page
+	write_from = $from
+	write_upto = $to
+}
+
+probe _vfs.block_prepare_write.return = kernel.function("__block_prepare_write").return
+{
+	_inode = $inode
+	page = $page
+	write_from = $from
+	write_upto = $to
+
+	ret = $return
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+}
+
+probe _vfs.block_write_begin = kernel.function ("block_write_begin")
+{
+	file = $file
+	pos = $pos
+	len = $len
+	flags = $flags
+
+	_inode = __address_inode($mapping)
+}
+
+probe _vfs.block_write_begin.return = kernel.function ("block_write_begin").return
+{
+	file = $file
+	pos = $pos
+	len = $len
+	flags = $flags
+
+	_inode = __address_inode($mapping)
+
+	ret = $return
+	error = ret < 0 ? ret : 0
+	error_str = error ? errno_str(error) : ""
+}
+
+probe _vfs.block_write_end = kernel.function ("block_write_end")
+{
+	file = $file
+	pos = $pos
+	len = $len
+	page = $page
+	_inode = __address_inode($mapping)
+}
+
+probe _vfs.block_write_end.return = kernel.function ("block_write_end").return
+{
+	file = $file
+	pos = $pos
+	len = $len
+	page = $page
+	_inode = __address_inode($mapping)
+	ret = $return
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]