Commit 05caf8db authored by Zhang, Yanmin's avatar Zhang, Yanmin Committed by Jens Axboe

block: Move the second call to get_request to the end of the loop

In function get_request_wait, the second call to get_request could be
moved to the end of the while loop, because if the first call to
get_request fails, the second call will fail without sleep.
Signed-off-by: default avatarZhang Yanmin <yanmin.zhang@intel.com>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent ca39d651
...@@ -806,35 +806,32 @@ static struct request *get_request_wait(struct request_queue *q, int rw_flags, ...@@ -806,35 +806,32 @@ static struct request *get_request_wait(struct request_queue *q, int rw_flags,
rq = get_request(q, rw_flags, bio, GFP_NOIO); rq = get_request(q, rw_flags, bio, GFP_NOIO);
while (!rq) { while (!rq) {
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
struct io_context *ioc;
struct request_list *rl = &q->rq; struct request_list *rl = &q->rq;
prepare_to_wait_exclusive(&rl->wait[rw], &wait, prepare_to_wait_exclusive(&rl->wait[rw], &wait,
TASK_UNINTERRUPTIBLE); TASK_UNINTERRUPTIBLE);
rq = get_request(q, rw_flags, bio, GFP_NOIO); blk_add_trace_generic(q, bio, rw, BLK_TA_SLEEPRQ);
if (!rq) {
struct io_context *ioc;
blk_add_trace_generic(q, bio, rw, BLK_TA_SLEEPRQ); __generic_unplug_device(q);
spin_unlock_irq(q->queue_lock);
__generic_unplug_device(q); io_schedule();
spin_unlock_irq(q->queue_lock);
io_schedule();
/* /*
* After sleeping, we become a "batching" process and * After sleeping, we become a "batching" process and
* will be able to allocate at least one request, and * will be able to allocate at least one request, and
* up to a big batch of them for a small period time. * up to a big batch of them for a small period time.
* See ioc_batching, ioc_set_batching * See ioc_batching, ioc_set_batching
*/ */
ioc = current_io_context(GFP_NOIO, q->node); ioc = current_io_context(GFP_NOIO, q->node);
ioc_set_batching(q, ioc); ioc_set_batching(q, ioc);
spin_lock_irq(q->queue_lock); spin_lock_irq(q->queue_lock);
}
finish_wait(&rl->wait[rw], &wait); finish_wait(&rl->wait[rw], &wait);
}
rq = get_request(q, rw_flags, bio, GFP_NOIO);
};
return rq; return rq;
} }
......
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