Commit 00619bcc authored by Jerome Marchand's avatar Jerome Marchand Committed by Linus Torvalds

mm: factor commit limit calculation

The same calculation is currently done in three differents places.
Factor that code so future changes has to be made at only one place.

[akpm@linux-foundation.org: uninline vm_commit_limit()]
Signed-off-by: default avatarJerome Marchand <jmarchan@redhat.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Michal Hocko <mhocko@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 715ea41e
...@@ -24,7 +24,6 @@ static int meminfo_proc_show(struct seq_file *m, void *v) ...@@ -24,7 +24,6 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
{ {
struct sysinfo i; struct sysinfo i;
unsigned long committed; unsigned long committed;
unsigned long allowed;
struct vmalloc_info vmi; struct vmalloc_info vmi;
long cached; long cached;
unsigned long pages[NR_LRU_LISTS]; unsigned long pages[NR_LRU_LISTS];
...@@ -37,8 +36,6 @@ static int meminfo_proc_show(struct seq_file *m, void *v) ...@@ -37,8 +36,6 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
si_meminfo(&i); si_meminfo(&i);
si_swapinfo(&i); si_swapinfo(&i);
committed = percpu_counter_read_positive(&vm_committed_as); committed = percpu_counter_read_positive(&vm_committed_as);
allowed = ((totalram_pages - hugetlb_total_pages())
* sysctl_overcommit_ratio / 100) + total_swap_pages;
cached = global_page_state(NR_FILE_PAGES) - cached = global_page_state(NR_FILE_PAGES) -
total_swapcache_pages() - i.bufferram; total_swapcache_pages() - i.bufferram;
...@@ -147,7 +144,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v) ...@@ -147,7 +144,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
K(global_page_state(NR_UNSTABLE_NFS)), K(global_page_state(NR_UNSTABLE_NFS)),
K(global_page_state(NR_BOUNCE)), K(global_page_state(NR_BOUNCE)),
K(global_page_state(NR_WRITEBACK_TEMP)), K(global_page_state(NR_WRITEBACK_TEMP)),
K(allowed), K(vm_commit_limit()),
K(committed), K(committed),
(unsigned long)VMALLOC_TOTAL >> 10, (unsigned long)VMALLOC_TOTAL >> 10,
vmi.used >> 10, vmi.used >> 10,
......
...@@ -87,4 +87,6 @@ calc_vm_flag_bits(unsigned long flags) ...@@ -87,4 +87,6 @@ calc_vm_flag_bits(unsigned long flags)
_calc_vm_trans(flags, MAP_DENYWRITE, VM_DENYWRITE ) | _calc_vm_trans(flags, MAP_DENYWRITE, VM_DENYWRITE ) |
_calc_vm_trans(flags, MAP_LOCKED, VM_LOCKED ); _calc_vm_trans(flags, MAP_LOCKED, VM_LOCKED );
} }
unsigned long vm_commit_limit(void);
#endif /* _LINUX_MMAN_H */ #endif /* _LINUX_MMAN_H */
...@@ -179,14 +179,12 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) ...@@ -179,14 +179,12 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
goto error; goto error;
} }
allowed = (totalram_pages - hugetlb_total_pages()) allowed = vm_commit_limit();
* sysctl_overcommit_ratio / 100;
/* /*
* Reserve some for root * Reserve some for root
*/ */
if (!cap_sys_admin) if (!cap_sys_admin)
allowed -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10); allowed -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10);
allowed += total_swap_pages;
/* /*
* Don't let a single process grow so big a user can't recover * Don't let a single process grow so big a user can't recover
......
...@@ -1948,13 +1948,12 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin) ...@@ -1948,13 +1948,12 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
goto error; goto error;
} }
allowed = totalram_pages * sysctl_overcommit_ratio / 100; allowed = vm_commit_limit();
/* /*
* Reserve some 3% for root * Reserve some 3% for root
*/ */
if (!cap_sys_admin) if (!cap_sys_admin)
allowed -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10); allowed -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10);
allowed += total_swap_pages;
/* /*
* Don't let a single process grow so big a user can't recover * Don't let a single process grow so big a user can't recover
......
...@@ -7,6 +7,9 @@ ...@@ -7,6 +7,9 @@
#include <linux/security.h> #include <linux/security.h>
#include <linux/swap.h> #include <linux/swap.h>
#include <linux/swapops.h> #include <linux/swapops.h>
#include <linux/mman.h>
#include <linux/hugetlb.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include "internal.h" #include "internal.h"
...@@ -398,6 +401,16 @@ struct address_space *page_mapping(struct page *page) ...@@ -398,6 +401,16 @@ struct address_space *page_mapping(struct page *page)
return mapping; return mapping;
} }
/*
* Committed memory limit enforced when OVERCOMMIT_NEVER policy is used
*/
unsigned long vm_commit_limit(void)
{
return ((totalram_pages - hugetlb_total_pages())
* sysctl_overcommit_ratio / 100) + total_swap_pages;
}
/* Tracepoints definitions. */ /* Tracepoints definitions. */
EXPORT_TRACEPOINT_SYMBOL(kmalloc); EXPORT_TRACEPOINT_SYMBOL(kmalloc);
EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc); EXPORT_TRACEPOINT_SYMBOL(kmem_cache_alloc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment