diff options
author | Vladimir Davydov <vdavydov@virtuozzo.com> | 2016-03-25 17:20:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-03-25 19:37:42 -0400 |
commit | 29c696e1c6eceb5db6b21f0c89495fcfcd40c0eb (patch) | |
tree | fe5a096de3c34d3fef0fcc40dd3fbc03a99599a1 /mm/oom_kill.c | |
parent | 855b018325737f7691f9b7d86339df40aa4e47c3 (diff) |
oom: make oom_reaper_list single linked
Entries are only added/removed from oom_reaper_list at head so we can
use a single linked list and hence save a word in task_struct.
Signed-off-by: Vladimir Davydov <vdavydov@virtuozzo.com>
Signed-off-by: Michal Hocko <mhocko@suse.com>
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/oom_kill.c')
-rw-r--r-- | mm/oom_kill.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 1a21819a8e5e..a49638f41e45 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -419,7 +419,7 @@ bool oom_killer_disabled __read_mostly; | |||
419 | */ | 419 | */ |
420 | static struct task_struct *oom_reaper_th; | 420 | static struct task_struct *oom_reaper_th; |
421 | static DECLARE_WAIT_QUEUE_HEAD(oom_reaper_wait); | 421 | static DECLARE_WAIT_QUEUE_HEAD(oom_reaper_wait); |
422 | static LIST_HEAD(oom_reaper_list); | 422 | static struct task_struct *oom_reaper_list; |
423 | static DEFINE_SPINLOCK(oom_reaper_lock); | 423 | static DEFINE_SPINLOCK(oom_reaper_lock); |
424 | 424 | ||
425 | 425 | ||
@@ -528,13 +528,11 @@ static int oom_reaper(void *unused) | |||
528 | while (true) { | 528 | while (true) { |
529 | struct task_struct *tsk = NULL; | 529 | struct task_struct *tsk = NULL; |
530 | 530 | ||
531 | wait_event_freezable(oom_reaper_wait, | 531 | wait_event_freezable(oom_reaper_wait, oom_reaper_list != NULL); |
532 | (!list_empty(&oom_reaper_list))); | ||
533 | spin_lock(&oom_reaper_lock); | 532 | spin_lock(&oom_reaper_lock); |
534 | if (!list_empty(&oom_reaper_list)) { | 533 | if (oom_reaper_list != NULL) { |
535 | tsk = list_first_entry(&oom_reaper_list, | 534 | tsk = oom_reaper_list; |
536 | struct task_struct, oom_reaper_list); | 535 | oom_reaper_list = tsk->oom_reaper_list; |
537 | list_del(&tsk->oom_reaper_list); | ||
538 | } | 536 | } |
539 | spin_unlock(&oom_reaper_lock); | 537 | spin_unlock(&oom_reaper_lock); |
540 | 538 | ||
@@ -553,7 +551,8 @@ static void wake_oom_reaper(struct task_struct *tsk) | |||
553 | get_task_struct(tsk); | 551 | get_task_struct(tsk); |
554 | 552 | ||
555 | spin_lock(&oom_reaper_lock); | 553 | spin_lock(&oom_reaper_lock); |
556 | list_add(&tsk->oom_reaper_list, &oom_reaper_list); | 554 | tsk->oom_reaper_list = oom_reaper_list; |
555 | oom_reaper_list = tsk; | ||
557 | spin_unlock(&oom_reaper_lock); | 556 | spin_unlock(&oom_reaper_lock); |
558 | wake_up(&oom_reaper_wait); | 557 | wake_up(&oom_reaper_wait); |
559 | } | 558 | } |