Commit 17a7b1d7 authored by Zach Brown's avatar Zach Brown Committed by Linus Torvalds

[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: default avatarZach Brown <zach.brown@oracle.com>
Cc: Badari Pulavarty <pbadari@us.ibm.com>
Cc: Suparna Bhattacharya <suparna@in.ibm.com>
Acked-by: default avatarJeff Moyer <jmoyer@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6d544bb4
...@@ -404,7 +404,6 @@ static struct bio *dio_await_one(struct dio *dio) ...@@ -404,7 +404,6 @@ static struct bio *dio_await_one(struct dio *dio)
if (dio->bio_list == NULL) { if (dio->bio_list == NULL) {
dio->waiter = current; dio->waiter = current;
spin_unlock_irqrestore(&dio->bio_lock, flags); spin_unlock_irqrestore(&dio->bio_lock, flags);
blk_run_address_space(dio->inode->i_mapping);
io_schedule(); io_schedule();
spin_lock_irqsave(&dio->bio_lock, flags); spin_lock_irqsave(&dio->bio_lock, flags);
dio->waiter = NULL; dio->waiter = NULL;
...@@ -450,9 +449,6 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio) ...@@ -450,9 +449,6 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio)
*/ */
static void dio_await_completion(struct dio *dio) 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. * The bio_lock is not held for the read of bio_count.
* This is ok since it is the dio_bio_complete() that changes * 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, ...@@ -1085,6 +1081,9 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode,
if (dio->bio) if (dio->bio)
dio_bio_submit(dio); 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. * 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. * 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, ...@@ -1113,7 +1112,6 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode,
if (ret == 0) if (ret == 0)
ret = dio->result; ret = dio->result;
finished_one_bio(dio); /* This can free the dio */ finished_one_bio(dio); /* This can free the dio */
blk_run_address_space(inode->i_mapping);
if (should_wait) { if (should_wait) {
unsigned long flags; unsigned long flags;
/* /*
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment