lkml.org 
[lkml]   [2007]   [Feb]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 29/59] elevator: move clearing of unplug flag earlier
    -stable review patch.  If anyone has any objections, please let us know.
    ------------------

    From: Linas Vepstas <linas@austin.ibm.com>

    A flag was recently added to the elevator code to avoid
    performing an unplug when reuests are being re-queued.
    The goal of this flag was to avoid a deep recursion that
    can occur when re-queueing requests after a SCSI device/host
    reset. See http://lkml.org/lkml/2006/5/17/254

    However, that fix added the flag near the bottom of a case
    statement, where an earlier break (in an if statement) could
    transport one out of the case, without setting the flag.
    This patch sets the flag earlier in the case statement.

    I re-discovered the deep recursion recently during testing;
    I was told that it was a known problem, and the fix to it was
    in the kernel I was testing. Indeed it was ... but it didn't
    fix the bug. With the patch below, I no longer see the bug.

    Signed-off by: Linas Vepstas <linas@austin.ibm.com>
    Signed-off-by: Jens Axboe <axboe@suse.de>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    ---
    block/elevator.c | 11 ++++++-----
    1 file changed, 6 insertions(+), 5 deletions(-)

    --- linux-2.6.19.2.orig/block/elevator.c
    +++ linux-2.6.19.2/block/elevator.c
    @@ -572,6 +572,12 @@ void elv_insert(request_queue_t *q, stru
    */
    rq->cmd_flags |= REQ_SOFTBARRIER;

    + /*
    + * Most requeues happen because of a busy condition,
    + * don't force unplug of the queue for that case.
    + */
    + unplug_it = 0;
    +
    if (q->ordseq == 0) {
    list_add(&rq->queuelist, &q->queue_head);
    break;
    @@ -586,11 +592,6 @@ void elv_insert(request_queue_t *q, stru
    }

    list_add_tail(&rq->queuelist, pos);
    - /*
    - * most requeues happen because of a busy condition, don't
    - * force unplug of the queue for that case.
    - */
    - unplug_it = 0;
    break;

    default:
    --
    -
    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/

    \
     
     \ /
      Last update: 2007-02-03 03:47    [W:4.234 / U:0.600 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site