diff options
author | guanglei <guanglei> | 2006-05-18 00:21:05 +0000 |
---|---|---|
committer | guanglei <guanglei> | 2006-05-18 00:21:05 +0000 |
commit | f8e6042eef05612c93efee7adb00cb006fbcc643 (patch) | |
tree | fb19e1ad13dc724828f0dec89cb1174105941a49 /tapset/ioscheduler.stp | |
parent | a955efeaa5ede86838aa3df87ec059548171bafe (diff) | |
download | systemtap-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.stp | 81 |
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; + } +%} |