aboutsummaryrefslogtreecommitdiffstats
path: root/mm/oom_kill.c
diff options
context:
space:
mode:
authorVladimir Davydov <vdavydov@virtuozzo.com>2016-03-25 17:20:39 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-03-25 19:37:42 -0400
commit29c696e1c6eceb5db6b21f0c89495fcfcd40c0eb (patch)
treefe5a096de3c34d3fef0fcc40dd3fbc03a99599a1 /mm/oom_kill.c
parent855b018325737f7691f9b7d86339df40aa4e47c3 (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.c15
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 */
420static struct task_struct *oom_reaper_th; 420static struct task_struct *oom_reaper_th;
421static DECLARE_WAIT_QUEUE_HEAD(oom_reaper_wait); 421static DECLARE_WAIT_QUEUE_HEAD(oom_reaper_wait);
422static LIST_HEAD(oom_reaper_list); 422static struct task_struct *oom_reaper_list;
423static DEFINE_SPINLOCK(oom_reaper_lock); 423static 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}