]> Git Repo - linux.git/commit - include/linux/wait.h
wait: fix false timeouts when using wait_event_timeout()
authorImre Deak <[email protected]>
Fri, 24 May 2013 22:55:09 +0000 (15:55 -0700)
committerLinus Torvalds <[email protected]>
Fri, 24 May 2013 23:22:50 +0000 (16:22 -0700)
commit4c663cfc523a88d97a8309b04a089c27dc57fd7e
treed3b9de53922dbc326017075bd5e1558b5f8c741d
parent7b92d03c3239f43e5b86c9cc9630f026d36ee995
wait: fix false timeouts when using wait_event_timeout()

Many callers of the wait_event_timeout() and
wait_event_interruptible_timeout() expect that the return value will be
positive if the specified condition becomes true before the timeout
elapses.  However, at the moment this isn't guaranteed.  If the wake-up
handler is delayed enough, the time remaining until timeout will be
calculated as 0 - and passed back as a return value - even if the
condition became true before the timeout has passed.

Fix this by returning at least 1 if the condition becomes true.  This
semantic is in line with what wait_for_condition_timeout() does; see
commit bb10ed09 ("sched: fix wait_for_completion_timeout() spurious
failure under heavy load").

Daniel said "We have 3 instances of this bug in drm/i915.  One case even
where we switch between the interruptible and not interruptible
wait_event_timeout variants, foolishly presuming they have the same
semantics.  I very much like this."

One such bug is reported at
  https://bugs.freedesktop.org/show_bug.cgi?id=64133

Signed-off-by: Imre Deak <[email protected]>
Acked-by: Daniel Vetter <[email protected]>
Acked-by: David Howells <[email protected]>
Acked-by: Jens Axboe <[email protected]>
Cc: "Paul E. McKenney" <[email protected]>
Cc: Dave Jones <[email protected]>
Cc: Lukas Czerner <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
include/linux/wait.h
This page took 0.048118 seconds and 4 git commands to generate.