diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/slub.c | 30 |
1 files changed, 24 insertions, 6 deletions
@@ -2825,6 +2825,11 @@ static s8 size_index[24] = { | |||
2825 | 2 /* 192 */ | 2825 | 2 /* 192 */ |
2826 | }; | 2826 | }; |
2827 | 2827 | ||
2828 | static inline int size_index_elem(size_t bytes) | ||
2829 | { | ||
2830 | return (bytes - 1) / 8; | ||
2831 | } | ||
2832 | |||
2828 | static struct kmem_cache *get_slab(size_t size, gfp_t flags) | 2833 | static struct kmem_cache *get_slab(size_t size, gfp_t flags) |
2829 | { | 2834 | { |
2830 | int index; | 2835 | int index; |
@@ -2833,7 +2838,7 @@ static struct kmem_cache *get_slab(size_t size, gfp_t flags) | |||
2833 | if (!size) | 2838 | if (!size) |
2834 | return ZERO_SIZE_PTR; | 2839 | return ZERO_SIZE_PTR; |
2835 | 2840 | ||
2836 | index = size_index[(size - 1) / 8]; | 2841 | index = size_index[size_index_elem(size)]; |
2837 | } else | 2842 | } else |
2838 | index = fls(size - 1); | 2843 | index = fls(size - 1); |
2839 | 2844 | ||
@@ -3188,10 +3193,12 @@ void __init kmem_cache_init(void) | |||
3188 | slab_state = PARTIAL; | 3193 | slab_state = PARTIAL; |
3189 | 3194 | ||
3190 | /* Caches that are not of the two-to-the-power-of size */ | 3195 | /* Caches that are not of the two-to-the-power-of size */ |
3191 | if (KMALLOC_MIN_SIZE <= 64) { | 3196 | if (KMALLOC_MIN_SIZE <= 32) { |
3192 | create_kmalloc_cache(&kmalloc_caches[1], | 3197 | create_kmalloc_cache(&kmalloc_caches[1], |
3193 | "kmalloc-96", 96, GFP_NOWAIT); | 3198 | "kmalloc-96", 96, GFP_NOWAIT); |
3194 | caches++; | 3199 | caches++; |
3200 | } | ||
3201 | if (KMALLOC_MIN_SIZE <= 64) { | ||
3195 | create_kmalloc_cache(&kmalloc_caches[2], | 3202 | create_kmalloc_cache(&kmalloc_caches[2], |
3196 | "kmalloc-192", 192, GFP_NOWAIT); | 3203 | "kmalloc-192", 192, GFP_NOWAIT); |
3197 | caches++; | 3204 | caches++; |
@@ -3218,17 +3225,28 @@ void __init kmem_cache_init(void) | |||
3218 | BUILD_BUG_ON(KMALLOC_MIN_SIZE > 256 || | 3225 | BUILD_BUG_ON(KMALLOC_MIN_SIZE > 256 || |
3219 | (KMALLOC_MIN_SIZE & (KMALLOC_MIN_SIZE - 1))); | 3226 | (KMALLOC_MIN_SIZE & (KMALLOC_MIN_SIZE - 1))); |
3220 | 3227 | ||
3221 | for (i = 8; i < KMALLOC_MIN_SIZE; i += 8) | 3228 | for (i = 8; i < KMALLOC_MIN_SIZE; i += 8) { |
3222 | size_index[(i - 1) / 8] = KMALLOC_SHIFT_LOW; | 3229 | int elem = size_index_elem(i); |
3230 | if (elem >= ARRAY_SIZE(size_index)) | ||
3231 | break; | ||
3232 | size_index[elem] = KMALLOC_SHIFT_LOW; | ||
3233 | } | ||
3223 | 3234 | ||
3224 | if (KMALLOC_MIN_SIZE == 128) { | 3235 | if (KMALLOC_MIN_SIZE == 64) { |
3236 | /* | ||
3237 | * The 96 byte size cache is not used if the alignment | ||
3238 | * is 64 byte. | ||
3239 | */ | ||
3240 | for (i = 64 + 8; i <= 96; i += 8) | ||
3241 | size_index[size_index_elem(i)] = 7; | ||
3242 | } else if (KMALLOC_MIN_SIZE == 128) { | ||
3225 | /* | 3243 | /* |
3226 | * The 192 byte sized cache is not used if the alignment | 3244 | * The 192 byte sized cache is not used if the alignment |
3227 | * is 128 byte. Redirect kmalloc to use the 256 byte cache | 3245 | * is 128 byte. Redirect kmalloc to use the 256 byte cache |
3228 | * instead. | 3246 | * instead. |
3229 | */ | 3247 | */ |
3230 | for (i = 128 + 8; i <= 192; i += 8) | 3248 | for (i = 128 + 8; i <= 192; i += 8) |
3231 | size_index[(i - 1) / 8] = 8; | 3249 | size_index[size_index_elem(i)] = 8; |
3232 | } | 3250 | } |
3233 | 3251 | ||
3234 | slab_state = UP; | 3252 | slab_state = UP; |