Commit f3bdc62f authored by Jan Kara's avatar Jan Kara Committed by Jens Axboe

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: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 621c1f42
...@@ -793,6 +793,8 @@ static struct request *attempt_merge(struct request_queue *q, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment