lkml.org 
[lkml]   [2009]   [Jan]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: regression: 295f000 breaks suspend to disk
    Date
    On Monday 12 January 2009, Simon Holm Thøgersen wrote:
    > commit 295f000 ("ide: don't execute the next queued command from the
    > hard-IRQ context (v2)") breaks suspend to disk for me. On
    > 'echo disk > /sys/power/state' the systems hangs, letting me switch
    > virtual consoles, but not responding to Alt+SysRq

    Thanks, please try the patch below (it fixes the problem for me):

    From: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
    Subject: [PATCH] ide: fix suspend regression

    On Monday 12 January 2009, Simon Holm Thøgersen wrote:
    > commit 295f000 ("ide: don't execute the next queued command from the
    > hard-IRQ context (v2)") breaks suspend to disk for me. On
    > 'echo disk > /sys/power/state' the systems hangs, letting me switch
    > virtual consoles, but not responding to Alt+SysRq

    Restart the request queue early for REQ_TYPE_PM_RESUME requests
    (though there is only one resume request for the whole resume
    sequence it stays in the queue until is fully completed and now
    depends on kblockd for processing consequential resume states).

    Reported-and-bisected-by: Simon Holm Thøgersen <odie@cs.aau.dk>
    Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
    ---
    drivers/ide/ide-pm.c | 12 ++++++++----
    1 file changed, 8 insertions(+), 4 deletions(-)

    Index: b/drivers/ide/ide-pm.c
    ===================================================================
    --- a/drivers/ide/ide-pm.c
    +++ b/drivers/ide/ide-pm.c
    @@ -186,12 +186,10 @@ void ide_complete_pm_request(ide_drive_t
    blk_pm_suspend_request(rq) ? "suspend" : "resume");
    #endif
    spin_lock_irqsave(q->queue_lock, flags);
    - if (blk_pm_suspend_request(rq)) {
    + if (blk_pm_suspend_request(rq))
    blk_stop_queue(q);
    - } else {
    + else
    drive->dev_flags &= ~IDE_DFLAG_BLOCKED;
    - blk_start_queue(q);
    - }
    spin_unlock_irqrestore(q->queue_lock, flags);

    drive->hwif->rq = NULL;
    @@ -219,6 +217,8 @@ void ide_check_pm_state(ide_drive_t *dri
    * point.
    */
    ide_hwif_t *hwif = drive->hwif;
    + struct request_queue *q = drive->queue;
    + unsigned long flags;
    int rc;
    #ifdef DEBUG_PM
    printk("%s: Wakeup request inited, waiting for !BSY...\n", drive->name);
    @@ -231,5 +231,9 @@ void ide_check_pm_state(ide_drive_t *dri
    rc = ide_wait_not_busy(hwif, 100000);
    if (rc)
    printk(KERN_WARNING "%s: drive not ready on wakeup\n", drive->name);
    +
    + spin_lock_irqsave(q->queue_lock, flags);
    + blk_start_queue(q);
    + spin_unlock_irqrestore(q->queue_lock, flags);
    }
    }
    --
    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: 2009-01-14 18:25    [W:0.024 / U:60.848 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site