mm/page_alloc.c: remove unnecessary end_bitidx for [set|get]_pfnblock_flags_mask()
[linux-2.6-microblaze.git] / mm / mm_init.c
index 435e5f7..b06a30f 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/memory.h>
 #include <linux/notifier.h>
 #include <linux/sched.h>
+#include <linux/mman.h>
 #include "internal.h"
 
 #ifdef CONFIG_DEBUG_MEMORY_INIT
@@ -144,14 +145,23 @@ EXPORT_SYMBOL_GPL(mm_kobj);
 #ifdef CONFIG_SMP
 s32 vm_committed_as_batch = 32;
 
-static void __meminit mm_compute_batch(void)
+void mm_compute_batch(int overcommit_policy)
 {
        u64 memsized_batch;
        s32 nr = num_present_cpus();
        s32 batch = max_t(s32, nr*2, 32);
-
-       /* batch size set to 0.4% of (total memory/#cpus), or max int32 */
-       memsized_batch = min_t(u64, (totalram_pages()/nr)/256, 0x7fffffff);
+       unsigned long ram_pages = totalram_pages();
+
+       /*
+        * For policy OVERCOMMIT_NEVER, set batch size to 0.4% of
+        * (total memory/#cpus), and lift it to 25% for other policies
+        * to easy the possible lock contention for percpu_counter
+        * vm_committed_as, while the max limit is INT_MAX
+        */
+       if (overcommit_policy == OVERCOMMIT_NEVER)
+               memsized_batch = min_t(u64, ram_pages/nr/256, INT_MAX);
+       else
+               memsized_batch = min_t(u64, ram_pages/nr/4, INT_MAX);
 
        vm_committed_as_batch = max_t(s32, memsized_batch, batch);
 }
@@ -162,7 +172,7 @@ static int __meminit mm_compute_batch_notifier(struct notifier_block *self,
        switch (action) {
        case MEM_ONLINE:
        case MEM_OFFLINE:
-               mm_compute_batch();
+               mm_compute_batch(sysctl_overcommit_memory);
        default:
                break;
        }
@@ -176,7 +186,7 @@ static struct notifier_block compute_batch_nb __meminitdata = {
 
 static int __init mm_compute_batch_init(void)
 {
-       mm_compute_batch();
+       mm_compute_batch(sysctl_overcommit_memory);
        register_hotmemory_notifier(&compute_batch_nb);
 
        return 0;