mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08: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
	 Jan Kara
						Jan Kara