aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/kernel-parameters.txt6
-rw-r--r--mm/slab.c20
2 files changed, 23 insertions, 3 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index a0c5c5f4fce..b21093eabef 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2362,6 +2362,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
2362 2362
2363 slram= [HW,MTD] 2363 slram= [HW,MTD]
2364 2364
2365 slab_max_order= [MM, SLAB]
2366 Determines the maximum allowed order for slabs.
2367 A high setting may cause OOMs due to memory
2368 fragmentation. Defaults to 1 for systems with
2369 more than 32MB of RAM, 0 otherwise.
2370
2365 slub_debug[=options[,slabs]] [MM, SLUB] 2371 slub_debug[=options[,slabs]] [MM, SLUB]
2366 Enabling slub_debug allows one to determine the 2372 Enabling slub_debug allows one to determine the
2367 culprit if slab objects become corrupted. Enabling 2373 culprit if slab objects become corrupted. Enabling
diff --git a/mm/slab.c b/mm/slab.c
index 1a482e8402c..b0414d12fd0 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -479,11 +479,13 @@ EXPORT_SYMBOL(slab_buffer_size);
479#endif 479#endif
480 480
481/* 481/*
482 * Do not go above this order unless 0 objects fit into the slab. 482 * Do not go above this order unless 0 objects fit into the slab or
483 * overridden on the command line.
483 */ 484 */
484#define SLAB_MAX_ORDER_HI 1 485#define SLAB_MAX_ORDER_HI 1
485#define SLAB_MAX_ORDER_LO 0 486#define SLAB_MAX_ORDER_LO 0
486static int slab_max_order = SLAB_MAX_ORDER_LO; 487static int slab_max_order = SLAB_MAX_ORDER_LO;
488static bool slab_max_order_set __initdata;
487 489
488/* 490/*
489 * Functions for storing/retrieving the cachep and or slab from the page 491 * Functions for storing/retrieving the cachep and or slab from the page
@@ -851,6 +853,17 @@ static int __init noaliencache_setup(char *s)
851} 853}
852__setup("noaliencache", noaliencache_setup); 854__setup("noaliencache", noaliencache_setup);
853 855
856static int __init slab_max_order_setup(char *str)
857{
858 get_option(&str, &slab_max_order);
859 slab_max_order = slab_max_order < 0 ? 0 :
860 min(slab_max_order, MAX_ORDER - 1);
861 slab_max_order_set = true;
862
863 return 1;
864}
865__setup("slab_max_order=", slab_max_order_setup);
866
854#ifdef CONFIG_NUMA 867#ifdef CONFIG_NUMA
855/* 868/*
856 * Special reaping functions for NUMA systems called from cache_reap(). 869 * Special reaping functions for NUMA systems called from cache_reap().
@@ -1499,9 +1512,10 @@ void __init kmem_cache_init(void)
1499 1512
1500 /* 1513 /*
1501 * Fragmentation resistance on low memory - only use bigger 1514 * Fragmentation resistance on low memory - only use bigger
1502 * page orders on machines with more than 32MB of memory. 1515 * page orders on machines with more than 32MB of memory if
1516 * not overridden on the command line.
1503 */ 1517 */
1504 if (totalram_pages > (32 << 20) >> PAGE_SHIFT) 1518 if (!slab_max_order_set && totalram_pages > (32 << 20) >> PAGE_SHIFT)
1505 slab_max_order = SLAB_MAX_ORDER_HI; 1519 slab_max_order = SLAB_MAX_ORDER_HI;
1506 1520
1507 /* Bootstrap is tricky, because several objects are allocated 1521 /* Bootstrap is tricky, because several objects are allocated