mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-30 11:04:25 +00:00
[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
1 changed files with 3 additions and 5 deletions
|
@ -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)
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
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,
|
||||||
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;
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue