• Petr Vandrovec's avatar
    [PATCH] rtc: msleep() cannot be used from interrupt · 403fe5ae
    Petr Vandrovec authored
    Since the beginning of July my Opteron box was randomly crashing and
    being rebooted by hardware watchdog.  Today it finally did it in front
    of me, and this patch will hopefully fix it.
    
    The problem is that at the end of June (the 28th, to be exact: commit
    47f176fd, "[PATCH] Using msleep()
    instead of HZ") rtc_get_rtc_time was converted to use msleep() instead
    of busy waiting.  But rtc_get_rtc_time is used by hpet_rtc_interrupt,
    and scheduling is not allowed during interrupt.  So I'm reverting this
    part of original change, replacing msleep() back with busy loop.
    
    The original code was busy waiting for up to 20ms, but on my hardware in
    the worst case update-in-progress bit was asserted for at most 363
    passes through loop (on 2GHz dual Opteron), much less than even one
    jiffie, not even talking about 20ms.  So I changed code to just wait
    only as long as necessary.  Otherwise when RTC was set to generate
    8192Hz timer, it stopped doing anything for 20ms (160 pulses were
    skipped!) from time to time, and this is rather suboptimal as far as I
    can tell.
    Signed-off-by: default avatarPetr Vandrovec <vandrove@vc.cvut.cz>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    403fe5ae
rtc.c 31.7 KB