aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/linux/kmalloc_sizes.h20
-rw-r--r--include/linux/slab.h15
-rw-r--r--include/linux/slub_def.h19
3 files changed, 32 insertions, 22 deletions
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/*