[PATCH] Move the second call to get_request to the end of the loop - Kernel

This is a discussion on [PATCH] Move the second call to get_request to the end of the loop - Kernel ; 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: Zhang Yanmin --- --- linux-2.6.26-rc3/block/blk-core.c 2008-05-19 ...

+ Reply to Thread
Results 1 to 2 of 2

Thread: [PATCH] Move the second call to get_request to the end of the loop

  1. [PATCH] 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: Zhang Yanmin

    ---

    --- linux-2.6.26-rc3/block/blk-core.c 2008-05-19 07:17:18.000000000 +0800
    +++ linux-2.6.26-rc3_block/block/blk-core.c 2008-05-22 07:00:15.000000000 +0800
    @@ -806,35 +806,32 @@ static struct request *get_request_wait(
    rq = get_request(q, rw_flags, bio, GFP_NOIO);
    while (!rq) {
    DEFINE_WAIT(wait);
    + struct io_context *ioc;
    struct request_list *rl = &q->rq;

    prepare_to_wait_exclusive(&rl->wait[rw], &wait,
    TASK_UNINTERRUPTIBLE);

    - rq = get_request(q, rw_flags, bio, GFP_NOIO);
    -
    - if (!rq) {
    - struct io_context *ioc;
    + blk_add_trace_generic(q, bio, rw, BLK_TA_SLEEPRQ);

    - blk_add_trace_generic(q, bio, rw, BLK_TA_SLEEPRQ);
    -
    - __generic_unplug_device(q);
    - spin_unlock_irq(q->queue_lock);
    - io_schedule();
    + __generic_unplug_device(q);
    + spin_unlock_irq(q->queue_lock);
    + io_schedule();

    - /*
    - * After sleeping, we become a "batching" process and
    - * will be able to allocate at least one request, and
    - * up to a big batch of them for a small period time.
    - * See ioc_batching, ioc_set_batching
    - */
    - ioc = current_io_context(GFP_NOIO, q->node);
    - ioc_set_batching(q, ioc);
    + /*
    + * After sleeping, we become a "batching" process and
    + * will be able to allocate at least one request, and
    + * up to a big batch of them for a small period time.
    + * See ioc_batching, ioc_set_batching
    + */
    + ioc = current_io_context(GFP_NOIO, q->node);
    + ioc_set_batching(q, ioc);

    - spin_lock_irq(q->queue_lock);
    - }
    + spin_lock_irq(q->queue_lock);
    finish_wait(&rl->wait[rw], &wait);
    - }
    +
    + rq = get_request(q, rw_flags, bio, GFP_NOIO);
    + };

    return rq;
    }


    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

  2. Re: [PATCH] Move the second call to get_request to the end of the loop

    On Thu, May 22 2008, Zhang, Yanmin wrote:
    > 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.


    Looks safe enough, since we don't drop the lock in between getting the
    request and adding to the wait queue. I'll add it to the testing mix,
    thanks!


    --
    Jens Axboe

    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

+ Reply to Thread