summaryrefslogtreecommitdiffstats
path: root/tapset
diff options
context:
space:
mode:
Diffstat (limited to 'tapset')
-rw-r--r--tapset/ansi.stp94
-rw-r--r--tapset/aux_syscalls.stp46
-rw-r--r--tapset/context.stp33
-rw-r--r--tapset/ctime.stp27
-rw-r--r--tapset/ioblock.stp214
-rw-r--r--tapset/ioscheduler.stp191
-rw-r--r--tapset/networking.stp4
-rw-r--r--tapset/nfs.stp115
-rw-r--r--tapset/nfs_proc.stp52
9 files changed, 640 insertions, 136 deletions
diff --git a/tapset/ansi.stp b/tapset/ansi.stp
index 0152fb37..ea5376ae 100644
--- a/tapset/ansi.stp
+++ b/tapset/ansi.stp
@@ -9,62 +9,126 @@
# Reference: http://en.wikipedia.org/wiki/ANSI_escape_code
#
+/**
+ * sfunction ansi_clear_screen - Move cursor to top left and clear screen.
+ *
+ * Description: Sends ansi code for moving cursor to top left and then the
+ * ansi code for clearing the screen from the cursor position to the end.
+ **/
function ansi_clear_screen() {
print("\033[1;1H\033[J")
}
-# Foreground colors | Background colors
-# Black 30 | Black 40
-# Blue 34 | Red 41
-# Green 32 | Green 42
-# Cyan 36 | Yellow 43
-# Red 31 | Blue 44
-# Purple 35 | Magenta 45
-# Brown 33 | Cyan 46
-# Light Gray 37 | White 47
+/**
+ * sfunction ansi_set_color - Set the ansi Select Graphic Rendition mode.
+ * @fg: Foreground color to set.
+ *
+ * Description: Sends ansi code for Select Graphic Rendition mode for the
+ * given forground color. Black (30), Blue (34), Green (32), Cyan (36),
+ * Red (31), Purple (35), Brown (33), Light Gray (37).
+ */
function ansi_set_color(fg:long) {
printf("\033[%dm", fg)
}
+/**
+ * sfunction ansi_set_color2 - Set the ansi Select Graphic Rendition mode.
+ * @fg: Foreground color to set.
+ * @bg: Background color to set.
+ *
+ * Description: Sends ansi code for Select Graphic Rendition mode for the
+ * given forground color, Black (30), Blue (34), Green (32), Cyan (36),
+ * Red (31), Purple (35), Brown (33), Light Gray (37) and the given
+ * background color, Black (40), Red (41), Green (42), Yellow (43),
+ * Blue (44), Magenta (45), Cyan (46), White (47).
+ */
function ansi_set_color2(fg:long, bg:long) {
printf("\033[%d;%dm", bg, fg)
}
-# All attributes off 0
-# Intensity: Bold 1
-# Underline: Single 4
-# Blink: Slow 5
-# Blink: Rapid 6
-# Image: Negative 7
+/**
+ * sfunction ansi_set_color3 - Set the ansi Select Graphic Rendition mode.
+ * @fg: Foreground color to set.
+ * @bg: Background color to set.
+ * @attr: Color attribute to set.
+ *
+ * Description: Sends ansi code for Select Graphic Rendition mode for the
+ * given forground color, Black (30), Blue (34), Green (32), Cyan (36),
+ * Red (31), Purple (35), Brown (33), Light Gray (37), the given
+ * background color, Black (40), Red (41), Green (42), Yellow (43),
+ * Blue (44), Magenta (45), Cyan (46), White (47) and the color attribute
+ * All attributes off (0), Intensity Bold (1), Underline Single (4),
+ * Blink Slow (5), Blink Rapid (6), Image Negative (7).
+ */
function ansi_set_color3(fg:long, bg:long, attr:long) {
attr_str = attr ? sprintf(";%dm", attr) : "m"
printf("\033[%d;%d%s", bg, fg, attr_str)
}
+/**
+ * sfunction ansi_reset_color - Resets Select Graphic Rendition mode.
+ *
+ * Description: Sends ansi code to reset foreground, background and color
+ * attribute to default values.
+ */
function ansi_reset_color() {
ansi_set_color3(0, 0, 0)
}
+/**
+ * sfunction ansi_new_line - Move cursor to new line.
+ *
+ * Description: Sends ansi code new line.
+ */
function ansi_new_line() {
printf("\12")
}
+/**
+ * sfunction ansi_cursor_move - Move cursor to new coordinates.
+ * @x: Row to move the cursor to.
+ * @y: Colomn to move the cursor to.
+ *
+ * Description: Sends ansi code for positioning the cursor at row x
+ * and column y. Coordinates start at one, (1,1) is the top-left corner.
+ */
function ansi_cursor_move(x:long, y:long) {
printf("\033[%d;%dH", y, x)
}
+/**
+ * sfunction ansi_cursor_hide - Hides the cursor.
+ *
+ * Description: Sends ansi code for hiding the cursor.
+ */
function ansi_cursor_hide() {
print("\033[>5I")
}
+/**
+ * sfunction ansi_cursor_saves - Saves the cursor position.
+ *
+ * Description: Sends ansi code for saving the current cursor position.
+ */
function ansi_cursor_save() {
print("\033[s")
}
+/**
+ * sfunction ansi_cursor_saves - Restores a previously saved cursor position.
+ *
+ * Description: Sends ansi code for restoring the current cursor position
+ * previously saved with ansi_cursor_save().
+ */
function ansi_cursor_restore() {
print("\033[u")
}
+/**
+ * sfunction ansi_cursor_show - Shows the cursor.
+ *
+ * Description: Sends ansi code for showing the cursor.
+ */
function ansi_cursor_show() {
print("\033[>5h")
}
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp
index 2f19ab16..6e45e8e1 100644
--- a/tapset/aux_syscalls.stp
+++ b/tapset/aux_syscalls.stp
@@ -1891,3 +1891,49 @@ function _struct_sigaction32_u:string(uaddr:long)
}
#endif
%}
+
+/*
+ * Function irqflags_str :
+ * Returns the symbolic string representation of the IRQ flags.
+ *
+ */
+
+%{
+#include <linux/interrupt.h>
+#ifndef IRQF_ONESHOT
+#define IRQF_ONESHOT 0x00002000
+#endif
+static const _stp_val_array const _stp_irq_list[] = {
+#ifdef IRQF_DISABLED
+ V(IRQF_DISABLED),
+#endif
+#ifdef IRQF_SAMPLE_RANDOM
+ V(IRQF_SAMPLE_RANDOM),
+#endif
+#ifdef IRQF_SHARED
+ V(IRQF_SHARED),
+#endif
+#ifdef IRQF_PROBE_SHARED
+ V(IRQF_PROBE_SHARED),
+#endif
+#ifdef IRQF_TIMER
+ V(IRQF_TIMER),
+#endif
+#ifdef IRQF_PERCPU
+ V(IRQF_PERCPU),
+#endif
+#ifdef IRQF_NOBALANCING
+ V(IRQF_NOBALANCING),
+#endif
+#ifdef IRQF_IRQPOLL
+ V(IRQF_IRQPOLL),
+#endif
+ V(IRQF_ONESHOT),
+ {0, NULL}
+};
+%}
+
+function irqflags_str:string(f:long)
+%{ /* pure */
+ _stp_lookup_or_str(_stp_irq_list, THIS->f, THIS->__retvalue, MAXSTRINGLEN);
+%}
diff --git a/tapset/context.stp b/tapset/context.stp
index 14128589..36701e6e 100644
--- a/tapset/context.stp
+++ b/tapset/context.stp
@@ -210,7 +210,12 @@ function user_mode:long () %{ /* pure */ /* unprivileged */
}
%}
-
+/**
+ * sfunction is_return - Whether the current probe context is a return probe.
+ *
+ * Description: Returns 1 if the current probe context is a return probe,
+ * returns 0 otherwise.
+ */
function is_return:long () %{ /* pure */
if (CONTEXT->pi)
THIS->__retvalue = 1;
@@ -225,24 +230,22 @@ function target:long () %{ /* pure */ /* unprivileged */
THIS->__retvalue = _stp_target;
%}
-///<formalpara id="module_name">
-/// <title>module_name:string()</title>
-/// <indexterm><primary>module_name</primary></indexterm>
-/// <para>
-/// <remark>FIXME: need description.</remark>
-/// </para>
-///</formalpara>
+/**
+ * sfunction module_name - The module name of the current script.
+ *
+ * Returns the name of the stap module. Either generated randomly
+ * (stap_[0-9a-f]+_[0-9a-f]+) or set by stap -m <module_name>.
+ */
function module_name:string () %{ /* pure */ /* unprivileged */
strlcpy(THIS->__retvalue, THIS_MODULE->name, MAXSTRINGLEN);
%}
-///<formalpara id="stp_pid">
-/// <title>stp_pid:long()</title>
-/// <indexterm><primary>stp_pid</primary></indexterm>
-/// <para>
-/// <remark>FIXME: need description.</remark>
-/// </para>
-///</formalpara>
+/**
+ * sfunction stp_pid - The process id of the stapio process.
+ *
+ * Returns the process id of the stapio process that launched
+ * this script.
+ */
function stp_pid:long () %{ /* pure */
THIS->__retvalue = _stp_pid;
%}
diff --git a/tapset/ctime.stp b/tapset/ctime.stp
index d907c2db..3ecd6ddf 100644
--- a/tapset/ctime.stp
+++ b/tapset/ctime.stp
@@ -1,7 +1,18 @@
-/*
- * ctime()
+/* ctime.stp - Convert seconds to human readable date string.
*
- * Takes an argument of seconds since the epoch as returned by
+ * This code was adapted from the newlib mktm_r() and asctime_r()
+ * functions. In newlib, mktm_r.c states that it was adapted from
+ * tzcode maintained by Arthur David Olson. In newlib, asctime_r.c
+ * doesn't have any author/copyright information.
+ *
+ * Changes copyright (C) 2006, 2008 Red Hat Inc.
+ */
+
+/**
+ * sfunction ctime - Convert seconds since epoch into human readable date/time string.
+ * @epochsecs: Number of seconds since epoch (as returned by gettimeofday_s()).
+ *
+ * Description: Takes an argument of seconds since the epoch as returned by
* gettimeofday_s(). Returns a string of the form
*
* "Wed Jun 30 21:49:08 1993"
@@ -19,7 +30,7 @@
*
* The earliest full date given by ctime, corresponding to epochsecs
* -2147483648 is "Fri Dec 13 20:45:52 1901". The latest full date
- * given by ctime, corresponding to epachsecs 2147483647 is
+ * given by ctime, corresponding to epochsecs 2147483647 is
* "Tue Jan 19 03:14:07 2038".
*
* The abbreviations for the days of the week are ‘Sun’, ‘Mon’, ‘Tue’,
@@ -31,15 +42,7 @@
* character at the end of the string that this function does not.
* Also note that since the kernel has no concept of timezones, the
* returned time is always in GMT.
- *
- * This code was adapted from the newlib mktm_r() and asctime_r()
- * functions. In newlib, mktm_r.c states that it was adapted from
- * tzcode maintained by Arthur David Olson. In newlib, asctime_r.c
- * doesn't have any author/copyright information.
- *
- * Changes copyright (C) 2006, 2008 Red Hat Inc.
*/
-
function ctime:string(epochsecs:long)
%{ /* pure */
diff --git a/tapset/ioblock.stp b/tapset/ioblock.stp
index bc64c425..761e7df7 100644
--- a/tapset/ioblock.stp
+++ b/tapset/ioblock.stp
@@ -78,18 +78,13 @@ function __bio_devname:string(bio:long)
global BIO_READ = 0, BIO_WRITE = 1
-/* probe ioblock.request
+/**
+ * probe ioblock.request - Fires whenever making a generic block I/O request.
*
- * Fires whenever making a generic block I/O request.
- *
- * Context:
- * The process makes block I/O request
- *
- * Variables:
- * devname - block device name
- * ino - i-node number of the mapped file
- * sector - beginning sector for the entire bio
- * flags - see below
+ * @devname - block device name
+ * @ino - i-node number of the mapped file
+ * @sector - beginning sector for the entire bio
+ * @flags - see below
* BIO_UPTODATE 0 ok after I/O completion
* BIO_RW_BLOCK 1 RW_AHEAD set, and read/write would block
* BIO_EOF 2 out-out-bounds error
@@ -99,20 +94,18 @@ global BIO_READ = 0, BIO_WRITE = 1
* BIO_USER_MAPPED 6 contains user pages
* BIO_EOPNOTSUPP 7 not supported
*
- * rw - binary trace for read/write request
- * vcnt - bio vector count which represents number of array element (page,
- * offset, length) which make up this I/O request
- * idx - offset into the bio vector array
- * phys_segments - number of segments in this bio after physical address
- * coalescing is performed.
- * hw_segments - number of segments after physical and DMA remapping
- * hardware coalescing is performed
- * size - total size in bytes
- * bdev - target block device
- * bdev_contains - points to the device object which contains the
- * partition (when bio structure represents a partition)
- * p_start_sect - points to the start sector of the partition
- * structure of the device
+ * @rw - binary trace for read/write request
+ * @vcnt - bio vector count which represents number of array element (page, offset, length) which make up this I/O request
+ * @idx - offset into the bio vector array
+ * @phys_segments - number of segments in this bio after physical address coalescing is performed
+ * @hw_segments - number of segments after physical and DMA remapping hardware coalescing is performed
+ * @size - total size in bytes
+ * @bdev - target block device
+ * @bdev_contains - points to the device object which contains the partition (when bio structure represents a partition)
+ * @p_start_sect - points to the start sector of the partition structure of the device
+ *
+ * Context:
+ * The process makes block I/O request
*/
probe ioblock.request = kernel.function ("generic_make_request")
{
@@ -135,19 +128,14 @@ probe ioblock.request = kernel.function ("generic_make_request")
p_start_sect = __bio_start_sect($bio)
}
-/* probe ioblock.end
- *
- * Fires whenever a block I/O transfer is complete.
- *
- * Context:
- * The process signals the transfer is done.
+/**
+ * probe ioblock.end - Fires whenever a block I/O transfer is complete.
*
- * Variables:
- * devname - block device name
- * ino - i-node number of the mapped file
- * byte_done - number of bytes transferred
- * sector - beginning sector for the entire bio
- * flags - see below
+ * @devname - block device name
+ * @ino - i-node number of the mapped file
+ * @bytes_done - number of bytes transferred
+ * @sector - beginning sector for the entire bio
+ * @flags - see below
* BIO_UPTODATE 0 ok after I/O completion
* BIO_RW_BLOCK 1 RW_AHEAD set, and read/write would block
* BIO_EOF 2 out-out-bounds error
@@ -156,16 +144,16 @@ probe ioblock.request = kernel.function ("generic_make_request")
* BIO_BOUNCED 5 bio is a bounce bio
* BIO_USER_MAPPED 6 contains user pages
* BIO_EOPNOTSUPP 7 not supported
- * error - 0 on success
- * rw - binary trace for read/write request
- * vcnt - bio vector count which represents number of array element (page,
- * offset, length) which makes up this I/O request
- * idx - offset into the bio vector array
- * phys_segments - number of segments in this bio after physical address
- * coalescing is performed.
- * hw_segments - number of segments after physical and DMA remapping
- * hardware coalescing is performed
- * size - total size in bytes
+ * @error - 0 on success
+ * @rw - binary trace for read/write request
+ * @vcnt - bio vector count which represents number of array element (page, offset, length) which makes up this I/O request
+ * @idx - offset into the bio vector array
+ * @phys_segments - number of segments in this bio after physical address coalescing is performed.
+ * @hw_segments - number of segments after physical and DMA remapping hardware coalescing is performed
+ * @size - total size in bytes
+ *
+ * Context:
+ * The process signals the transfer is done.
*/
probe ioblock.end = kernel.function("bio_endio")
{
@@ -186,3 +174,135 @@ probe ioblock.end = kernel.function("bio_endio")
%)
size = $bio->bi_size
}
+
+/**
+ * probe ioblock_trace.bounce - Fires whenever a buffer bounce is needed for at least one page of a block IO request.
+ *
+ * @devname device for which a buffer bounce was needed.
+ * @ino - i-node number of the mapped file
+ * @bytes_done - number of bytes transferred
+ * @sector - beginning sector for the entire bio
+ * @flags - see below
+ * BIO_UPTODATE 0 ok after I/O completion
+ * BIO_RW_BLOCK 1 RW_AHEAD set, and read/write would block
+ * BIO_EOF 2 out-out-bounds error
+ * BIO_SEG_VALID 3 nr_hw_seg valid
+ * BIO_CLONED 4 doesn't own data
+ * BIO_BOUNCED 5 bio is a bounce bio
+ * BIO_USER_MAPPED 6 contains user pages
+ * BIO_EOPNOTSUPP 7 not supported
+ * @rw - binary trace for read/write request
+ * @vcnt - bio vector count which represents number of array element (page, offset, length) which makes up this I/O request
+ * @idx - offset into the bio vector array
+ * @phys_segments - number of segments in this bio after physical address coalescing is performed.
+ * @size - total size in bytes
+ *
+ * Context :
+ * The process creating a block IO request.
+ */
+probe ioblock_trace.bounce = kernel.trace("block_bio_bounce")
+{
+ devname = __bio_devname($bio)
+ ino = __bio_ino($bio)
+
+ bytes_done = $bio->bi_size
+ sector = $bio->bi_sector
+ flags = $bio->bi_flags
+ rw = $bio->bi_rw
+ vcnt = $bio->bi_vcnt
+ idx = $bio->bi_idx
+ phys_segments = $bio->bi_phys_segments
+ size = $bio->bi_size
+}
+
+/**
+ * probe ioblock_trace.request - Fires just as a generic block I/O request is created for a bio.
+ *
+ * @devname - block device name
+ * @ino - i-node number of the mapped file
+ * @bytes_done - number of bytes transferred
+ * @sector - beginning sector for the entire bio
+ * @flags - see below
+ * BIO_UPTODATE 0 ok after I/O completion
+ * BIO_RW_BLOCK 1 RW_AHEAD set, and read/write would block
+ * BIO_EOF 2 out-out-bounds error
+ * BIO_SEG_VALID 3 nr_hw_seg valid
+ * BIO_CLONED 4 doesn't own data
+ * BIO_BOUNCED 5 bio is a bounce bio
+ * BIO_USER_MAPPED 6 contains user pages
+ * BIO_EOPNOTSUPP 7 not supported
+ *
+ * @rw - binary trace for read/write request
+ * @vcnt - bio vector count which represents number of array element (page, offset, length) which make up this I/O request
+ * @idx - offset into the bio vector array
+ * @phys_segments - number of segments in this bio after physical address coalescing is performed.
+ * @size - total size in bytes
+ * @bdev - target block device
+ * @bdev_contains - points to the device object which contains the partition (when bio structure represents a partition)
+ * @p_start_sect - points to the start sector of the partition structure of the device
+ *
+ * Context:
+ * The process makes block I/O request
+ */
+
+probe ioblock_trace.request = kernel.trace("block_bio_queue")
+{
+ devname = __bio_devname($bio)
+ ino = __bio_ino($bio)
+
+ bytes_done = $bio->bi_size
+ sector = $bio->bi_sector
+ flags = $bio->bi_flags
+ rw = $bio->bi_rw
+ vcnt = $bio->bi_vcnt
+ idx = $bio->bi_idx
+ phys_segments = $bio->bi_phys_segments
+ size = $bio->bi_size
+ bdev_contains = $bio->bi_bdev->bd_contains
+ bdev = $bio->bi_bdev
+ p_start_sect = __bio_start_sect($bio)
+}
+
+/**
+ * probe ioblock_trace.end - Fires whenever a block I/O transfer is complete.
+ *
+ * @q - request queue on which this bio was queued.
+ * @devname - block device name
+ * @ino - i-node number of the mapped file
+ * @bytes_done - number of bytes transferred
+ * @sector - beginning sector for the entire bio
+ * @flags - see below
+ * BIO_UPTODATE 0 ok after I/O completion
+ * BIO_RW_BLOCK 1 RW_AHEAD set, and read/write would block
+ * BIO_EOF 2 out-out-bounds error
+ * BIO_SEG_VALID 3 nr_hw_seg valid
+ * BIO_CLONED 4 doesn't own data
+ * BIO_BOUNCED 5 bio is a bounce bio
+ * BIO_USER_MAPPED 6 contains user pages
+ * BIO_EOPNOTSUPP 7 not supported
+ *
+ * @rw - binary trace for read/write request
+ * @vcnt - bio vector count which represents number of array element (page, offset, length) which makes up this I/O request
+ * @idx - offset into the bio vector array
+ * @phys_segments - number of segments in this bio after physical address coalescing is performed.
+ * @size - total size in bytes
+ *
+ * Context:
+ * The process signals the transfer is done.
+ */
+probe ioblock_trace.end = kernel.trace("block_bio_complete")
+{
+ q = $q
+ devname = __bio_devname($bio)
+ ino = __bio_ino($bio)
+
+ bytes_done = $bio->bi_size
+
+ sector = $bio->bi_sector
+ flags = $bio->bi_flags
+ rw = $bio->bi_rw
+ vcnt = $bio->bi_vcnt
+ idx = $bio->bi_idx
+ phys_segments = $bio->bi_phys_segments
+ size = $bio->bi_size
+}
diff --git a/tapset/ioscheduler.stp b/tapset/ioscheduler.stp
index 637e2783..7f26cf23 100644
--- a/tapset/ioscheduler.stp
+++ b/tapset/ioscheduler.stp
@@ -68,22 +68,24 @@ probe ioscheduler.elv_next_request.return
}
/**
- * probe ioscheduler.elv_add_request - A request was added to the request queue
+ * probe ioscheduler.elv_add_request.kp - kprobe based probe to indicate that a request was added to the request queue
* @elevator_name: The type of I/O elevator currently enabled
+ * @q: pointer to request queue
* @req: Address of the request
* @req_flags: Request flags
* @disk_major: Disk major number of the request
* @disk_minor: Disk minor number of the request
*/
// when a request is added to the request queue
-probe ioscheduler.elv_add_request
- = kernel.function("__elv_add_request")
+probe ioscheduler.elv_add_request.kp
+ = kernel.function("elv_insert")
{
%( kernel_v >= "2.6.10" %?
elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
%:
elevator_name = kernel_string($q->elevator->elevator_name)
%)
+ q = $q
if($rq == 0) {
disk_major = -1
disk_minor = -1
@@ -142,6 +144,189 @@ probe ioscheduler.elv_completed_request
%)
}
+/**
+ * probe ioscheduler.elv_add_request.tp - tracepoint based probe to indicate a request is added to the request queue.
+ * @elevator_name : The type of I/O elevator currently enabled.
+ * @q : Pointer to request queue.
+ * @rq : Address of request.
+ * @rq_flags : Request flags.
+ * @disk_major : Disk major no of request.
+ * @disk_minor : Disk minor number of request.
+ *
+ */
+probe ioscheduler.elv_add_request.tp
+ = kernel.trace("block_rq_insert")
+{
+q = $q
+elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
+rq = $rq
+
+if ($rq == 0 || $rq->rq_disk ==0) {
+ disk_major = -1
+ disk_minor = -1
+} else {
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+}
+
+rq_flags = $rq==0? 0:$rq->cmd_flags
+}
+
+/**
+ * probe ioscheduler.elv_add_request - probe to indicate request is added to the request queue.
+ * @elevator_name : The type of I/O elevator currently enabled.
+ * @q : Pointer to request queue.
+ * @rq : Address of request.
+ * @rq_flags : Request flags.
+ * @disk_major : Disk major no of request.
+ * @disk_minor : Disk minor number of request.
+ *
+ */
+probe ioscheduler.elv_add_request =
+ ioscheduler.elv_add_request.tp !, ioscheduler.elv_add_request.kp
+{}
+
+/**
+ * probe ioscheduler_trace.elv_completed_request - Fires when a request is
+ * completed.
+ * @elevator_name : The type of I/O elevator currently enabled.
+ * @rq : Address of request.
+ * @rq_flags : Request flags.
+ * @disk_major : Disk major no of request.
+ * @disk_minor : Disk minor number of request.
+ *
+ */
+probe ioscheduler_trace.elv_completed_request
+ = kernel.trace("block_rq_complete")
+{
+elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
+rq = $rq
+
+if ($rq == 0 || $rq->rq_disk ==0) {
+ disk_major = -1
+ disk_minor = -1
+} else {
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+}
+
+rq_flags = $rq==0? 0:$rq->cmd_flags
+}
+
+/**
+ * probe ioscheduler_trace.elv_issue_request - Fires when a request is
+ * scheduled.
+ * @elevator_name : The type of I/O elevator currently enabled.
+ * @rq : Address of request.
+ * @rq_flags : Request flags.
+ * @disk_major : Disk major no of request.
+ * @disk_minor : Disk minor number of request.
+ *
+ */
+probe ioscheduler_trace.elv_issue_request
+ = kernel.trace("block_rq_issue")
+{
+elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
+rq = $rq
+
+if ($rq == 0 || $rq->rq_disk ==0) {
+ disk_major = -1
+ disk_minor = -1
+} else {
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+}
+
+rq_flags = $rq==0? 0:$rq->cmd_flags
+}
+
+/**
+ * probe ioscheduler_trace.elv_requeue_request - Fires when a request is
+ * put back on the queue, when the hadware cannot accept more requests.
+ * @elevator_name : The type of I/O elevator currently enabled.
+ * @rq : Address of request.
+ * @rq_flags : Request flags.
+ * @disk_major : Disk major no of request.
+ * @disk_minor : Disk minor number of request.
+ *
+ */
+probe ioscheduler_trace.elv_requeue_request
+ = kernel.trace("block_rq_requeue")
+{
+elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
+rq = $rq
+
+if ($rq == 0 || $rq->rq_disk ==0) {
+ disk_major = -1
+ disk_minor = -1
+} else {
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+}
+
+rq_flags = $rq==0? 0:$rq->cmd_flags
+}
+
+/**
+ * probe ioscheduler_trace.elv_abort_request - Fires when a request is aborted.
+ * @elevator_name : The type of I/O elevator currently enabled.
+ * @rq : Address of request.
+ * @rq_flags : Request flags.
+ * @disk_major : Disk major no of request.
+ * @disk_minor : Disk minor number of request.
+ *
+ */
+probe ioscheduler_trace.elv_abort_request
+ = kernel.trace("block_rq_abort")
+{
+elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
+rq = $rq
+
+if ($rq == 0 || $rq->rq_disk ==0) {
+ disk_major = -1
+ disk_minor = -1
+} else {
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+}
+
+rq_flags = $rq==0? 0:$rq->cmd_flags
+}
+
+/**
+ * probe ioscheduler_trace.plug - Fires when a request queue is plugged;
+ * ie, requests in the queue cannot be serviced by block driver.
+ * @rq_queue : request queue
+ *
+ */
+probe ioscheduler_trace.plug = kernel.trace("block_plug")
+{
+ rq_queue = $q
+}
+
+/**
+ * probe ioscheduler_trace.unplug_io - Fires when a request queue is unplugged;
+ * Either, when number of pending requests in the queue exceeds threshold
+ * or, upon expiration of timer that was activated when queue was plugged.
+ * @rq_queue : request queue
+ *
+ */
+probe ioscheduler_trace.unplug_io = kernel.trace("block_unplug_io")
+{
+ rq_queue = $q
+}
+
+/**
+ * probe ioscheduler_trace.unplug_timer - Fires when unplug timer associated
+ * with a request queue expires.
+ * @rq_queue : request queue
+ *
+ */
+probe ioscheduler_trace.unplug_timer = kernel.trace("block_unplug_timer")
+{
+ rq_queue = $q
+}
+
function disk_major_from_request:long(var_q:long)
%{ /* pure */
struct request_queue *q = (struct request_queue *)((long)THIS->var_q);
diff --git a/tapset/networking.stp b/tapset/networking.stp
index e9ea35dc..e1c5ed1f 100644
--- a/tapset/networking.stp
+++ b/tapset/networking.stp
@@ -154,7 +154,7 @@ probe netdev.rx
* @flags: The new flags
*/
probe netdev.change_rx_flag
- = kernel.function("dev_change_rx_flags")
+ = kernel.function("dev_change_rx_flags") ?
{
dev_name = get_netdev_name($dev)
flags = $flags
@@ -217,7 +217,7 @@ probe netdev.unregister
* @dev_name: The device that is going to provide the statistics
*/
probe netdev.get_stats
- = kernel.function("dev_get_stats")
+ = kernel.function("dev_get_stats") ?
{
dev_name = get_netdev_name($dev)
}
diff --git a/tapset/nfs.stp b/tapset/nfs.stp
index 6b7d5eeb..50bdc087 100644
--- a/tapset/nfs.stp
+++ b/tapset/nfs.stp
@@ -450,8 +450,8 @@ probe nfs.fop.aio_read.return = kernel.function ("nfs_file_read").return !,
if ($return > 0) {
size = $return
- units = "bytes"
}
+ units = "bytes"
}
/* probe nfs.fop.aio_write
@@ -503,8 +503,8 @@ probe nfs.fop.aio_write.return = kernel.function("nfs_file_write").return !,
if ($return > 0) {
size = $return
- units = "bytes"
}
+ units = "bytes"
}
/* probe nfs.fop.mmap
@@ -669,7 +669,9 @@ probe nfs.fop.release.return = kernel.function("nfs_file_release").return !,
* ino : inode number
* ndirty : number of dirty pages
*/
-probe nfs.fop.fsync = kernel.function("nfs_fsync") !,
+probe nfs.fop.fsync = kernel.function("nfs_file_fsync") !,
+ module("nfs").function("nfs_file_fsync") !,
+ kernel.function("nfs_fsync") !,
module("nfs").function("nfs_fsync")
{
dev = __file_dev($file)
@@ -683,7 +685,9 @@ probe nfs.fop.fsync = kernel.function("nfs_fsync") !,
argstr = sprintf("%d", ino)
}
-probe nfs.fop.fsync.return = kernel.function("nfs_fsync").return !,
+probe nfs.fop.fsync.return = kernel.function("nfs_file_fsync").return !,
+ module("nfs").function("nfs_file_fsync").return !,
+ kernel.function("nfs_fsync").return !,
module("nfs").function("nfs_fsync").return
{
name = "nfs.fop.fsync.return"
@@ -782,8 +786,8 @@ probe nfs.fop.sendfile.return = kernel.function("nfs_file_sendfile").return !,
if ($return > 0) {
size = $return
- units = "bytes"
}
+ units = "bytes"
}
%)
@@ -816,8 +820,8 @@ probe nfs.aop.entries = nfs.aop.readpage,
nfs.aop.writepage,
nfs.aop.writepages,
nfs.aop.release_page ?,
- nfs.aop.prepare_write,
- nfs.aop.commit_write
+ nfs.aop.write_begin,
+ nfs.aop.write_end
{
}
@@ -826,8 +830,8 @@ probe nfs.aop.return = nfs.aop.readpage.return,
nfs.aop.writepage.return,
nfs.aop.writepages.return,
nfs.aop.release_page.return ?,
- nfs.aop.prepare_write.return,
- nfs.aop.commit_write.return
+ nfs.aop.write_begin.return,
+ nfs.aop.write_end.return
{
}
@@ -922,9 +926,8 @@ probe nfs.aop.readpages.return = kernel.function ("nfs_readpages").return !,
name = "nfs.aop.readpages.return"
retstr = sprintf("%d", $return)
- if ($return > 0 )
- {
- size = retstr
+ if ($return > 0 ) {
+ size = $return
}
units = "pages"
}
@@ -1064,6 +1067,79 @@ probe nfs.aop.writepages.return = kernel.function ("nfs_writepages").return !,
retstr = sprintf("%d", $return)
}
+# kernel commit 4899f9c852564ce7b6d0ca932ac6674bf471fd28 removed
+# nfs_prepare_write()/nfs_commit_write() and created
+# nfs_write_begin()/nfs_write_end(). So, we try to find whatever the
+# current kernel has.
+
+probe nfs.aop.write_begin = __nfs.aop.write_begin !,
+ __nfs.aop.prepare_write
+{
+}
+probe nfs.aop.write_begin.return
+ = __nfs.aop.write_begin.return !,
+ __nfs.aop.prepare_write.return
+{
+}
+
+probe nfs.aop.write_end = __nfs.aop.write_end !,
+ __nfs.aop.commit_write
+{
+}
+probe nfs.aop.write_end.return
+ = __nfs.aop.write_end.return !,
+ __nfs.aop.commit_write.return
+{
+}
+
+probe __nfs.aop.write_begin = kernel.function ("nfs_write_begin") !,
+ module("nfs").function("nfs_write_begin")
+{
+ dev = __file_dev($file)
+ ino = __file_ino($file)
+ s_id = __file_id($file)
+ devname = kernel_string(s_id)
+
+ pos = $pos
+ count = $len
+
+ name = "nfs.aop.write_begin"
+ argstr = sprintf("%d", ino)
+
+ units = "bytes"
+}
+probe __nfs.aop.write_begin.return
+ = kernel.function ("nfs_write_begin").return !,
+ module("nfs").function ("nfs_write_begin").return
+{
+ name = "nfs.aop.write_begin.return"
+ retstr = sprintf("%d", $return)
+}
+
+probe __nfs.aop.write_end = kernel.function ("nfs_write_end") !,
+ module("nfs").function("nfs_write_end")
+{
+ dev = __file_dev($file)
+ ino = __file_ino($file)
+ s_id = __file_id($file)
+ devname = kernel_string(s_id)
+
+ pos = $pos
+ count = $len
+
+ name = "nfs.aop.write_end"
+ argstr = sprintf("%d", ino)
+
+ units = "bytes"
+}
+probe __nfs.aop.write_end.return
+ = kernel.function ("nfs_write_end").return !,
+ module("nfs").function("nfs_write_end").return
+{
+ name = "nfs.aop.write_end.return"
+ retstr = sprintf("%d", $return)
+}
+
/* probe nfs.aop.prepare_write
* Fires when do write operation on nfs.
* Prepare a page for writing
@@ -1084,8 +1160,8 @@ probe nfs.aop.writepages.return = kernel.function ("nfs_writepages").return !,
* in the page frame
* size : write bytes
*/
-probe nfs.aop.prepare_write = kernel.function ("nfs_prepare_write") !,
- module("nfs").function ("nfs_prepare_write")
+probe __nfs.aop.prepare_write = kernel.function ("nfs_prepare_write") !,
+ module("nfs").function ("nfs_prepare_write")
{
__page = $page
dev = __page_dev(__page)
@@ -1104,7 +1180,7 @@ probe nfs.aop.prepare_write = kernel.function ("nfs_prepare_write") !,
units = "bytes"
}
-probe nfs.aop.prepare_write.return =
+probe __nfs.aop.prepare_write.return =
kernel.function ("nfs_prepare_write").return !,
module("nfs").function ("nfs_prepare_write").return
{
@@ -1132,16 +1208,15 @@ probe nfs.aop.prepare_write.return =
* in the page frame
* size : write bytes
*/
-probe nfs.aop.commit_write = kernel.function ("nfs_commit_write") !,
- module("nfs").function ("nfs_commit_write")
+probe __nfs.aop.commit_write = kernel.function ("nfs_commit_write") !,
+ module("nfs").function ("nfs_commit_write")
{
- __page = $page
+ __page = $page
dev = __page_dev(__page)
ino = __page_ino(__page)
offset = $offset
to = $to
-
i_flag = __p2i_flag($page)
i_size = __p2i_size($page)
@@ -1157,7 +1232,7 @@ probe nfs.aop.commit_write = kernel.function ("nfs_commit_write") !,
units = "bytes"
}
-probe nfs.aop.commit_write.return =
+probe __nfs.aop.commit_write.return =
kernel.function ("nfs_commit_write").return !,
module("nfs").function ("nfs_commit_write").return
{
diff --git a/tapset/nfs_proc.stp b/tapset/nfs_proc.stp
index 502091b4..afd5328b 100644
--- a/tapset/nfs_proc.stp
+++ b/tapset/nfs_proc.stp
@@ -207,9 +207,9 @@ function __getfh_inode :long(dir:long) %{ /* pure */
THIS->__retvalue =(long) fh;
%}
probe nfs.proc.entries = nfs.proc.lookup,
- nfs.proc.read,
- nfs.proc.write,
- nfs.proc.commit,
+ nfs.proc.read ?,
+ nfs.proc.write ?,
+ nfs.proc.commit ?,
nfs.proc.read_setup,
nfs.proc.write_setup,
nfs.proc.commit_setup,
@@ -226,9 +226,9 @@ probe nfs.proc.entries = nfs.proc.lookup,
probe nfs.proc.return = nfs.proc.lookup.return,
- nfs.proc.read.return,
- nfs.proc.write.return,
- nfs.proc.commit.return,
+ nfs.proc.read.return ?,
+ nfs.proc.write.return ?,
+ nfs.proc.commit.return ?,
nfs.proc.read_setup.return,
nfs.proc.write_setup.return,
nfs.proc.commit_setup.return,
@@ -355,16 +355,18 @@ probe nfs.proc4.lookup.return = kernel.function("nfs4_proc_lookup").return!,
* count : read bytes in this execution
* offset : the file offset
*
+* All the nfs.proc.read kernel functions were removed in kernel commit
+* 8e0969, so these probes are optional.
*/
-probe nfs.proc.read = nfs.proc2.read ,
- nfs.proc3.read ,
- nfs.proc4.read
+probe nfs.proc.read = nfs.proc2.read ?,
+ nfs.proc3.read ?,
+ nfs.proc4.read ?
{}
-probe nfs.proc.read.return = nfs.proc2.read.return ,
- nfs.proc3.read.return ,
- nfs.proc4.read.return
+probe nfs.proc.read.return = nfs.proc2.read.return ?,
+ nfs.proc3.read.return ?,
+ nfs.proc4.read.return ?
{
}
@@ -464,17 +466,20 @@ probe nfs.proc4.read.return = kernel.function("nfs4_proc_read").return !,
* bitmask0:
* bitmask1 :V4 bitmask representing the set of attributes
* supported on this filesystem (only in probe nfs.proc4.write)
+*
+* All the nfs.proc.write kernel functions were removed in kernel commit
+* 200baa, so these probes are optional.
*/
-probe nfs.proc.write = nfs.proc2.write ,
- nfs.proc3.write ,
- nfs.proc4.write
+probe nfs.proc.write = nfs.proc2.write ?,
+ nfs.proc3.write ?,
+ nfs.proc4.write ?
{}
-probe nfs.proc.write.return = nfs.proc2.write.return ,
- nfs.proc3.write.return ,
- nfs.proc4.write.return
+probe nfs.proc.write.return = nfs.proc2.write.return ?,
+ nfs.proc3.write.return ?,
+ nfs.proc4.write.return ?
{}
probe nfs.proc2.write = kernel.function("nfs_proc_write")!,
@@ -598,13 +603,16 @@ probe nfs.proc4.write.return = kernel.function("nfs4_proc_write").return !,
* bitmask0:
* bitmask1 :V4 bitmask representing the set of attributes
* supported on this filesystem (only in probe nfs.proc4.commit)
+*
+* All the nfs.proc.commit kernel functions were removed in kernel
+* commit 200baa, so these probes are optional.
*/
-probe nfs.proc.commit = nfs.proc3.commit,
- nfs.proc4.commit
+probe nfs.proc.commit = nfs.proc3.commit ?,
+ nfs.proc4.commit ?
{}
-probe nfs.proc.commit.return = nfs.proc3.commit.return,
- nfs.proc4.commit.return
+probe nfs.proc.commit.return = nfs.proc3.commit.return ?,
+ nfs.proc4.commit.return ?
{}
// XXX: on kernels > 2.6.18 (?), module("nfs") -> module("nfsd") and