Re: [rfc][patch 1/3] slub: fix small HWCACHE_ALIGN alignment

Christoph Lameter
2008-03-07T02:54:49Z

> It doesn't say start of cache line. It says align them *on* cachelines.
> 2 32 byte objects on a 64 byte cacheline are aligned on the cacheline.
> 2.67 24 bytes objects on a 64 byte cacheline are not aligned on the
> cacheline.

2 32 byte objects means only one is aligned on a cache line.

Certainly cacheline contention is reduced and performance potentially
increased if there are less objects in a cacheline.

The same argument can be made of aligning 8 byte objects on 32 byte
boundaries. Instead of 8 objects per cacheline you only have two. Why 8?

Isnt all of this a bit arbitrary and contrary to the intend of avoiding
cacheline contention?

The cleanest solution to this is to specify the alignment for each
slabcache if such an alignment is needed. The alignment can be just a
global constant or function like cache_line_size().

I.e. define

int smp_align;

On bootup check the number of running cpus and then pass smp_align as
the align parameter (most slabcaches have no other alignment needs, if
they do then we can combine these using max).

If we want to do more sophisticated things then lets have function that
aligns the object on power of two boundaries like SLAB_HWCACHE_ALIGN does
now:

sub_cacheline_align(size)

Doing so will make it more transparent as to what is going on and which
behavior we want. And we can get rid of SLAB_HWCACHE_ALIGN with the weird
semantics. Specifying smp_align wil truly always align on a cacheline
boundary if we are on an SMP system.