• john stultz's avatar
    PIT fixes to unbreak suspend/resume (bug #14222) · 112a62dd
    john stultz authored
    Resolved differently upstream in commit 8cab02dc
    
    Ondrej Zary reported a suspend/resume hang with 2.6.31 in bug #14222.
    
    http://bugzilla.kernel.org/show_bug.cgi?id=14222
    
    The hang was bisected to c7121843
    however, that was really just the last straw that caused the issue.
    
    The problem was that on suspend, the PIT is removed as a clocksource,
    and was using the mult value essentially as a is_enabled() flag. The
    mult adjustments done in the commit above caused that usage to break,
    causing bad list manipulation and the oops.
    
    Further, on resume, the PIT clocksource is never restored, causing the
    system to run in a degraded mode with jiffies as the clocksource.
    
    This issue has since been resolved in 2.6.32-rc by commit
    8cab02dc which removes the clocksource
    disabling on suspend. Testing shows no issues there.
    
    So the following patch rectifies the situation for 2.6.31 users of the
    PIT clocksource that use suspend and resume (which is probably not that
    many).
    
    Many thanks to Ondrej for helping narrow down what was happening, what
    caused it, and verifying the fix.
    
    ---------------
    
    Avoid using the unprotected clocksource.mult value as an "is_registered"
    flag, instead us an explicit flag variable. This avoids possible list
    corruption if the clocksource is double-unregistered.
    
    Also re-register the PIT clocksource on resume so folks don't have to
    use jiffies after suspend.
    Signed-off-by: default avatarJohn Stultz <johnstul@us.ibm.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    112a62dd
i8253.c 6.24 KB