From: Jes Sorensen nr_free_pages() is expensive, especially on large SMP machines. The patch changes the memory overcommit code so that it only calls nr_free_pages() is we're about to fail the allocation attempt. --- 25-akpm/security/commoncap.c | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletion(-) diff -puN security/commoncap.c~nr_free_pages-is-expensive security/commoncap.c --- 25/security/commoncap.c~nr_free_pages-is-expensive Wed Jan 28 13:16:42 2004 +++ 25-akpm/security/commoncap.c Wed Jan 28 13:18:16 2004 @@ -321,8 +321,9 @@ int cap_vm_enough_memory(long pages) return 0; if (sysctl_overcommit_memory == 0) { + unsigned long n; + free = get_page_cache_size(); - free += nr_free_pages(); free += nr_swap_pages; /* @@ -341,6 +342,18 @@ int cap_vm_enough_memory(long pages) if (free > pages) return 0; + + /* + * nr_free_pages() is very expensive on large systems, + * only call if we're about to fail. + */ + n = nr_free_pages(); + if (!capable(CAP_SYS_ADMIN)) + n -= n / 32; + free += n; + + if (free > pages) + return 0; vm_unacct_memory(pages); return -ENOMEM; } _