From: Jes Sorensen <jes@trained-monkey.org>

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;
 	}

_