diff options
-rw-r--r-- | include/linux/slub_def.h | 13 | ||||
-rw-r--r-- | mm/slub.c | 20 |
2 files changed, 26 insertions, 7 deletions
diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h index a0ad37463d62..6207a3d8da71 100644 --- a/include/linux/slub_def.h +++ b/include/linux/slub_def.h | |||
@@ -28,7 +28,7 @@ struct kmem_cache { | |||
28 | int size; /* The size of an object including meta data */ | 28 | int size; /* The size of an object including meta data */ |
29 | int objsize; /* The size of an object without meta data */ | 29 | int objsize; /* The size of an object without meta data */ |
30 | int offset; /* Free pointer offset. */ | 30 | int offset; /* Free pointer offset. */ |
31 | unsigned int order; | 31 | int order; |
32 | 32 | ||
33 | /* | 33 | /* |
34 | * Avoid an extra cache line for UP, SMP and for the node local to | 34 | * Avoid an extra cache line for UP, SMP and for the node local to |
@@ -56,7 +56,13 @@ struct kmem_cache { | |||
56 | /* | 56 | /* |
57 | * Kmalloc subsystem. | 57 | * Kmalloc subsystem. |
58 | */ | 58 | */ |
59 | #define KMALLOC_SHIFT_LOW 3 | 59 | #if defined(ARCH_KMALLOC_MINALIGN) && ARCH_KMALLOC_MINALIGN > 8 |
60 | #define KMALLOC_MIN_SIZE ARCH_KMALLOC_MINALIGN | ||
61 | #else | ||
62 | #define KMALLOC_MIN_SIZE 8 | ||
63 | #endif | ||
64 | |||
65 | #define KMALLOC_SHIFT_LOW ilog2(KMALLOC_MIN_SIZE) | ||
60 | 66 | ||
61 | /* | 67 | /* |
62 | * We keep the general caches in an array of slab caches that are used for | 68 | * We keep the general caches in an array of slab caches that are used for |
@@ -76,6 +82,9 @@ static inline int kmalloc_index(size_t size) | |||
76 | if (size > KMALLOC_MAX_SIZE) | 82 | if (size > KMALLOC_MAX_SIZE) |
77 | return -1; | 83 | return -1; |
78 | 84 | ||
85 | if (size <= KMALLOC_MIN_SIZE) | ||
86 | return KMALLOC_SHIFT_LOW; | ||
87 | |||
79 | if (size > 64 && size <= 96) | 88 | if (size > 64 && size <= 96) |
80 | return 1; | 89 | return 1; |
81 | if (size > 128 && size <= 192) | 90 | if (size > 128 && size <= 192) |
@@ -2436,6 +2436,7 @@ EXPORT_SYMBOL(krealloc); | |||
2436 | void __init kmem_cache_init(void) | 2436 | void __init kmem_cache_init(void) |
2437 | { | 2437 | { |
2438 | int i; | 2438 | int i; |
2439 | int caches = 0; | ||
2439 | 2440 | ||
2440 | #ifdef CONFIG_NUMA | 2441 | #ifdef CONFIG_NUMA |
2441 | /* | 2442 | /* |
@@ -2446,20 +2447,29 @@ void __init kmem_cache_init(void) | |||
2446 | create_kmalloc_cache(&kmalloc_caches[0], "kmem_cache_node", | 2447 | create_kmalloc_cache(&kmalloc_caches[0], "kmem_cache_node", |
2447 | sizeof(struct kmem_cache_node), GFP_KERNEL); | 2448 | sizeof(struct kmem_cache_node), GFP_KERNEL); |
2448 | kmalloc_caches[0].refcount = -1; | 2449 | kmalloc_caches[0].refcount = -1; |
2450 | caches++; | ||
2449 | #endif | 2451 | #endif |
2450 | 2452 | ||
2451 | /* Able to allocate the per node structures */ | 2453 | /* Able to allocate the per node structures */ |
2452 | slab_state = PARTIAL; | 2454 | slab_state = PARTIAL; |
2453 | 2455 | ||
2454 | /* Caches that are not of the two-to-the-power-of size */ | 2456 | /* Caches that are not of the two-to-the-power-of size */ |
2455 | create_kmalloc_cache(&kmalloc_caches[1], | 2457 | if (KMALLOC_MIN_SIZE <= 64) { |
2458 | create_kmalloc_cache(&kmalloc_caches[1], | ||
2456 | "kmalloc-96", 96, GFP_KERNEL); | 2459 | "kmalloc-96", 96, GFP_KERNEL); |
2457 | create_kmalloc_cache(&kmalloc_caches[2], | 2460 | caches++; |
2461 | } | ||
2462 | if (KMALLOC_MIN_SIZE <= 128) { | ||
2463 | create_kmalloc_cache(&kmalloc_caches[2], | ||
2458 | "kmalloc-192", 192, GFP_KERNEL); | 2464 | "kmalloc-192", 192, GFP_KERNEL); |
2465 | caches++; | ||
2466 | } | ||
2459 | 2467 | ||
2460 | for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) | 2468 | for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) { |
2461 | create_kmalloc_cache(&kmalloc_caches[i], | 2469 | create_kmalloc_cache(&kmalloc_caches[i], |
2462 | "kmalloc", 1 << i, GFP_KERNEL); | 2470 | "kmalloc", 1 << i, GFP_KERNEL); |
2471 | caches++; | ||
2472 | } | ||
2463 | 2473 | ||
2464 | slab_state = UP; | 2474 | slab_state = UP; |
2465 | 2475 | ||
@@ -2476,8 +2486,8 @@ void __init kmem_cache_init(void) | |||
2476 | nr_cpu_ids * sizeof(struct page *); | 2486 | nr_cpu_ids * sizeof(struct page *); |
2477 | 2487 | ||
2478 | printk(KERN_INFO "SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d," | 2488 | printk(KERN_INFO "SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d," |
2479 | " Processors=%d, Nodes=%d\n", | 2489 | " CPUs=%d, Nodes=%d\n", |
2480 | KMALLOC_SHIFT_HIGH, cache_line_size(), | 2490 | caches, cache_line_size(), |
2481 | slub_min_order, slub_max_order, slub_min_objects, | 2491 | slub_min_order, slub_max_order, slub_min_objects, |
2482 | nr_cpu_ids, nr_node_ids); | 2492 | nr_cpu_ids, nr_node_ids); |
2483 | } | 2493 | } |