diff options
Diffstat (limited to 'mm/oom_kill.c')
-rw-r--r-- | mm/oom_kill.c | 94 |
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 | */ | ||
515 | static 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 | |||
525 | retry: | ||
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 | */ | ||
551 | void 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 | */ |
523 | void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order) | 586 | void 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 | } | ||
561 | retry: | ||
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 | ||
584 | out: | ||
585 | read_unlock(&tasklist_lock); | 621 | read_unlock(&tasklist_lock); |
586 | 622 | ||
587 | /* | 623 | /* |