aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/slub_def.h
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 /include/linux/slub_def.h
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>
Diffstat (limited to 'include/linux/slub_def.h')
-rw-r--r--include/linux/slub_def.h19
1 files changed, 2 insertions, 17 deletions
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/*