mirror of
https://github.com/torvalds/linux.git
synced 2024-11-13 07:31:45 +00:00
blktrace: Provide event for request merging
Currently blk-mq does not report any event when two requests get merged in the elevator. This then results in difficult to understand sequence of events like: ... 8,0 34 1579 0.608765271 2718 I WS 215023504 + 40 [dbench] 8,0 34 1584 0.609184613 2719 A WS 215023544 + 56 <- (8,4) 2160568 8,0 34 1585 0.609184850 2719 Q WS 215023544 + 56 [dbench] 8,0 34 1586 0.609188524 2719 G WS 215023544 + 56 [dbench] 8,0 3 602 0.609684162 773 D WS 215023504 + 96 [kworker/3:1H] 8,0 34 1591 0.609843593 0 C WS 215023504 + 96 [0] and you can only guess (after quite some headscratching since the above excerpt is intermixed with a lot of other IO) that request 215023544+56 got merged to request 215023504+40. Provide proper event for request merging like we used to do in the legacy block layer. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
621c1f4294
commit
f3bdc62fd8
@ -793,6 +793,8 @@ static struct request *attempt_merge(struct request_queue *q,
|
|||||||
*/
|
*/
|
||||||
blk_account_io_merge_request(next);
|
blk_account_io_merge_request(next);
|
||||||
|
|
||||||
|
trace_block_rq_merge(q, next);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ownership of bio passed from next to req, return 'next' for
|
* ownership of bio passed from next to req, return 'next' for
|
||||||
* the caller to free
|
* the caller to free
|
||||||
|
@ -211,6 +211,21 @@ DEFINE_EVENT(block_rq, block_rq_issue,
|
|||||||
TP_ARGS(q, rq)
|
TP_ARGS(q, rq)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* block_rq_merge - merge request with another one in the elevator
|
||||||
|
* @q: queue holding operation
|
||||||
|
* @rq: block IO operation operation request
|
||||||
|
*
|
||||||
|
* Called when block operation request @rq from queue @q is merged to another
|
||||||
|
* request queued in the elevator.
|
||||||
|
*/
|
||||||
|
DEFINE_EVENT(block_rq, block_rq_merge,
|
||||||
|
|
||||||
|
TP_PROTO(struct request_queue *q, struct request *rq),
|
||||||
|
|
||||||
|
TP_ARGS(q, rq)
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* block_bio_bounce - used bounce buffer when processing block operation
|
* block_bio_bounce - used bounce buffer when processing block operation
|
||||||
* @q: queue holding the block operation
|
* @q: queue holding the block operation
|
||||||
|
@ -860,6 +860,13 @@ static void blk_add_trace_rq_issue(void *ignore,
|
|||||||
blk_trace_request_get_cgid(q, rq));
|
blk_trace_request_get_cgid(q, rq));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void blk_add_trace_rq_merge(void *ignore,
|
||||||
|
struct request_queue *q, struct request *rq)
|
||||||
|
{
|
||||||
|
blk_add_trace_rq(rq, 0, blk_rq_bytes(rq), BLK_TA_BACKMERGE,
|
||||||
|
blk_trace_request_get_cgid(q, rq));
|
||||||
|
}
|
||||||
|
|
||||||
static void blk_add_trace_rq_requeue(void *ignore,
|
static void blk_add_trace_rq_requeue(void *ignore,
|
||||||
struct request_queue *q,
|
struct request_queue *q,
|
||||||
struct request *rq)
|
struct request *rq)
|
||||||
@ -1144,6 +1151,8 @@ static void blk_register_tracepoints(void)
|
|||||||
WARN_ON(ret);
|
WARN_ON(ret);
|
||||||
ret = register_trace_block_rq_issue(blk_add_trace_rq_issue, NULL);
|
ret = register_trace_block_rq_issue(blk_add_trace_rq_issue, NULL);
|
||||||
WARN_ON(ret);
|
WARN_ON(ret);
|
||||||
|
ret = register_trace_block_rq_merge(blk_add_trace_rq_merge, NULL);
|
||||||
|
WARN_ON(ret);
|
||||||
ret = register_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL);
|
ret = register_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL);
|
||||||
WARN_ON(ret);
|
WARN_ON(ret);
|
||||||
ret = register_trace_block_rq_complete(blk_add_trace_rq_complete, NULL);
|
ret = register_trace_block_rq_complete(blk_add_trace_rq_complete, NULL);
|
||||||
@ -1190,6 +1199,7 @@ static void blk_unregister_tracepoints(void)
|
|||||||
unregister_trace_block_bio_bounce(blk_add_trace_bio_bounce, NULL);
|
unregister_trace_block_bio_bounce(blk_add_trace_bio_bounce, NULL);
|
||||||
unregister_trace_block_rq_complete(blk_add_trace_rq_complete, NULL);
|
unregister_trace_block_rq_complete(blk_add_trace_rq_complete, NULL);
|
||||||
unregister_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL);
|
unregister_trace_block_rq_requeue(blk_add_trace_rq_requeue, NULL);
|
||||||
|
unregister_trace_block_rq_merge(blk_add_trace_rq_merge, NULL);
|
||||||
unregister_trace_block_rq_issue(blk_add_trace_rq_issue, NULL);
|
unregister_trace_block_rq_issue(blk_add_trace_rq_issue, NULL);
|
||||||
unregister_trace_block_rq_insert(blk_add_trace_rq_insert, NULL);
|
unregister_trace_block_rq_insert(blk_add_trace_rq_insert, NULL);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user