timers: Fix documentation for schedule_timeout() and similar

The documentation for schedule_timeout(), schedule_hrtimeout(), and
schedule_hrtimeout_range() all claim that the routines couldn't possibly
return early if the task state was TASK_UNINTERRUPTIBLE. This is simply
not true since wake_up_process() will cause those routines to exit early.

We cannot make schedule_[hr]timeout() loop until the timeout expires if the
task state is uninterruptible because we have users which rely on the
existing and designed behaviour.

Make the documentation match the (correct) implementation.

schedule_hrtimeout() returns -EINTR even when a uninterruptible task was
woken up. This might look strange, but making the return code depend on the
state is too much of an effort as it would affect all the call sites. There
is no value in doing so, but we spell it out clearly in the documentation.

Suggested-by: Daniel Kurtz <djkurtz@chromium.org>
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Cc: huangtao@rock-chips.com
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: linux@roeck-us.net
Cc: tskd08@gmail.com
Link: http://lkml.kernel.org/r/1477065531-30342-2-git-send-email-dianders@chromium.org
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Douglas Anderson 2016-10-21 08:58:51 -07:00 committed by Thomas Gleixner
parent 6c5e905969
commit 4b7e9cf9c8
2 changed files with 21 additions and 10 deletions

View File

@ -1742,15 +1742,19 @@ schedule_hrtimeout_range_clock(ktime_t *expires, u64 delta,
* You can set the task state as follows - * You can set the task state as follows -
* *
* %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to
* pass before the routine returns. * pass before the routine returns unless the current task is explicitly
* woken up, (e.g. by wake_up_process()).
* *
* %TASK_INTERRUPTIBLE - the routine may return early if a signal is * %TASK_INTERRUPTIBLE - the routine may return early if a signal is
* delivered to the current task. * delivered to the current task or the current task is explicitly woken
* up.
* *
* The current task state is guaranteed to be TASK_RUNNING when this * The current task state is guaranteed to be TASK_RUNNING when this
* routine returns. * routine returns.
* *
* Returns 0 when the timer has expired otherwise -EINTR * Returns 0 when the timer has expired. If the task was woken before the
* timer expired by a signal (only possible in state TASK_INTERRUPTIBLE) or
* by an explicit wakeup, it returns -EINTR.
*/ */
int __sched schedule_hrtimeout_range(ktime_t *expires, u64 delta, int __sched schedule_hrtimeout_range(ktime_t *expires, u64 delta,
const enum hrtimer_mode mode) const enum hrtimer_mode mode)
@ -1772,15 +1776,19 @@ EXPORT_SYMBOL_GPL(schedule_hrtimeout_range);
* You can set the task state as follows - * You can set the task state as follows -
* *
* %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to * %TASK_UNINTERRUPTIBLE - at least @timeout time is guaranteed to
* pass before the routine returns. * pass before the routine returns unless the current task is explicitly
* woken up, (e.g. by wake_up_process()).
* *
* %TASK_INTERRUPTIBLE - the routine may return early if a signal is * %TASK_INTERRUPTIBLE - the routine may return early if a signal is
* delivered to the current task. * delivered to the current task or the current task is explicitly woken
* up.
* *
* The current task state is guaranteed to be TASK_RUNNING when this * The current task state is guaranteed to be TASK_RUNNING when this
* routine returns. * routine returns.
* *
* Returns 0 when the timer has expired otherwise -EINTR * Returns 0 when the timer has expired. If the task was woken before the
* timer expired by a signal (only possible in state TASK_INTERRUPTIBLE) or
* by an explicit wakeup, it returns -EINTR.
*/ */
int __sched schedule_hrtimeout(ktime_t *expires, int __sched schedule_hrtimeout(ktime_t *expires,
const enum hrtimer_mode mode) const enum hrtimer_mode mode)

View File

@ -1691,11 +1691,12 @@ static void process_timeout(unsigned long __data)
* You can set the task state as follows - * You can set the task state as follows -
* *
* %TASK_UNINTERRUPTIBLE - at least @timeout jiffies are guaranteed to * %TASK_UNINTERRUPTIBLE - at least @timeout jiffies are guaranteed to
* pass before the routine returns. The routine will return 0 * pass before the routine returns unless the current task is explicitly
* woken up, (e.g. by wake_up_process())".
* *
* %TASK_INTERRUPTIBLE - the routine may return early if a signal is * %TASK_INTERRUPTIBLE - the routine may return early if a signal is
* delivered to the current task. In this case the remaining time * delivered to the current task or the current task is explicitly woken
* in jiffies will be returned, or 0 if the timer expired in time * up.
* *
* The current task state is guaranteed to be TASK_RUNNING when this * The current task state is guaranteed to be TASK_RUNNING when this
* routine returns. * routine returns.
@ -1704,7 +1705,9 @@ static void process_timeout(unsigned long __data)
* the CPU away without a bound on the timeout. In this case the return * the CPU away without a bound on the timeout. In this case the return
* value will be %MAX_SCHEDULE_TIMEOUT. * value will be %MAX_SCHEDULE_TIMEOUT.
* *
* In all cases the return value is guaranteed to be non-negative. * Returns 0 when the timer has expired otherwise the remaining time in
* jiffies will be returned. In all cases the return value is guaranteed
* to be non-negative.
*/ */
signed long __sched schedule_timeout(signed long timeout) signed long __sched schedule_timeout(signed long timeout)
{ {