aboutsummaryrefslogtreecommitdiffstats
path: root/mm/oom_kill.c
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2009-01-06 17:38:59 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-06 18:58:58 -0500
commit1c0fe6e3bda0464728c23c8d84aa47567e8b716c (patch)
tree64f7903ee7757b14464e8a06bf91f5c4d5a8ba56 /mm/oom_kill.c
parent5bd1455c239672081d0e7f086e899b8cbc7a9844 (diff)
mm: invoke oom-killer from page fault
Rather than have the pagefault handler kill a process directly if it gets a VM_FAULT_OOM, have it call into the OOM killer. With increasingly sophisticated oom behaviour (cpusets, memory cgroups, oom killing throttling, oom priority adjustment or selective disabling, panic on oom, etc), it's silly to unconditionally kill the faulting process at page fault time. Create a hook for pagefault oom path to call into instead. Only converted x86 and uml so far. [akpm@linux-foundation.org: make __out_of_memory() static] [akpm@linux-foundation.org: fix comment] Signed-off-by: Nick Piggin <npiggin@suse.de> Cc: Jeff Dike <jdike@addtoit.com> Acked-by: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> 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.c94
1 files changed, 65 insertions, 29 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 558f9afe6e4e..c592965dab2f 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -509,6 +509,69 @@ void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_mask)
509 spin_unlock(&zone_scan_mutex); 509 spin_unlock(&zone_scan_mutex);
510} 510}
511 511
512/*
513 * Must be called with tasklist_lock held for read.
514 */
515static void __out_of_memory(gfp_t gfp_mask, int order)
516{
517 if (sysctl_oom_kill_allocating_task) {
518 oom_kill_process(current, gfp_mask, order, 0, NULL,
519 "Out of memory (oom_kill_allocating_task)");
520
521 } else {
522 unsigned long points;
523 struct task_struct *p;
524
525retry:
526 /*
527 * Rambo mode: Shoot down a process and hope it solves whatever
528 * issues we may have.
529 */
530 p = select_bad_process(&points, NULL);
531
532 if (PTR_ERR(p) == -1UL)
533 return;
534
535 /* Found nothing?!?! Either we hang forever, or we panic. */
536 if (!p) {
537 read_unlock(&tasklist_lock);
538 panic("Out of memory and no killable processes...\n");
539 }
540
541 if (oom_kill_process(p, gfp_mask, order, points, NULL,
542 "Out of memory"))
543 goto retry;
544 }
545}
546
547/*
548 * pagefault handler calls into here because it is out of memory but
549 * doesn't know exactly how or why.
550 */
551void pagefault_out_of_memory(void)
552{
553 unsigned long freed = 0;
554
555 blocking_notifier_call_chain(&oom_notify_list, 0, &freed);
556 if (freed > 0)
557 /* Got some memory back in the last second. */
558 return;
559
560 if (sysctl_panic_on_oom)
561 panic("out of memory from page fault. panic_on_oom is selected.\n");
562
563 read_lock(&tasklist_lock);
564 __out_of_memory(0, 0); /* unknown gfp_mask and order */
565 read_unlock(&tasklist_lock);
566
567 /*
568 * Give "p" a good chance of killing itself before we
569 * retry to allocate memory.
570 */
571 if (!test_thread_flag(TIF_MEMDIE))
572 schedule_timeout_uninterruptible(1);
573}
574
512/** 575/**
513 * out_of_memory - kill the "best" process when we run out of memory 576 * out_of_memory - kill the "best" process when we run out of memory
514 * @zonelist: zonelist pointer 577 * @zonelist: zonelist pointer
@@ -522,8 +585,6 @@ void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_mask)
522 */ 585 */
523void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order) 586void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
524{ 587{
525 struct task_struct *p;
526 unsigned long points = 0;
527 unsigned long freed = 0; 588 unsigned long freed = 0;
528 enum oom_constraint constraint; 589 enum oom_constraint constraint;
529 590
@@ -544,7 +605,7 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
544 605
545 switch (constraint) { 606 switch (constraint) {
546 case CONSTRAINT_MEMORY_POLICY: 607 case CONSTRAINT_MEMORY_POLICY:
547 oom_kill_process(current, gfp_mask, order, points, NULL, 608 oom_kill_process(current, gfp_mask, order, 0, NULL,
548 "No available memory (MPOL_BIND)"); 609 "No available memory (MPOL_BIND)");
549 break; 610 break;
550 611
@@ -553,35 +614,10 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
553 panic("out of memory. panic_on_oom is selected\n"); 614 panic("out of memory. panic_on_oom is selected\n");
554 /* Fall-through */ 615 /* Fall-through */
555 case CONSTRAINT_CPUSET: 616 case CONSTRAINT_CPUSET:
556 if (sysctl_oom_kill_allocating_task) { 617 __out_of_memory(gfp_mask, order);
557 oom_kill_process(current, gfp_mask, order, points, NULL,
558 "Out of memory (oom_kill_allocating_task)");
559 break;
560 }
561retry:
562 /*
563 * Rambo mode: Shoot down a process and hope it solves whatever
564 * issues we may have.
565 */
566 p = select_bad_process(&points, NULL);
567
568 if (PTR_ERR(p) == -1UL)
569 goto out;
570
571 /* Found nothing?!?! Either we hang forever, or we panic. */
572 if (!p) {
573 read_unlock(&tasklist_lock);
574 panic("Out of memory and no killable processes...\n");
575 }
576
577 if (oom_kill_process(p, gfp_mask, order, points, NULL,
578 "Out of memory"))
579 goto retry;
580
581 break; 618 break;
582 } 619 }
583 620
584out:
585 read_unlock(&tasklist_lock); 621 read_unlock(&tasklist_lock);
586 622
587 /* 623 /*