summaryrefslogtreecommitdiffstats
path: root/mm/util.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/util.c')
-rw-r--r--mm/util.c51
1 files changed, 5 insertions, 46 deletions
diff --git a/mm/util.c b/mm/util.c
index 05a464929b3e..e2e4f8c3fa12 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -652,7 +652,7 @@ EXPORT_SYMBOL_GPL(vm_memory_committed);
652 */ 652 */
653int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) 653int __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