blk-mq: refactor request insertion/merging
Refactor the logic around adding a new bio to a software queue, so we nest the ctx->lock where we really need it (merge and insertion) and don't hold it when we don't (init and IO start accounting). Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
		
					parent
					
						
							
								98bc1f272a
							
						
					
				
			
			
				commit
				
					
						c6d600c65e
					
				
			
		
					 1 changed files with 15 additions and 7 deletions
				
			
		|  | @ -1037,17 +1037,25 @@ static void blk_mq_make_request(struct request_queue *q, struct bio *bio) | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	spin_lock(&ctx->lock); | ||||
| 	if (!(hctx->flags & BLK_MQ_F_SHOULD_MERGE)) { | ||||
| 		init_request_from_bio(rq, bio); | ||||
| 
 | ||||
| 	if ((hctx->flags & BLK_MQ_F_SHOULD_MERGE) && | ||||
| 	    blk_mq_attempt_merge(q, ctx, bio)) | ||||
| 		__blk_mq_free_request(hctx, ctx, rq); | ||||
| 	else { | ||||
| 		blk_mq_bio_to_request(rq, bio); | ||||
| 		spin_lock(&ctx->lock); | ||||
| insert_rq: | ||||
| 		__blk_mq_insert_request(hctx, rq, false); | ||||
| 		spin_unlock(&ctx->lock); | ||||
| 		blk_account_io_start(rq, 1); | ||||
| 	} else { | ||||
| 		spin_lock(&ctx->lock); | ||||
| 		if (!blk_mq_attempt_merge(q, ctx, bio)) { | ||||
| 			init_request_from_bio(rq, bio); | ||||
| 			goto insert_rq; | ||||
| 		} | ||||
| 
 | ||||
| 		spin_unlock(&ctx->lock); | ||||
| 		__blk_mq_free_request(hctx, ctx, rq); | ||||
| 	} | ||||
| 
 | ||||
| 	spin_unlock(&ctx->lock); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * For a SYNC request, send it to the hardware immediately. For an | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jens Axboe
				Jens Axboe