Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Stefan Raspl and committed by
Jens Axboe
756f8243 496aa8a9

+32
+32
include/linux/blktrace_api.h
··· 24 24 BLK_TC_AHEAD = 1 << 11, /* readahead */ 25 25 BLK_TC_META = 1 << 12, /* metadata */ 26 26 BLK_TC_DISCARD = 1 << 13, /* discard requests */ 27 + BLK_TC_DRV_DATA = 1 << 14, /* binary per-driver data */ 27 28 28 29 BLK_TC_END = 1 << 15, /* only 16-bits, reminder */ 29 30 }; ··· 52 51 __BLK_TA_BOUNCE, /* bio was bounced */ 53 52 __BLK_TA_REMAP, /* bio was remapped */ 54 53 __BLK_TA_ABORT, /* request aborted */ 54 + __BLK_TA_DRV_DATA, /* driver-specific binary data */ 55 55 }; 56 56 57 57 /* ··· 84 82 #define BLK_TA_BOUNCE (__BLK_TA_BOUNCE) 85 83 #define BLK_TA_REMAP (__BLK_TA_REMAP | BLK_TC_ACT(BLK_TC_QUEUE)) 86 84 #define BLK_TA_ABORT (__BLK_TA_ABORT | BLK_TC_ACT(BLK_TC_QUEUE)) 85 + #define BLK_TA_DRV_DATA (__BLK_TA_DRV_DATA | BLK_TC_ACT(BLK_TC_DRV_DATA)) 87 86 88 87 #define BLK_TN_PROCESS (__BLK_TN_PROCESS | BLK_TC_ACT(BLK_TC_NOTIFY)) 89 88 #define BLK_TN_TIMESTAMP (__BLK_TN_TIMESTAMP | BLK_TC_ACT(BLK_TC_NOTIFY)) ··· 320 317 __blk_add_trace(bt, from, bio->bi_size, bio->bi_rw, BLK_TA_REMAP, !bio_flagged(bio, BIO_UPTODATE), sizeof(r), &r); 321 318 } 322 319 320 + /** 321 + * blk_add_driver_data - Add binary message with driver-specific data 322 + * @q: queue the io is for 323 + * @rq: io request 324 + * @data: driver-specific data 325 + * @len: length of driver-specific data 326 + * 327 + * Description: 328 + * Some drivers might want to write driver-specific data per request. 329 + * 330 + **/ 331 + static inline void blk_add_driver_data(struct request_queue *q, 332 + struct request *rq, 333 + void *data, size_t len) 334 + { 335 + struct blk_trace *bt = q->blk_trace; 336 + 337 + if (likely(!bt)) 338 + return; 339 + 340 + if (blk_pc_request(rq)) 341 + __blk_add_trace(bt, 0, rq->data_len, 0, BLK_TA_DRV_DATA, 342 + rq->errors, len, data); 343 + else 344 + __blk_add_trace(bt, rq->hard_sector, rq->hard_nr_sectors << 9, 345 + 0, BLK_TA_DRV_DATA, rq->errors, len, data); 346 + } 347 + 323 348 extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev, 324 349 char __user *arg); 325 350 extern int blk_trace_startstop(struct request_queue *q, int start); ··· 361 330 #define blk_add_trace_generic(q, rq, rw, what) do { } while (0) 362 331 #define blk_add_trace_pdu_int(q, what, bio, pdu) do { } while (0) 363 332 #define blk_add_trace_remap(q, bio, dev, f, t) do {} while (0) 333 + #define blk_add_driver_data(q, rq, data, len) do {} while (0) 364 334 #define do_blk_trace_setup(q, name, dev, buts) (-ENOTTY) 365 335 #define blk_trace_setup(q, name, dev, arg) (-ENOTTY) 366 336 #define blk_trace_startstop(q, start) (-ENOTTY)