From: guanglei Date: Thu, 12 Oct 2006 08:29:10 +0000 (+0000) Subject: * ioscheduler.stp: X-Git-Tag: release-0.5.10~14 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=40cfa2bce2cf09160da6b767603e11a2cfac3a3e;p=systemtap.git * 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 --- diff --git a/tapset/ChangeLog b/tapset/ChangeLog index 10b58a4e8..e6f3f0247 100644 --- a/tapset/ChangeLog +++ b/tapset/ChangeLog @@ -1,3 +1,6 @@ +2006-10-12 Li Guanglei + * ioscheduler.stp: bugfix to avoid refer to NULL pointer + 2006-10-11 Li Guanglei * nfs.stp, nfsd.stp: bugfix of pointer conversion on 32-bit platform. diff --git a/tapset/LKET/Changelog b/tapset/LKET/Changelog index 786adda94..4a85b6cde 100644 --- a/tapset/LKET/Changelog +++ b/tapset/LKET/Changelog @@ -1,3 +1,11 @@ +2006-10-12 Li Guanglei + * 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 * 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 9fc9e6b90..1097dfb31 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 d9af8a53e..72957b454 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 +#include +%} + +/* 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 -#include -%} - -/* 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 f78514dd8..4b7b5f051 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 9fa0cca17..9c3714f44 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;