diff options
| author | David Rientjes <rientjes@google.com> | 2010-08-09 20:18:59 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-09 23:44:57 -0400 |
| commit | 0aad4b3124850e85fe54e610802f0917ce46a1ae (patch) | |
| tree | ebba56659dab4e285b87341d7639fda7a2db81e9 | |
| parent | f44200320b10c76003101dee21c5f961e80faf0b (diff) | |
oom: fold __out_of_memory into out_of_memory
__out_of_memory() only has a single caller, so fold it into
out_of_memory() and add a comment about locking for its call to
oom_kill_process().
Signed-off-by: David Rientjes <rientjes@google.com>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Acked-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | mm/oom_kill.c | 65 |
1 files changed, 29 insertions, 36 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index cba18c06e508..26ae6975fa32 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
| @@ -628,41 +628,6 @@ static void clear_system_oom(void) | |||
| 628 | spin_unlock(&zone_scan_lock); | 628 | spin_unlock(&zone_scan_lock); |
| 629 | } | 629 | } |
| 630 | 630 | ||
| 631 | |||
| 632 | /* | ||
| 633 | * Must be called with tasklist_lock held for read. | ||
| 634 | */ | ||
| 635 | static void __out_of_memory(gfp_t gfp_mask, int order, const nodemask_t *mask) | ||
| 636 | { | ||
| 637 | struct task_struct *p; | ||
| 638 | unsigned long points; | ||
| 639 | |||
| 640 | if (sysctl_oom_kill_allocating_task) | ||
| 641 | if (!oom_kill_process(current, gfp_mask, order, 0, NULL, | ||
| 642 | "Out of memory (oom_kill_allocating_task)")) | ||
| 643 | return; | ||
| 644 | retry: | ||
| 645 | /* | ||
| 646 | * Rambo mode: Shoot down a process and hope it solves whatever | ||
| 647 | * issues we may have. | ||
| 648 | */ | ||
| 649 | p = select_bad_process(&points, NULL, mask); | ||
| 650 | |||
| 651 | if (PTR_ERR(p) == -1UL) | ||
| 652 | return; | ||
| 653 | |||
| 654 | /* Found nothing?!?! Either we hang forever, or we panic. */ | ||
| 655 | if (!p) { | ||
| 656 | dump_header(NULL, gfp_mask, order, NULL); | ||
| 657 | read_unlock(&tasklist_lock); | ||
| 658 | panic("Out of memory and no killable processes...\n"); | ||
| 659 | } | ||
| 660 | |||
| 661 | if (oom_kill_process(p, gfp_mask, order, points, NULL, | ||
| 662 | "Out of memory")) | ||
| 663 | goto retry; | ||
| 664 | } | ||
| 665 | |||
| 666 | /** | 631 | /** |
| 667 | * out_of_memory - kill the "best" process when we run out of memory | 632 | * out_of_memory - kill the "best" process when we run out of memory |
| 668 | * @zonelist: zonelist pointer | 633 | * @zonelist: zonelist pointer |
| @@ -678,7 +643,9 @@ retry: | |||
| 678 | void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, | 643 | void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, |
| 679 | int order, nodemask_t *nodemask) | 644 | int order, nodemask_t *nodemask) |
| 680 | { | 645 | { |
| 646 | struct task_struct *p; | ||
| 681 | unsigned long freed = 0; | 647 | unsigned long freed = 0; |
| 648 | unsigned long points; | ||
| 682 | enum oom_constraint constraint = CONSTRAINT_NONE; | 649 | enum oom_constraint constraint = CONSTRAINT_NONE; |
| 683 | 650 | ||
| 684 | blocking_notifier_call_chain(&oom_notify_list, 0, &freed); | 651 | blocking_notifier_call_chain(&oom_notify_list, 0, &freed); |
| @@ -703,10 +670,36 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, | |||
| 703 | if (zonelist) | 670 | if (zonelist) |
| 704 | constraint = constrained_alloc(zonelist, gfp_mask, nodemask); | 671 | constraint = constrained_alloc(zonelist, gfp_mask, nodemask); |
| 705 | check_panic_on_oom(constraint, gfp_mask, order); | 672 | check_panic_on_oom(constraint, gfp_mask, order); |
| 673 | |||
| 706 | read_lock(&tasklist_lock); | 674 | read_lock(&tasklist_lock); |
| 707 | __out_of_memory(gfp_mask, order, | 675 | if (sysctl_oom_kill_allocating_task) { |
| 676 | /* | ||
| 677 | * oom_kill_process() needs tasklist_lock held. If it returns | ||
| 678 | * non-zero, current could not be killed so we must fallback to | ||
| 679 | * the tasklist scan. | ||
| 680 | */ | ||
| 681 | if (!oom_kill_process(current, gfp_mask, order, 0, NULL, | ||
| 682 | "Out of memory (oom_kill_allocating_task)")) | ||
| 683 | return; | ||
| 684 | } | ||
| 685 | |||
| 686 | retry: | ||
| 687 | p = select_bad_process(&points, NULL, | ||
| 708 | constraint == CONSTRAINT_MEMORY_POLICY ? nodemask : | 688 | constraint == CONSTRAINT_MEMORY_POLICY ? nodemask : |
| 709 | NULL); | 689 | NULL); |
| 690 | if (PTR_ERR(p) == -1UL) | ||
| 691 | return; | ||
| 692 | |||
| 693 | /* Found nothing?!?! Either we hang forever, or we panic. */ | ||
| 694 | if (!p) { | ||
| 695 | dump_header(NULL, gfp_mask, order, NULL); | ||
| 696 | read_unlock(&tasklist_lock); | ||
| 697 | panic("Out of memory and no killable processes...\n"); | ||
| 698 | } | ||
| 699 | |||
| 700 | if (oom_kill_process(p, gfp_mask, order, points, NULL, | ||
| 701 | "Out of memory")) | ||
| 702 | goto retry; | ||
| 710 | read_unlock(&tasklist_lock); | 703 | read_unlock(&tasklist_lock); |
| 711 | 704 | ||
| 712 | /* | 705 | /* |
