Code in kernel which incorrectly used the non-killable variants could end up having waits killed improperly. The respective killable waits have been upstream for a while: o wait_for_completion_killable() o wait_for_completion_killable_timeout() swait has been upstream since v4.6. Older kernels have had the above variants in place for a long time. Cc: stable <stable@xxxxxxxxxxxxxxx> # 4.6 Signed-off-by: Luis R. Rodriguez <mcgrof@xxxxxxxxxx> --- include/linux/swait.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/include/linux/swait.h b/include/linux/swait.h index c1f9c62a8a50..2c700694d50a 100644 --- a/include/linux/swait.h +++ b/include/linux/swait.h @@ -169,4 +169,29 @@ do { \ __ret; \ }) +#define __swait_event_killable(wq, condition) \ + ___swait_event(wq, condition, TASK_KILLABLE, 0, schedule()) + +#define swait_event_killable(wq, condition) \ +({ \ + int __ret = 0; \ + if (!(condition)) \ + __ret = __swait_event_killable(wq, condition); \ + __ret; \ +}) + +#define __swait_event_killable_timeout(wq, condition, timeout) \ + ___swait_event(wq, ___wait_cond_timeout(condition), \ + TASK_KILLABLE, timeout, \ + __ret = schedule_timeout(__ret)) + +#define swait_event_killable_timeout(wq, condition, timeout) \ +({ \ + long __ret = timeout; \ + if (!___wait_cond_timeout(condition)) \ + __ret = __swait_event_killable_timeout(wq, \ + condition, timeout); \ + __ret; \ +}) + #endif /* _LINUX_SWAIT_H */ -- 2.11.0