]> sourceware.org Git - systemtap.git/commitdiff
* ioscheduler.stp:
authorguanglei <guanglei>
Thu, 12 Oct 2006 08:29:10 +0000 (08:29 +0000)
committerguanglei <guanglei>
Thu, 12 Oct 2006 08:29:10 +0000 (08:29 +0000)
  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

tapset/ChangeLog
tapset/LKET/Changelog
tapset/LKET/hookid_defs.stp
tapset/LKET/ioscheduler.stp
tapset/LKET/register_event.stp
tapset/ioscheduler.stp

index 10b58a4e890140b637bc98e51915fbc0c62cb84d..e6f3f0247f82a77b920072d769e507daa7eab32e 100644 (file)
@@ -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.
index 786adda94308846ef16f5bb8b1df8a5dd209f63b..4a85b6cdea2f263de61356206107dc95d7e3faee 100644 (file)
@@ -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:
index 9fc9e6b9012e68294f8aac6682d9782dbde54587..1097dfb31821e5cd7015121dba17b8cb32b47a81 100755 (executable)
@@ -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;
index d9af8a53e71e5e7f4f999d2a9b9928edd3281b80..72957b454eb2b9ca8d55144b184f5cd55f33fe79 100755 (executable)
@@ -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);
 %}
 
-%)
index f78514dd80afbcc327c59e85711372521e8732ca..4b7b5f05165dcfa73b7d20797a2730fe77ea48fa 100755 (executable)
@@ -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")
index 9fa0cca1715cff7b31f46297efefdaab3ec9987a..9c3714f442ec67459f9885c01c844ceaf8728377 100644 (file)
@@ -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;
 
This page took 0.039901 seconds and 5 git commands to generate.