aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lameter <clameter@sgi.com>2007-05-17 01:11:01 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-05-17 08:23:04 -0400
commit0aa817f078b655d0ae36669169d73a5c8a388016 (patch)
tree140acc4d0dc992b4d20394f6a6412a7c1bb3a306
parent3ec0974210fe1b7c0618ad6e39a882a4237d7de2 (diff)
Slab allocators: define common size limitations
Currently we have a maze of configuration variables that determine the maximum slab size. Worst of all it seems to vary between SLAB and SLUB. So define a common maximum size for kmalloc. For conveniences sake we use the maximum size ever supported which is 32 MB. We limit the maximum size to a lower limit if MAX_ORDER does not allow such large allocations. For many architectures this patch will have the effect of adding large kmalloc sizes. x86_64 adds 5 new kmalloc sizes. So a small amount of memory will be needed for these caches (contemporary SLAB has dynamically sizeable node and cpu structure so the waste is less than in the past) Most architectures will then be able to allocate object with sizes up to MAX_ORDER. We have had repeated breakage (in fact whenever we doubled the number of supported processors) on IA64 because one or the other struct grew beyond what the slab allocators supported. This will avoid future issues and f.e. avoid fixes for 2k and 4k cpu support. CONFIG_LARGE_ALLOCS is no longer necessary so drop it. It fixes sparc64 with SLAB. Signed-off-by: Christoph Lameter <clameter@sgi.com> Signed-off-by: "David S. Miller" <davem@davemloft.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--arch/blackfin/Kconfig8
-rw-r--r--arch/frv/Kconfig8
-rw-r--r--arch/m68knommu/Kconfig8
-rw-r--r--arch/v850/Kconfig8
-rw-r--r--include/linux/kmalloc_sizes.h20
-rw-r--r--include/linux/slab.h15
-rw-r--r--include/linux/slub_def.h19
-rw-r--r--mm/slab.c19
8 files changed, 34 insertions, 71 deletions
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig
index 1a4930509325..d80e5b1d686e 100644
--- a/arch/blackfin/Kconfig
+++ b/arch/blackfin/Kconfig
@@ -560,14 +560,6 @@ endchoice
560 560
561source "mm/Kconfig" 561source "mm/Kconfig"
562 562
563config LARGE_ALLOCS
564 bool "Allow allocating large blocks (> 1MB) of memory"
565 help
566 Allow the slab memory allocator to keep chains for very large
567 memory sizes - upto 32MB. You may need this if your system has
568 a lot of RAM, and you need to able to allocate very large
569 contiguous chunks. If unsure, say N.
570
571config BFIN_DMA_5XX 563config BFIN_DMA_5XX
572 bool "Enable DMA Support" 564 bool "Enable DMA Support"
573 depends on (BF533 || BF532 || BF531 || BF537 || BF536 || BF534 || BF561) 565 depends on (BF533 || BF532 || BF531 || BF537 || BF536 || BF534 || BF561)
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig
index 114738a45582..74eef7111f2b 100644
--- a/arch/frv/Kconfig
+++ b/arch/frv/Kconfig
@@ -102,14 +102,6 @@ config HIGHPTE
102 with a lot of RAM, this can be wasteful of precious low memory. 102 with a lot of RAM, this can be wasteful of precious low memory.
103 Setting this option will put user-space page tables in high memory. 103 Setting this option will put user-space page tables in high memory.
104 104
105config LARGE_ALLOCS
106 bool "Allow allocating large blocks (> 1MB) of memory"
107 help
108 Allow the slab memory allocator to keep chains for very large memory
109 sizes - up to 32MB. You may need this if your system has a lot of
110 RAM, and you need to able to allocate very large contiguous chunks.
111 If unsure, say N.
112
113source "mm/Kconfig" 105source "mm/Kconfig"
114 106
115choice 107choice
diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig
index 823f73736bb5..adc64a2bafbb 100644
--- a/arch/m68knommu/Kconfig
+++ b/arch/m68knommu/Kconfig
@@ -470,14 +470,6 @@ config AVNET
470 default y 470 default y
471 depends on (AVNET5282) 471 depends on (AVNET5282)
472 472
473config LARGE_ALLOCS
474 bool "Allow allocating large blocks (> 1MB) of memory"
475 help
476 Allow the slab memory allocator to keep chains for very large
477 memory sizes - upto 32MB. You may need this if your system has
478 a lot of RAM, and you need to able to allocate very large
479 contiguous chunks. If unsure, say N.
480
481config 4KSTACKS 473config 4KSTACKS
482 bool "Use 4Kb for kernel stacks instead of 8Kb" 474 bool "Use 4Kb for kernel stacks instead of 8Kb"
483 default y 475 default y
diff --git a/arch/v850/Kconfig b/arch/v850/Kconfig
index 5f54c1236c18..ace479ab273f 100644
--- a/arch/v850/Kconfig
+++ b/arch/v850/Kconfig
@@ -240,14 +240,6 @@ menu "Processor type and features"
240 config RESET_GUARD 240 config RESET_GUARD
241 bool "Reset Guard" 241 bool "Reset Guard"
242 242
243 config LARGE_ALLOCS
244 bool "Allow allocating large blocks (> 1MB) of memory"
245 help
246 Allow the slab memory allocator to keep chains for very large
247 memory sizes - upto 32MB. You may need this if your system has
248 a lot of RAM, and you need to able to allocate very large
249 contiguous chunks. If unsure, say N.
250
251source "mm/Kconfig" 243source "mm/Kconfig"
252 244
253endmenu 245endmenu
diff --git a/include/linux/kmalloc_sizes.h b/include/linux/kmalloc_sizes.h
index bda23e00ed71..e576b848ce10 100644
--- a/include/linux/kmalloc_sizes.h
+++ b/include/linux/kmalloc_sizes.h
@@ -19,17 +19,27 @@
19 CACHE(32768) 19 CACHE(32768)
20 CACHE(65536) 20 CACHE(65536)
21 CACHE(131072) 21 CACHE(131072)
22#if (NR_CPUS > 512) || (MAX_NUMNODES > 256) || !defined(CONFIG_MMU) 22#if KMALLOC_MAX_SIZE >= 262144
23 CACHE(262144) 23 CACHE(262144)
24#endif 24#endif
25#ifndef CONFIG_MMU 25#if KMALLOC_MAX_SIZE >= 524288
26 CACHE(524288) 26 CACHE(524288)
27#endif
28#if KMALLOC_MAX_SIZE >= 1048576
27 CACHE(1048576) 29 CACHE(1048576)
28#ifdef CONFIG_LARGE_ALLOCS 30#endif
31#if KMALLOC_MAX_SIZE >= 2097152
29 CACHE(2097152) 32 CACHE(2097152)
33#endif
34#if KMALLOC_MAX_SIZE >= 4194304
30 CACHE(4194304) 35 CACHE(4194304)
36#endif
37#if KMALLOC_MAX_SIZE >= 8388608
31 CACHE(8388608) 38 CACHE(8388608)
39#endif
40#if KMALLOC_MAX_SIZE >= 16777216
32 CACHE(16777216) 41 CACHE(16777216)
42#endif
43#if KMALLOC_MAX_SIZE >= 33554432
33 CACHE(33554432) 44 CACHE(33554432)
34#endif /* CONFIG_LARGE_ALLOCS */ 45#endif
35#endif /* CONFIG_MMU */
diff --git a/include/linux/slab.h b/include/linux/slab.h
index 6fb2ae214152..a015236cc572 100644
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -74,6 +74,21 @@ static inline void *kmem_cache_alloc_node(struct kmem_cache *cachep,
74#endif 74#endif
75 75
76/* 76/*
77 * The largest kmalloc size supported by the slab allocators is
78 * 32 megabyte (2^25) or the maximum allocatable page order if that is
79 * less than 32 MB.
80 *
81 * WARNING: Its not easy to increase this value since the allocators have
82 * to do various tricks to work around compiler limitations in order to
83 * ensure proper constant folding.
84 */
85#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT) <= 25 ? \
86 (MAX_ORDER + PAGE_SHIFT) : 25)
87
88#define KMALLOC_MAX_SIZE (1UL << KMALLOC_SHIFT_HIGH)
89#define KMALLOC_MAX_ORDER (KMALLOC_SHIFT_HIGH - PAGE_SHIFT)
90
91/*
77 * Common kmalloc functions provided by all allocators 92 * Common kmalloc functions provided by all allocators
78 */ 93 */
79void *__kmalloc(size_t, gfp_t); 94void *__kmalloc(size_t, gfp_t);
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h
index a9fb92862aaa..0764c829d967 100644
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -58,17 +58,6 @@ struct kmem_cache {
58 */ 58 */
59#define KMALLOC_SHIFT_LOW 3 59#define KMALLOC_SHIFT_LOW 3
60 60
61#ifdef CONFIG_LARGE_ALLOCS
62#define KMALLOC_SHIFT_HIGH ((MAX_ORDER + PAGE_SHIFT) =< 25 ? \
63 (MAX_ORDER + PAGE_SHIFT - 1) : 25)
64#else
65#if !defined(CONFIG_MMU) || NR_CPUS > 512 || MAX_NUMNODES > 256
66#define KMALLOC_SHIFT_HIGH 20
67#else
68#define KMALLOC_SHIFT_HIGH 18
69#endif
70#endif
71
72/* 61/*
73 * We keep the general caches in an array of slab caches that are used for 62 * We keep the general caches in an array of slab caches that are used for
74 * 2^x bytes of allocations. 63 * 2^x bytes of allocations.
@@ -79,7 +68,7 @@ extern struct kmem_cache kmalloc_caches[KMALLOC_SHIFT_HIGH + 1];
79 * Sorry that the following has to be that ugly but some versions of GCC 68 * Sorry that the following has to be that ugly but some versions of GCC
80 * have trouble with constant propagation and loops. 69 * have trouble with constant propagation and loops.
81 */ 70 */
82static inline int kmalloc_index(int size) 71static inline int kmalloc_index(size_t size)
83{ 72{
84 /* 73 /*
85 * We should return 0 if size == 0 but we use the smallest object 74 * We should return 0 if size == 0 but we use the smallest object
@@ -87,7 +76,7 @@ static inline int kmalloc_index(int size)
87 */ 76 */
88 WARN_ON_ONCE(size == 0); 77 WARN_ON_ONCE(size == 0);
89 78
90 if (size > (1 << KMALLOC_SHIFT_HIGH)) 79 if (size > KMALLOC_MAX_SIZE)
91 return -1; 80 return -1;
92 81
93 if (size > 64 && size <= 96) 82 if (size > 64 && size <= 96)
@@ -110,17 +99,13 @@ static inline int kmalloc_index(int size)
110 if (size <= 64 * 1024) return 16; 99 if (size <= 64 * 1024) return 16;
111 if (size <= 128 * 1024) return 17; 100 if (size <= 128 * 1024) return 17;
112 if (size <= 256 * 1024) return 18; 101 if (size <= 256 * 1024) return 18;
113#if KMALLOC_SHIFT_HIGH > 18
114 if (size <= 512 * 1024) return 19; 102 if (size <= 512 * 1024) return 19;
115 if (size <= 1024 * 1024) return 20; 103 if (size <= 1024 * 1024) return 20;
116#endif
117#if KMALLOC_SHIFT_HIGH > 20
118 if (size <= 2 * 1024 * 1024) return 21; 104 if (size <= 2 * 1024 * 1024) return 21;
119 if (size <= 4 * 1024 * 1024) return 22; 105 if (size <= 4 * 1024 * 1024) return 22;
120 if (size <= 8 * 1024 * 1024) return 23; 106 if (size <= 8 * 1024 * 1024) return 23;
121 if (size <= 16 * 1024 * 1024) return 24; 107 if (size <= 16 * 1024 * 1024) return 24;
122 if (size <= 32 * 1024 * 1024) return 25; 108 if (size <= 32 * 1024 * 1024) return 25;
123#endif
124 return -1; 109 return -1;
125 110
126/* 111/*
diff --git a/mm/slab.c b/mm/slab.c
index 1dc0ce1d0d5d..528243e15cc8 100644
--- a/mm/slab.c
+++ b/mm/slab.c
@@ -569,21 +569,6 @@ static void **dbg_userword(struct kmem_cache *cachep, void *objp)
569#endif 569#endif
570 570
571/* 571/*
572 * Maximum size of an obj (in 2^order pages) and absolute limit for the gfp
573 * order.
574 */
575#if defined(CONFIG_LARGE_ALLOCS)
576#define MAX_OBJ_ORDER 13 /* up to 32Mb */
577#define MAX_GFP_ORDER 13 /* up to 32Mb */
578#elif defined(CONFIG_MMU)
579#define MAX_OBJ_ORDER 5 /* 32 pages */
580#define MAX_GFP_ORDER 5 /* 32 pages */
581#else
582#define MAX_OBJ_ORDER 8 /* up to 1Mb */
583#define MAX_GFP_ORDER 8 /* up to 1Mb */
584#endif
585
586/*
587 * Do not go above this order unless 0 objects fit into the slab. 572 * Do not go above this order unless 0 objects fit into the slab.
588 */ 573 */
589#define BREAK_GFP_ORDER_HI 1 574#define BREAK_GFP_ORDER_HI 1
@@ -2002,7 +1987,7 @@ static size_t calculate_slab_order(struct kmem_cache *cachep,
2002 size_t left_over = 0; 1987 size_t left_over = 0;
2003 int gfporder; 1988 int gfporder;
2004 1989
2005 for (gfporder = 0; gfporder <= MAX_GFP_ORDER; gfporder++) { 1990 for (gfporder = 0; gfporder <= KMALLOC_MAX_ORDER; gfporder++) {
2006 unsigned int num; 1991 unsigned int num;
2007 size_t remainder; 1992 size_t remainder;
2008 1993
@@ -2148,7 +2133,7 @@ kmem_cache_create (const char *name, size_t size, size_t align,
2148 * Sanity checks... these are all serious usage bugs. 2133 * Sanity checks... these are all serious usage bugs.
2149 */ 2134 */
2150 if (!name || in_interrupt() || (size < BYTES_PER_WORD) || 2135 if (!name || in_interrupt() || (size < BYTES_PER_WORD) ||
2151 (size > (1 << MAX_OBJ_ORDER) * PAGE_SIZE) || dtor) { 2136 size > KMALLOC_MAX_SIZE || dtor) {
2152 printk(KERN_ERR "%s: Early error in slab %s\n", __FUNCTION__, 2137 printk(KERN_ERR "%s: Early error in slab %s\n", __FUNCTION__,
2153 name); 2138 name);
2154 BUG(); 2139 BUG();