home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.parl.clemson.edu
/
2015-02-07.ftp.parl.clemson.edu.tar
/
ftp.parl.clemson.edu
/
pub
/
pvfs2
/
orangefs-2.8.3-20110323.tar.gz
/
orangefs-2.8.3-20110323.tar
/
orangefs
/
doc
/
coding
/
valgrind
< prev
Wrap
Text File
|
2004-04-13
|
4KB
|
99 lines
#
# 8 Dec 2003
#
Using Valgrind with pvfs2-client and pvfs2-client-core
First, get PVFS2 ready:
. Build pvfs2 with the --with-kernel option
. Build pvfs2.ko
. load pvfs2.ko
Communication with the pvfs2 kernel module happens through ioctls, which
valgrind will complain about. To fix that, apply the patch at the end of this
file.
cd /path/to/valgrind/src
patch -p1 < /path/to/this/file
Configure, build, and install valgrind as you normally would
pvfs2-client-core reads from a device node, so you'll have to run valgrind as
root:
cd /path/to/pvfs2/build/directory
valgrind --trace-children=yes \
./src/apps/kernel/linux-2.6/pvfs2-client -f \
-p ./src/apps/kernel/linux-2.6/pvfs2-client-core
As of this writing, things *still* won't work well. you'll get a message about
a "short message" from the device. since we seem to run into this short read
only when running under valgrind, we probably aren't going to spend a lot of
time making the pvfs2 device handle short reads. Patches accepted, though :>
Here's the valgrind patch:
diff -burpN valgrind-2.0.0/coregrind/vg_syscalls.c valgrind-2.0.0.pvfs_ioctl/coregrind/vg_syscalls.c
--- valgrind-2.0.0/coregrind/vg_syscalls.c Mon Nov 3 13:15:04 2003
+++ valgrind-2.0.0.pvfs_ioctl/coregrind/vg_syscalls.c Mon Dec 8 15:04:45 2003
@@ -2465,6 +2465,32 @@ void VG_(perform_assumed_nonblocking_sys
KERNEL_DO_SYSCALL(tid,res);
break;
+
+ case PVFS_DEV_GET_MAGIC:
+ SYSCALL_TRACK(pre_mem_write, tid, "ioctl(PVFS_DEV_GET_MAGIC)", arg3, sizeof(int32_t));
+ KERNEL_DO_SYSCALL(tid,res);
+ if (!VG_(is_kerror)(res) && res == 0)
+ VG_TRACK(post_mem_write,arg3, sizeof(int32_t));
+ break;
+ case PVFS_DEV_GET_MAX_UPSIZE:
+ SYSCALL_TRACK(pre_mem_write, tid, "ioctl(PVFS_DEV_GET_MAX_UPSIZE)", arg3, sizeof(int32_t));
+ KERNEL_DO_SYSCALL(tid,res);
+ if (!VG_(is_kerror)(res) && res == 0)
+ VG_TRACK(post_mem_write,arg3, sizeof(int32_t));
+ break;
+
+ case PVFS_DEV_GET_MAX_DOWNSIZE:
+ SYSCALL_TRACK(pre_mem_write, tid, "ioctl(PVFS_DEV_GET_MAX_DOWNSIZE)", arg3, sizeof(int32_t));
+ KERNEL_DO_SYSCALL(tid,res);
+ if (!VG_(is_kerror)(res) && res == 0)
+ VG_TRACK(post_mem_write,arg3, sizeof(int32_t));
+ break;
+ case PVFS_DEV_MAP:
+ SYSCALL_TRACK(pre_mem_write, tid, "ioctl(PVFS_DEV_MAP)", arg3, sizeof(struct PVFS_dev_map_desc));
+ KERNEL_DO_SYSCALL(tid,res);
+ if (!VG_(is_kerror)(res) && res == 0)
+ VG_TRACK(post_mem_write,arg3, sizeof(struct PVFS_dev_map_desc));
+ break;
/* We don't have any specific information on it, so
try to do something reasonable based on direction and
size bits. The encoding scheme is described in
diff -burpN valgrind-2.0.0/coregrind/vg_unsafe.h valgrind-2.0.0.pvfs_ioctl/coregrind/vg_unsafe.h
--- valgrind-2.0.0/coregrind/vg_unsafe.h Tue Nov 4 17:18:40 2003
+++ valgrind-2.0.0.pvfs_ioctl/coregrind/vg_unsafe.h Mon Dec 8 15:04:05 2003
@@ -89,6 +89,19 @@
#include <sys/poll.h>
+/* PVFS2: some defines lifed from the internal header files */
+#define PVFS_DEV_GET_MAGIC 1
+#define PVFS_DEV_GET_MAX_UPSIZE 2
+#define PVFS_DEV_GET_MAX_DOWNSIZE 3
+#define PVFS_DEV_MAP 4
+
+/* describes memory regions to map in the PVFS_DEV_MAP ioctl */
+struct PVFS_dev_map_desc
+{
+ void* ptr;
+ int size;
+};
+
/*--------------------------------------------------------------------*/
/*--- end vg_unsafe.h ---*/