diff options
Diffstat (limited to 'mm/util.c')
-rw-r--r-- | mm/util.c | 51 |
1 files changed, 5 insertions, 46 deletions
@@ -652,7 +652,7 @@ EXPORT_SYMBOL_GPL(vm_memory_committed); | |||
652 | */ | 652 | */ |
653 | int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) | 653 | int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) |
654 | { | 654 | { |
655 | long free, allowed, reserve; | 655 | long allowed; |
656 | 656 | ||
657 | VM_WARN_ONCE(percpu_counter_read(&vm_committed_as) < | 657 | VM_WARN_ONCE(percpu_counter_read(&vm_committed_as) < |
658 | -(s64)vm_committed_as_batch * num_online_cpus(), | 658 | -(s64)vm_committed_as_batch * num_online_cpus(), |
@@ -667,51 +667,9 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) | |||
667 | return 0; | 667 | return 0; |
668 | 668 | ||
669 | if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) { | 669 | if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) { |
670 | free = global_zone_page_state(NR_FREE_PAGES); | 670 | if (pages > totalram_pages() + total_swap_pages) |
671 | free += global_node_page_state(NR_FILE_PAGES); | ||
672 | |||
673 | /* | ||
674 | * shmem pages shouldn't be counted as free in this | ||
675 | * case, they can't be purged, only swapped out, and | ||
676 | * that won't affect the overall amount of available | ||
677 | * memory in the system. | ||
678 | */ | ||
679 | free -= global_node_page_state(NR_SHMEM); | ||
680 | |||
681 | free += get_nr_swap_pages(); | ||
682 | |||
683 | /* | ||
684 | * Any slabs which are created with the | ||
685 | * SLAB_RECLAIM_ACCOUNT flag claim to have contents | ||
686 | * which are reclaimable, under pressure. The dentry | ||
687 | * cache and most inode caches should fall into this | ||
688 | */ | ||
689 | free += global_node_page_state(NR_SLAB_RECLAIMABLE); | ||
690 | |||
691 | /* | ||
692 | * Part of the kernel memory, which can be released | ||
693 | * under memory pressure. | ||
694 | */ | ||
695 | free += global_node_page_state(NR_KERNEL_MISC_RECLAIMABLE); | ||
696 | |||
697 | /* | ||
698 | * Leave reserved pages. The pages are not for anonymous pages. | ||
699 | */ | ||
700 | if (free <= totalreserve_pages) | ||
701 | goto error; | 671 | goto error; |
702 | else | 672 | return 0; |
703 | free -= totalreserve_pages; | ||
704 | |||
705 | /* | ||
706 | * Reserve some for root | ||
707 | */ | ||
708 | if (!cap_sys_admin) | ||
709 | free -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10); | ||
710 | |||
711 | if (free > pages) | ||
712 | return 0; | ||
713 | |||
714 | goto error; | ||
715 | } | 673 | } |
716 | 674 | ||
717 | allowed = vm_commit_limit(); | 675 | allowed = vm_commit_limit(); |
@@ -725,7 +683,8 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) | |||
725 | * Don't let a single process grow so big a user can't recover | 683 | * Don't let a single process grow so big a user can't recover |
726 | */ | 684 | */ |
727 | if (mm) { | 685 | if (mm) { |
728 | reserve = sysctl_user_reserve_kbytes >> (PAGE_SHIFT - 10); | 686 | long reserve = sysctl_user_reserve_kbytes >> (PAGE_SHIFT - 10); |
687 | |||
729 | allowed -= min_t(long, mm->total_vm / 32, reserve); | 688 | allowed -= min_t(long, mm->total_vm / 32, reserve); |
730 | } | 689 | } |
731 | 690 | ||