diff options
| author | Stefan Raspl <raspl@linux.vnet.ibm.com> | 2008-10-16 02:23:21 -0400 |
|---|---|---|
| committer | Jens Axboe <jens.axboe@oracle.com> | 2008-10-17 02:46:57 -0400 |
| commit | 756f8243188e013bd067811cdc0cc60760abfdf9 (patch) | |
| tree | 7f9c994c60e1e0ccd8100b33a1c4be8545004341 | |
| parent | 496aa8a98f5ab22ced46be5dc2087cdf3d029bd7 (diff) | |
blktrace: add support for driver data
This patch adds the new api call blk_add_driver_data() to blktrace.
It allows to trace device driver-specific binary data.
Signed-off-by: Stefan Raspl <raspl@linux.vnet.ibm.com>
Signed-off-by: Martin Peschke <mp3@de.ibm.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
| -rw-r--r-- | include/linux/blktrace_api.h | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 3a31eb506164..bdf505d33e77 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h | |||
| @@ -24,6 +24,7 @@ enum blktrace_cat { | |||
| 24 | BLK_TC_AHEAD = 1 << 11, /* readahead */ | 24 | BLK_TC_AHEAD = 1 << 11, /* readahead */ |
| 25 | BLK_TC_META = 1 << 12, /* metadata */ | 25 | BLK_TC_META = 1 << 12, /* metadata */ |
| 26 | BLK_TC_DISCARD = 1 << 13, /* discard requests */ | 26 | BLK_TC_DISCARD = 1 << 13, /* discard requests */ |
| 27 | BLK_TC_DRV_DATA = 1 << 14, /* binary per-driver data */ | ||
| 27 | 28 | ||
| 28 | BLK_TC_END = 1 << 15, /* only 16-bits, reminder */ | 29 | BLK_TC_END = 1 << 15, /* only 16-bits, reminder */ |
| 29 | }; | 30 | }; |
| @@ -51,6 +52,7 @@ enum blktrace_act { | |||
| 51 | __BLK_TA_BOUNCE, /* bio was bounced */ | 52 | __BLK_TA_BOUNCE, /* bio was bounced */ |
| 52 | __BLK_TA_REMAP, /* bio was remapped */ | 53 | __BLK_TA_REMAP, /* bio was remapped */ |
| 53 | __BLK_TA_ABORT, /* request aborted */ | 54 | __BLK_TA_ABORT, /* request aborted */ |
| 55 | __BLK_TA_DRV_DATA, /* driver-specific binary data */ | ||
| 54 | }; | 56 | }; |
| 55 | 57 | ||
| 56 | /* | 58 | /* |
| @@ -82,6 +84,7 @@ enum blktrace_notify { | |||
| 82 | #define BLK_TA_BOUNCE (__BLK_TA_BOUNCE) | 84 | #define BLK_TA_BOUNCE (__BLK_TA_BOUNCE) |
| 83 | #define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE)) | 85 | #define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE)) |
| 84 | #define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE)) | 86 | #define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE)) |
| 87 | #define BLK_TA_DRV_DATA (__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA)) | ||
| 85 | 88 | ||
| 86 | #define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY)) | 89 | #define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY)) |
| 87 | #define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY)) | 90 | #define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY)) |
| @@ -317,6 +320,34 @@ static inline void blk_add_trace_remap(struct request_queue *q, struct bio *bio, | |||
| 317 | __blk_add_trace(bt, from, bio->bi_size, bio->bi_rw, BLK_TA_REMAP, !bio_flagged(bio, BIO_UPTODATE), sizeof(r), &r); | 320 | __blk_add_trace(bt, from, bio->bi_size, bio->bi_rw, BLK_TA_REMAP, !bio_flagged(bio, BIO_UPTODATE), sizeof(r), &r); |
| 318 | } | 321 | } |
| 319 | 322 | ||
| 323 | /** | ||
| 324 | * blk_add_driver_data - Add binary message with driver-specific data | ||
| 325 | * @q: queue the io is for | ||
| 326 | * @rq: io request | ||
| 327 | * @data: driver-specific data | ||
| 328 | * @len: length of driver-specific data | ||
| 329 | * | ||
| 330 | * Description: | ||
| 331 | * Some drivers might want to write driver-specific data per request. | ||
| 332 | * | ||
| 333 | **/ | ||
| 334 | static inline void blk_add_driver_data(struct request_queue *q, | ||
| 335 | struct request *rq, | ||
| 336 | void *data, size_t len) | ||
| 337 | { | ||
| 338 | struct blk_trace *bt = q->blk_trace; | ||
| 339 | |||
| 340 | if (likely(!bt)) | ||
| 341 | return; | ||
| 342 | |||
| 343 | if (blk_pc_request(rq)) | ||
| 344 | __blk_add_trace(bt, 0, rq->data_len, 0, BLK_TA_DRV_DATA, | ||
| 345 | rq->errors, len, data); | ||
| 346 | else | ||
| 347 | __blk_add_trace(bt, rq->hard_sector, rq->hard_nr_sectors << 9, | ||
| 348 | 0, BLK_TA_DRV_DATA, rq->errors, len, data); | ||
| 349 | } | ||
| 350 | |||
| 320 | extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, | 351 | extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, |
| 321 | char __user *arg); | 352 | char __user *arg); |
| 322 | extern int blk_trace_startstop(struct request_queue *q, int start); | 353 | extern int blk_trace_startstop(struct request_queue *q, int start); |
| @@ -330,6 +361,7 @@ extern int blk_trace_remove(struct request_queue *q); | |||
| 330 | #define blk_add_trace_generic(q, rq, rw, what) do { } while (0) | 361 | #define blk_add_trace_generic(q, rq, rw, what) do { } while (0) |
| 331 | #define blk_add_trace_pdu_int(q, what, bio, pdu) do { } while (0) | 362 | #define blk_add_trace_pdu_int(q, what, bio, pdu) do { } while (0) |
| 332 | #define blk_add_trace_remap(q, bio, dev, f, t) do {} while (0) | 363 | #define blk_add_trace_remap(q, bio, dev, f, t) do {} while (0) |
| 364 | #define blk_add_driver_data(q, rq, data, len) do {} while (0) | ||
| 333 | #define do_blk_trace_setup(q, name, dev, buts) (-ENOTTY) | 365 | #define do_blk_trace_setup(q, name, dev, buts) (-ENOTTY) |
| 334 | #define blk_trace_setup(q, name, dev, arg) (-ENOTTY) | 366 | #define blk_trace_setup(q, name, dev, arg) (-ENOTTY) |
| 335 | #define blk_trace_startstop(q, start) (-ENOTTY) | 367 | #define blk_trace_startstop(q, start) (-ENOTTY) |
