diff options
author | Christoph Lameter <clameter@sgi.com> | 2007-05-09 02:32:35 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-05-09 12:30:44 -0700 |
commit | 65c02d4cfbbd10188ded3d6577922ab034d943ba (patch) | |
tree | c7b5165775951bb8e78f4e483b69c969042e8208 /mm/slub.c | |
parent | 97416ce82e20a9511ec369822098a8d20998398a (diff) | |
download | linux-3.10-65c02d4cfbbd10188ded3d6577922ab034d943ba.tar.gz linux-3.10-65c02d4cfbbd10188ded3d6577922ab034d943ba.tar.bz2 linux-3.10-65c02d4cfbbd10188ded3d6577922ab034d943ba.zip |
SLUB: add support for dynamic cacheline size determination
SLUB currently assumes that the cacheline size is static. However, i386 f.e.
supports dynamic cache line size determination.
Use cache_line_size() instead of L1_CACHE_BYTES in the allocator.
That also explains the purpose of SLAB_HWCACHE_ALIGN. So we will need to keep
that one around to allow dynamic aligning of objects depending on boot
determination of the cache line size.
[akpm@linux-foundation.org: need to define it before we use it]
Signed-off-by: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/slub.c')
-rw-r--r-- | mm/slub.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/mm/slub.c b/mm/slub.c index 5db3da5a60b..40e92d8d4bc 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -157,6 +157,11 @@ /* Internal SLUB flags */ #define __OBJECT_POISON 0x80000000 /* Poison object */ +/* Not all arches define cache_line_size */ +#ifndef cache_line_size +#define cache_line_size() L1_CACHE_BYTES +#endif + static int kmem_size = sizeof(struct kmem_cache); #ifdef CONFIG_SMP @@ -1480,8 +1485,8 @@ static unsigned long calculate_alignment(unsigned long flags, * then use it. */ if ((flags & SLAB_HWCACHE_ALIGN) && - size > L1_CACHE_BYTES / 2) - return max_t(unsigned long, align, L1_CACHE_BYTES); + size > cache_line_size() / 2) + return max_t(unsigned long, align, cache_line_size()); if (align < ARCH_SLAB_MINALIGN) return ARCH_SLAB_MINALIGN; @@ -1667,8 +1672,8 @@ static int calculate_sizes(struct kmem_cache *s) size += sizeof(void *); /* * Determine the alignment based on various parameters that the - * user specified (this is unecessarily complex due to the attempt - * to be compatible with SLAB. Should be cleaned up some day). + * user specified and the dynamic determination of cache line size + * on bootup. */ align = calculate_alignment(flags, align, s->objsize); @@ -2280,7 +2285,7 @@ void __init kmem_cache_init(void) printk(KERN_INFO "SLUB: Genslabs=%d, HWalign=%d, Order=%d-%d, MinObjects=%d," " Processors=%d, Nodes=%d\n", - KMALLOC_SHIFT_HIGH, L1_CACHE_BYTES, + KMALLOC_SHIFT_HIGH, cache_line_size(), slub_min_order, slub_max_order, slub_min_objects, nr_cpu_ids, nr_node_ids); } |