// 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. 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 { update_record() } probe _addevent.ioscheduler.elv_next_request = ioscheduler.elv_next_request { log_ioscheduler_tracedata_elv_next(HOOKID_IOSCHED_NEXT_REQ, $q) } /* when a request is added to the request queue */ probe addevent.ioscheduler.elv_add_request += _addevent.ioscheduler.elv_add_request { update_record() } probe _addevent.ioscheduler.elv_add_request = ioscheduler.elv_add_request { log_ioscheduler_tracedata_others(HOOKID_IOSCHED_ADD_REQ, $q, $rq) } /* when a request is completed */ probe addevent.ioscheduler.elv_completed_request += _addevent.ioscheduler.elv_completed_request { update_record() } probe _addevent.ioscheduler.elv_completed_request = ioscheduler.elv_completed_request { log_ioscheduler_tracedata_others(HOOKID_IOSCHED_COMPLETE_REQ, $q, $rq) } %{ #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) %{ 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); %} %) /* 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) %{ 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); } %} %: function log_ioscheduler_tracedata_elv_next(var_id:long, var: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); } %} %)