Commit b6210386 authored by Nick Piggin's avatar Nick Piggin Committed by Christoph Lameter

slub: Do not cross cacheline boundaries for very small objects

SLUB should pack even small objects nicely into cachelines if that is what
has been asked for. Use the same algorithm as SLAB for this.

The effect of this patch for a system with a cacheline size of 64
bytes is that the 24 byte sized slab caches will now put exactly
2 objects into a cacheline instead of 3 with some overlap into
the next cacheline. This reduces the object density in a 4k slab
from 170 to 128 objects (same as SLAB).
Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
parent 1c61fc40
...@@ -1856,12 +1856,15 @@ static unsigned long calculate_alignment(unsigned long flags, ...@@ -1856,12 +1856,15 @@ static unsigned long calculate_alignment(unsigned long flags,
* The hardware cache alignment cannot override the specified * The hardware cache alignment cannot override the specified
* alignment though. If that is greater then use it. * alignment though. If that is greater then use it.
*/ */
if ((flags & SLAB_HWCACHE_ALIGN) && if (flags & SLAB_HWCACHE_ALIGN) {
size > cache_line_size() / 2) unsigned long ralign = cache_line_size();
return max_t(unsigned long, align, cache_line_size()); while (size <= ralign / 2)
ralign /= 2;
align = max(align, ralign);
}
if (align < ARCH_SLAB_MINALIGN) if (align < ARCH_SLAB_MINALIGN)
return ARCH_SLAB_MINALIGN; align = ARCH_SLAB_MINALIGN;
return ALIGN(align, sizeof(void *)); return ALIGN(align, sizeof(void *));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment