• Douglas Anderson's avatar
    timers: Fix usleep_range() in the context of wake_up_process() · 6c5e9059
    Douglas Anderson authored
    Users of usleep_range() expect that it will _never_ return in less time
    than the minimum passed parameter. However, nothing in the code ensures
    this, when the sleeping task is woken by wake_up_process() or any other
    mechanism which can wake a task from uninterruptible state.
    
    Neither usleep_range() nor schedule_hrtimeout_range*() have any protection
    against wakeups. schedule_hrtimeout_range*() is designed this way despite
    the fact that the API documentation does not mention it.
    
    msleep() already has code to handle this case since it will loop as long
    as there was still time left.  usleep_range() has no such loop, add it.
    
    Presumably this problem was not detected before because usleep_range() is
    only used in a few places and the function is mostly used in contexts which
    are not exposed to wakeups of any form.
    
    An effort was made to look for users relying on the old behavior by
    looking for usleep_range() in the same file as wake_up_process().
    No problems were found by this search, though it is conceivable that
    someone could have put the sleep and wakeup in two different files.
    
    An effort was made to ask several upstream maintainers if they were aware
    of people relying on wake_up_process() to wake up usleep_range(). No
    maintainers were aware of that but they were aware of many people relying
    on usleep_range() never returning before the minimum.
    Reported-by: default avatarTao Huang <huangtao@rock-chips.com>
    Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
    Cc: heiko@sntech.de
    Cc: broonie@kernel.org
    Cc: briannorris@chromium.org
    Cc: Andreas Mohr <andi@lisas.de>
    Cc: linux-rockchip@lists.infradead.org
    Cc: tony.xie@rock-chips.com
    Cc: John Stultz <john.stultz@linaro.org>
    Cc: djkurtz@chromium.org
    Cc: linux@roeck-us.net
    Cc: tskd08@gmail.com
    Link: http://lkml.kernel.org/r/1477065531-30342-1-git-send-email-dianders@chromium.orgSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    6c5e9059
timer.c 54.3 KB