diff options
author | Johannes Weiner <[email protected]> | 2015-06-24 16:57:13 -0700 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2015-06-24 17:49:43 -0700 |
commit | c38f1025f2910d6183e9923d4b4d5804474b50c5 (patch) | |
tree | 9aeb20c4677b010850267890b7bfc3dd3d575d73 | |
parent | 464027785ff633468ecbb683ede14672d514b3d3 (diff) |
mm: oom_kill: generalize OOM progress waitqueue
It turns out that the mechanism to wait for exiting OOM victims is less
generic than it looks: it won't issue wakeups unless the OOM killer is
disabled.
The reason this check was added was the thought that, since only the OOM
disabling code would wait on this queue, wakeup operations could be
saved when that specific consumer is known to be absent.
However, this is quite the handgrenade. Later attempts to reuse the
waitqueue for other purposes will lead to completely unexpected bugs and
the failure mode will appear seemingly illogical. Generally, providers
shouldn't make unnecessary assumptions about consumers.
This could have been replaced with waitqueue_active(), but it only saves
a few instructions in one of the coldest paths in the kernel. Simply
remove it.
Signed-off-by: Johannes Weiner <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Acked-by: David Rientjes <[email protected]>
Cc: Tetsuo Handa <[email protected]>
Cc: Andrea Arcangeli <[email protected]>
Cc: Dave Chinner <[email protected]>
Cc: Vlastimil Babka <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r-- | mm/oom_kill.c | 6 |
1 files changed, 1 insertions, 5 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 4b9547be9170..472f124e5f08 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -438,11 +438,7 @@ void exit_oom_victim(void) clear_thread_flag(TIF_MEMDIE); down_read(&oom_sem); - /* - * There is no need to signal the lasst oom_victim if there - * is nobody who cares. - */ - if (!atomic_dec_return(&oom_victims) && oom_killer_disabled) + if (!atomic_dec_return(&oom_victims)) wake_up_all(&oom_victims_wait); up_read(&oom_sem); } |