aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/slub_def.h13
-rw-r--r--mm/slub.c20
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)
diff --git a/mm/slub.c b/mm/slub.c
index 2a1338c516fc..fa28b1623644 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -2436,6 +2436,7 @@ EXPORT_SYMBOL(krealloc);
2436void __init kmem_cache_init(void) 2436void __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}