summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorguanglei <guanglei>2006-10-12 08:29:10 +0000
committerguanglei <guanglei>2006-10-12 08:29:10 +0000
commit40cfa2bce2cf09160da6b767603e11a2cfac3a3e (patch)
tree830a751bd4066128e0028e0cd868ac70d5d7b6ec
parent1d3a40b69576b5509671647e556b79ff5d6d17b7 (diff)
downloadsystemtap-steved-40cfa2bce2cf09160da6b767603e11a2cfac3a3e.tar.gz
systemtap-steved-40cfa2bce2cf09160da6b767603e11a2cfac3a3e.tar.xz
systemtap-steved-40cfa2bce2cf09160da6b767603e11a2cfac3a3e.zip
* ioscheduler.stp:
bugfix to avoid refer to NULL pointer * hookid_defs.stp, ioscheduler.stp, register_event.stp: break the old addevent.ioscheduler.elv_next_request into addevent.ioscheduler.elv_next_request.entry and addevent.ioscheduler.elv_next_request.return. Now log_ioscheduler_tracedata_* will use the variables defined in generic ioscheduler tapset
-rw-r--r--tapset/ChangeLog3
-rw-r--r--tapset/LKET/Changelog8
-rwxr-xr-xtapset/LKET/hookid_defs.stp9
-rwxr-xr-xtapset/LKET/ioscheduler.stp139
-rwxr-xr-xtapset/LKET/register_event.stp11
-rw-r--r--tapset/ioscheduler.stp61
6 files changed, 119 insertions, 112 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index 10b58a4e..e6f3f024 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,6 @@
+2006-10-12 Li Guanglei <guanglei@cn.ibm.com>
+ * ioscheduler.stp: bugfix to avoid refer to NULL pointer
+
2006-10-11 Li Guanglei <guanglei@cn.ibm.com>
* nfs.stp, nfsd.stp: bugfix of pointer conversion on
32-bit platform.
diff --git a/tapset/LKET/Changelog b/tapset/LKET/Changelog
index 786adda9..4a85b6cd 100644
--- a/tapset/LKET/Changelog
+++ b/tapset/LKET/Changelog
@@ -1,3 +1,11 @@
+2006-10-12 Li Guanglei <guanglei@cn.ibm.com>
+ * hookid_defs.stp, ioscheduler.stp, register_event.stp:
+ break the old addevent.ioscheduler.elv_next_request into
+ addevent.ioscheduler.elv_next_request.entry and
+ addevent.ioscheduler.elv_next_request.return.
+ Now log_ioscheduler_tracedata_* will use the
+ variables defined in generic ioscheduler tapset
+
2006-10-11 Li Guanglei <guanglei@cn.ibm.com>
* aio.stp, nfs.stp, nfs_proc.stp, nfsd.stp, process.stp:
diff --git a/tapset/LKET/hookid_defs.stp b/tapset/LKET/hookid_defs.stp
index 9fc9e6b9..1097dfb3 100755
--- a/tapset/LKET/hookid_defs.stp
+++ b/tapset/LKET/hookid_defs.stp
@@ -17,7 +17,8 @@ global
/* io scheduler */
GROUP_IOSCHED,
HOOKID_IOSCHED_ADD_REQ,
- HOOKID_IOSCHED_NEXT_REQ,
+ HOOKID_IOSCHED_NEXT_REQ_ENTRY,
+ HOOKID_IOSCHED_NEXT_REQ_RETURN,
HOOKID_IOSCHED_COMPLETE_REQ,
/* task dispatching */
@@ -383,7 +384,8 @@ int _HOOKID_PROCESS_EXECVE = 3;
int _HOOKID_PROCESS_FORK = 5;
int _HOOKID_IOSCHED_ADD_REQ = 1;
-int _HOOKID_IOSCHED_NEXT_REQ = 3;
+int _HOOKID_IOSCHED_NEXT_REQ_ENTRY = 3;
+int _HOOKID_IOSCHED_NEXT_REQ_RETURN = 4;
int _HOOKID_IOSCHED_COMPLETE_REQ = 5;
int _HOOKID_TASK_CTXSWITCH = 1;
@@ -649,7 +651,8 @@ HOOKID_PROCESS_EXECVE = 3;
HOOKID_PROCESS_FORK = 5;
HOOKID_IOSCHED_ADD_REQ = 1;
-HOOKID_IOSCHED_NEXT_REQ = 3;
+HOOKID_IOSCHED_NEXT_REQ_ENTRY = 3;
+HOOKID_IOSCHED_NEXT_REQ_RETURN = 4;
HOOKID_IOSCHED_COMPLETE_REQ = 5;
HOOKID_TASK_CTXSWITCH = 1;
diff --git a/tapset/LKET/ioscheduler.stp b/tapset/LKET/ioscheduler.stp
index d9af8a53..72957b45 100755
--- a/tapset/LKET/ioscheduler.stp
+++ b/tapset/LKET/ioscheduler.stp
@@ -9,21 +9,41 @@ probe addevent.ioscheduler
= addevent.ioscheduler.elv_next_request,
addevent.ioscheduler.elv_add_request,
addevent.ioscheduler.elv_completed_request
-{
-}
+{}
-
-/* when a request is retrieved from request queue */
probe addevent.ioscheduler.elv_next_request
- += _addevent.ioscheduler.elv_next_request
+ = addevent.ioscheduler.elv_next_request.entry,
+ addevent.ioscheduler.elv_next_request.return
+{}
+
+%{
+#include <linux/blkdev.h>
+#include <linux/elevator.h>
+%}
+
+/* when a request is retrieved from request queue */
+probe addevent.ioscheduler.elv_next_request.entry
+ += _addevent.ioscheduler.elv_next_request.entry
{
update_record()
}
-probe _addevent.ioscheduler.elv_next_request
+probe _addevent.ioscheduler.elv_next_request.entry
= ioscheduler.elv_next_request
{
- log_ioscheduler_tracedata_elv_next(HOOKID_IOSCHED_NEXT_REQ, $q)
+ log_ioscheduler_tracedata_elv_next_entry(elevator_name)
+}
+
+probe addevent.ioscheduler.elv_next_request.return
+ += _addevent.ioscheduler.elv_next_request.return
+{
+ update_record()
+}
+
+probe _addevent.ioscheduler.elv_next_request.return
+ = ioscheduler.elv_next_request.return
+{
+ log_ioscheduler_tracedata_elv_next_return(disk_major, disk_minor, req, req_flags)
}
@@ -37,7 +57,8 @@ probe addevent.ioscheduler.elv_add_request
probe _addevent.ioscheduler.elv_add_request
= ioscheduler.elv_add_request
{
- log_ioscheduler_tracedata_others(HOOKID_IOSCHED_ADD_REQ, $q, $rq)
+ log_ioscheduler_tracedata_others(HOOKID_IOSCHED_ADD_REQ,
+ elevator_name, disk_major, disk_minor, req, req_flags)
}
/* when a request is completed */
@@ -50,107 +71,29 @@ probe addevent.ioscheduler.elv_completed_request
probe _addevent.ioscheduler.elv_completed_request
= ioscheduler.elv_completed_request
{
- log_ioscheduler_tracedata_others(HOOKID_IOSCHED_COMPLETE_REQ, $q, $rq)
+ log_ioscheduler_tracedata_others(HOOKID_IOSCHED_ADD_REQ,
+ elevator_name, disk_major, disk_minor, req, req_flags)
}
-
-%{
-#include <linux/blkdev.h>
-#include <linux/elevator.h>
-%}
-
-/* log the data specific to __elv_add_request and elv_remove_request */
-%( kernel_v >= "2.6.10" %?
-
-function log_ioscheduler_tracedata_others(var_id:long, var_q:long, var_rq:long)
+function log_ioscheduler_tracedata_others(var_id:long, elv_name:string, major:long,
+ minor:long, rq:long, flag:long)
%{
- struct request *rq = (struct request *)((long)THIS->var_rq);
- struct request_queue *q = (struct request_queue *)((long)THIS->var_q);
-
- /* elevator name|major|minor|request|request_flags */
-
- _lket_trace(_GROUP_IOSCHED, THIS->var_id, "%0s%1b%1b%8b%8b",
- q->elevator->elevator_type->elevator_name,
- (_FMT_)rq->rq_disk->major, (_FMT_)rq->rq_disk->first_minor,
- (int64_t)((long)rq), (_FMT_)rq->flags);
-%}
-
-%:
-
-function log_ioscheduler_tracedata_others(var_id:long, var_q:long, var_rq:long)
-%{
- struct request *rq = (struct request *)((long)THIS->var_rq);
- struct request_queue *q = (struct request_queue *)((long)THIS->var_q);
-
/* elevator name|major|minor|request|request_flags */
_lket_trace(_GROUP_IOSCHED, THIS->var_id, "%0s%1b%1b%8b%8b",
- q->elevator.elevator_name, (_FMT_)rq->rq_disk->major,
- (_FMT_)rq->rq_disk->first_minor, (int64_t)((long)rq),
- (_FMT_)rq->flags);
-%}
-
-%)
+ THIS->elv_name, THIS->major, THIS->minor, THIS->rq, THIS->flag);
-/* log the data specific to elv_next_request, for kernel == 2.6.9 */
-%( kernel_v >= "2.6.10" %?
+%}
-/* log the data specific to elv_next_request , for kernel > 2.6.9*/
-function log_ioscheduler_tracedata_elv_next(var_id:long, var:long)
+/* log the data specific to elv_next_request */
+function log_ioscheduler_tracedata_elv_next_entry(elv_name:string)
%{
-
- struct request_queue *q;
- struct request *rq;
-
- q = (struct request_queue *)((long)THIS->var);
-
- /* If there is a request in the request queue:
- elevator name|major|minor|request|req_flags
- if there is no request in the request queue:
- elevator name|empty|0|0
- */
-
- if(list_empty(&(q->queue_head))) {
- _lket_trace(_GROUP_IOSCHED, THIS->var_id, "%0s%1b%1b%8b%8b",
- q->elevator->elevator_type->elevator_name, (_FMT_)-1,
- (_FMT_)-1, (_FMT_)0, (_FMT_)0);
- } else {
- rq = list_entry_rq(q->queue_head.next);
- _lket_trace(_GROUP_IOSCHED, THIS->var_id, "%0s%1b%1b%8b%8b",
- q->elevator->elevator_type->elevator_name, (_FMT_)rq->rq_disk->major,
- (_FMT_)rq->rq_disk->first_minor, (int64_t)((long)rq),
- (_FMT_)rq->flags);
- }
-
+ _lket_trace(_GROUP_IOSCHED, _HOOKID_IOSCHED_NEXT_REQ_ENTRY, "%0s", THIS->elv_name);
%}
-%:
-
-function log_ioscheduler_tracedata_elv_next(var_id:long, var:long)
+function log_ioscheduler_tracedata_elv_next_return(major:long, minor:long, req:long, req_flags:long)
%{
-
- struct request_queue *q;
- struct request *rq;
-
- q = (struct request_queue *)((long)THIS->var);
-
- /* If there is a request in the request queue:
- elevator name|major|minor|request|req_flags
- if there is no request in the request queue:
- elevator name|empty|0|0
- */
- if(list_empty(&(q->queue_head))) {
- _lket_trace(_GROUP_IOSCHED, THIS->var_id, "%0s%1b%1b%8b%8b",
- q->elevator.elevator_name, (_FMT_)-1, (_FMT_)-1,
- (_FMT_)0, (_FMT_)0);
- } else {
- rq = list_entry_rq(q->queue_head.next);
- _lket_trace(_GROUP_IOSCHED, THIS->var_id, "%0s%1b%1b%8b%8b",
- q->elevator.elevator_name, (_FMT_)rq->rq_disk->major,
- (_FMT_)rq->rq_disk->first_minor, (int64_t)((long)rq),
- (_FMT_)rq->flags);
- }
-
+ _lket_trace(_GROUP_IOSCHED, _HOOKID_IOSCHED_NEXT_REQ_RETURN, "%1b%1b%8b%8b",
+ THIS->major, THIS->minor, THIS->req, THIS->req_flags);
%}
-%)
diff --git a/tapset/LKET/register_event.stp b/tapset/LKET/register_event.stp
index f78514dd..4b7b5f05 100755
--- a/tapset/LKET/register_event.stp
+++ b/tapset/LKET/register_event.stp
@@ -176,9 +176,14 @@ function register_sys_events()
register_sys_event("addevent.process.fork", GROUP_PROCESS, HOOKID_PROCESS_FORK,
"INT32:INT32:INT32", "tid:pid:ppid")
- register_sys_event("addevent.ioscheduler.elv_next_request",
- GROUP_IOSCHED, HOOKID_IOSCHED_NEXT_REQ,
- "STRING:INT8:INT8:INT64:INT64", "elv_name:major:minor:request:req_flags")
+ register_sys_event("addevent.ioscheduler.elv_next_request.entry",
+ GROUP_IOSCHED, HOOKID_IOSCHED_NEXT_REQ_ENTRY,
+ "STRING", "elv_name")
+ register_sys_event("addevent.ioscheduler.elv_next_request.return",
+ GROUP_IOSCHED, HOOKID_IOSCHED_NEXT_REQ_RETURN,
+ "INT8:INT8:INT64:INT64", "major:minor:req_addr:req_flags")
+
+
register_sys_event("addevent.ioscheduler.elv_add_request",
GROUP_IOSCHED, HOOKID_IOSCHED_ADD_REQ,
"STRING:INT8:INT8:INT64:INT64", "elv_name:major:minor:request:req_flags")
diff --git a/tapset/ioscheduler.stp b/tapset/ioscheduler.stp
index 9fa0cca1..9c3714f4 100644
--- a/tapset/ioscheduler.stp
+++ b/tapset/ioscheduler.stp
@@ -20,8 +20,27 @@ probe ioscheduler.elv_next_request
%:
elevator_name = kernel_string($q->elevator->elevator_name)
%)
- disk_major = disk_major_from_request($q)
- disk_minor = disk_minor_from_request($q)
+}
+
+probe ioscheduler.elv_next_request.return
+ = kernel.function("elv_next_request").return
+{
+ if($return == 0) {
+ req = 0
+ req_flags = 0
+ disk_major = -1
+ disk_minor = -1
+ } else {
+ req = $return
+ req_flags = $return->flags
+ if($return->rq_disk == 0) {
+ disk_major = -1
+ disk_minor = -1
+ } else {
+ disk_major = $return->rq_disk->major
+ disk_minor = $return->rq_disk->first_minor
+ }
+ }
}
/* when a request is added to the request queue */
@@ -33,8 +52,21 @@ probe ioscheduler.elv_add_request
%:
elevator_name = kernel_string($q->elevator->elevator_name)
%)
- disk_major = $rq->rq_disk->major
- disk_minor = $rq->rq_disk->first_minor
+ if($rq == 0) {
+ disk_major = -1
+ disk_minor = -1
+ } else {
+ if($rq->rq_disk == 0) {
+ disk_major = -1
+ disk_minor = -1
+ } else {
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+ }
+ }
+
+ req = $rq
+ req_flags = $rq->flags
}
/* when a request is completed */
@@ -46,12 +78,25 @@ probe ioscheduler.elv_completed_request
%:
elevator_name = kernel_string($q->elevator->elevator_name)
%)
- disk_major = $rq->rq_disk->major
- disk_minor = $rq->rq_disk->first_minor
+ if($rq == 0) {
+ disk_major = -1
+ disk_minor = -1
+ } else {
+ if($rq->rq_disk == 0) {
+ disk_major = -1
+ disk_minor = -1
+ } else {
+ disk_major = $rq->rq_disk->major
+ disk_minor = $rq->rq_disk->first_minor
+ }
+ }
+
+ req = $rq
+ req_flags = $rq->flags
}
function disk_major_from_request:long(var_q:long)
-%{
+%{ /* pure */
struct request_queue *q;
struct request *rq;
@@ -66,7 +111,7 @@ function disk_major_from_request:long(var_q:long)
%}
function disk_minor_from_request:long(var_q:long)
-%{
+%{ /* pure */
struct request_queue *q;
struct request *rq;