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: Jerome Marchand <jmarchan@redhat.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Michal Hocko <mhocko@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
715ea41e60
commit
00619bcc44
@@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
_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)
|
|||||||
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)
|
|||||||
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
|
||||||
|
13
mm/util.c
13
mm/util.c
@@ -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)
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user