summaryrefslogtreecommitdiffstats
path: root/tapset/ioscheduler.stp
diff options
context:
space:
mode:
authorguanglei <guanglei>2006-05-18 00:21:05 +0000
committerguanglei <guanglei>2006-05-18 00:21:05 +0000
commitf8e6042eef05612c93efee7adb00cb006fbcc643 (patch)
treefb19e1ad13dc724828f0dec89cb1174105941a49 /tapset/ioscheduler.stp
parenta955efeaa5ede86838aa3df87ec059548171bafe (diff)
downloadsystemtap-steved-f8e6042eef05612c93efee7adb00cb006fbcc643.tar.gz
systemtap-steved-f8e6042eef05612c93efee7adb00cb006fbcc643.tar.xz
systemtap-steved-f8e6042eef05612c93efee7adb00cb006fbcc643.zip
I break LKET into layered structure. The first layer is those generic tapsets.
The second layer is tracing specific. I checked into CVS those generic tapsets at the first step.
Diffstat (limited to 'tapset/ioscheduler.stp')
-rw-r--r--tapset/ioscheduler.stp81
1 files changed, 81 insertions, 0 deletions
diff --git a/tapset/ioscheduler.stp b/tapset/ioscheduler.stp
new file mode 100644
index 00000000..1871772f
--- /dev/null
+++ b/tapset/ioscheduler.stp
@@ -0,0 +1,81 @@
+// IO scheduler tapset
+// Copyright (C) 2005, 2006 IBM Corp.
+//
+// This file is part of systemtap, and is free software. You can
+// redistribute it and/or modify it under the terms of the GNU General
+// Public License (GPL); either version 2, or (at your option) any
+// later version.
+
+%{
+#include <linux/blkdev.h>
+#include <linux/elevator.h>
+%}
+
+/* when a request is retrieved from request queue */
+probe ioscheduler.elv_next_request
+ = kernel.function("elv_next_request")
+{
+%( kernel_v >= "2.6.10" %?
+ elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
+%:
+ elevator_name = kernel_string($q->elevator.elevator_name)
+%)
+ disk_major = disk_major_from_request($q)
+ disk_minor = disk_minor_from_request($q)
+}
+
+/* when a request is added to the request queue */
+probe ioscheduler.elv_add_request
+ = kernel.function("__elv_add_request")
+{
+%( kernel_v >= "2.6.10" %?
+ elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
+%:
+ elevator_name = kernel_string($q->elevator.elevator_name)
+%)
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+}
+
+/* when a request is completed */
+probe ioscheduler.elv_completed_request
+ = kernel.function("elv_completed_request")
+{
+%( kernel_v >= "2.6.10" %?
+ elevator_name = kernel_string($q->elevator->elevator_type->elevator_name)
+%:
+ elevator_name = kernel_string($q->elevator.elevator_name)
+%)
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+}
+
+function disk_major_from_request:long(var_q:long)
+%{
+ struct request_queue *q;
+ struct request *rq;
+
+ q = (struct request_queue *)((long)THIS->var_q);
+
+ if(list_empty(&(q->queue_head)))
+ THIS->__retvalue = -1;
+ else {
+ rq = list_entry_rq(q->queue_head.next);
+ THIS->__retvalue = rq->rq_disk->first_minor;
+ }
+%}
+
+function disk_minor_from_request:long(var_q:long)
+%{
+ struct request_queue *q;
+ struct request *rq;
+
+ q = (struct request_queue *)((long)THIS->var_q);
+
+ if(list_empty(&(q->queue_head)))
+ THIS->__retvalue = -1;
+ else {
+ rq = list_entry_rq(q->queue_head.next);
+ THIS->__retvalue = rq->rq_disk->first_minor;
+ }
+%}