Skip to content

Commit

Permalink
[PATCH] dio: call blk_run_address_space() once per op
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Badari Pulavarty <[email protected]>
Cc: Suparna Bhattacharya <[email protected]>
Acked-by: Jeff Moyer <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Zach Brown authored and Linus Torvalds committed Dec 10, 2006
1 parent 6d544bb commit 17a7b1d
Showing 1 changed file with 3 additions and 5 deletions.
8 changes: 3 additions & 5 deletions fs/direct-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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;
/*
Expand Down

0 comments on commit 17a7b1d

Please sign in to comment.