diff options
author | Zach Brown <zach.brown@oracle.com> | 2006-12-10 02:20:56 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-10 09:57:21 -0800 |
commit | 17a7b1d74b1207f8f1af40b5d184989076d08f8b (patch) | |
tree | 18dceaf00a1ae275fb770c83cec0eae81662352a /fs | |
parent | 6d544bb4d9019c3a0d7ee4af1e4bbbd61a6e16dc (diff) | |
download | lwn-17a7b1d74b1207f8f1af40b5d184989076d08f8b.tar.gz lwn-17a7b1d74b1207f8f1af40b5d184989076d08f8b.zip |
[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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/direct-io.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c index b57b671e1106..b296942ff7d5 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -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; /* |