[PATCH] dio: call blk_run_address_space() once per op
We only need to call blk_run_address_space() once after all the bios for the direct IO op have been submitted. This removes the chance of calling blk_run_address_space() after spurious wake ups as the sync path waits for bios to drain. It's also one less difference betwen the sync and async paths. In the process we remove a redundant dio_bio_submit() that its caller had already performed. Signed-off-by: Zach Brown <zach.brown@oracle.com> Cc: Badari Pulavarty <pbadari@us.ibm.com> Cc: Suparna Bhattacharya <suparna@in.ibm.com> Acked-by: Jeff Moyer <jmoyer@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
		
							parent
							
								
									6d544bb4d9
								
							
						
					
					
						commit
						17a7b1d74b
					
				| @ -404,7 +404,6 @@ static struct bio *dio_await_one(struct dio *dio) | ||||
| 		if (dio->bio_list == NULL) { | ||||
| 			dio->waiter = current; | ||||
| 			spin_unlock_irqrestore(&dio->bio_lock, flags); | ||||
| 			blk_run_address_space(dio->inode->i_mapping); | ||||
| 			io_schedule(); | ||||
| 			spin_lock_irqsave(&dio->bio_lock, flags); | ||||
| 			dio->waiter = NULL; | ||||
| @ -450,9 +449,6 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio) | ||||
|  */ | ||||
| static void dio_await_completion(struct dio *dio) | ||||
| { | ||||
| 	if (dio->bio) | ||||
| 		dio_bio_submit(dio); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * The bio_lock is not held for the read of bio_count. | ||||
| 	 * This is ok since it is the dio_bio_complete() that changes | ||||
| @ -1085,6 +1081,9 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, | ||||
| 	if (dio->bio) | ||||
| 		dio_bio_submit(dio); | ||||
| 
 | ||||
| 	/* All IO is now issued, send it on its way */ | ||||
| 	blk_run_address_space(inode->i_mapping); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * It is possible that, we return short IO due to end of file. | ||||
| 	 * In that case, we need to release all the pages we got hold on. | ||||
| @ -1113,7 +1112,6 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, | ||||
| 		if (ret == 0) | ||||
| 			ret = dio->result; | ||||
| 		finished_one_bio(dio);		/* This can free the dio */ | ||||
| 		blk_run_address_space(inode->i_mapping); | ||||
| 		if (should_wait) { | ||||
| 			unsigned long flags; | ||||
| 			/*
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user