slab: fix alignment issues
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 16 Sep 2019 16:19:57 +0000 (12:19 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Oct 2019 21:11:11 +0000 (17:11 -0400)
commit0d3e65d740a2462175d988f8795829f8869b888e
tree6015ec0ee8963f051ca7c30be1218615f9b5e027
parent297a5ff74809119736ced0303cf380303dd88554
slab: fix alignment issues

This clarifies many of the issues around alignment and source quantum.

Previously, there were a lot of assumptions about source alignment
(assumed PGSIZE, but it was actually quantum), object size (assumed big
enough for a pointer), etc.  If you had an arena with quantum > PGSIZE
and made a slab / KC from it (e.g. a qcache), you'd trip the assertion
too.

We also didn't have any guarantees about carrying a source's
quantum-multiple-alignment through to the slab, which matters for
non-power-of-two sources that want to use qcaches.  We use the "if
obj_size is a multiple of quantum, you'll get quantum-multiple-aligned
allocations" guarantee to solve the problem for qcaches.

Slab align is a separate item from both arena quantum and arena align.
The object we get from a source gets aligned up (or is already the right
alignment, for the pro-touch/non-bufctl case), which requires us to
track the original address from the arena in the slab.  That's fine.
Might as well use that for the pro-touch case.

I considered getting rid of PGSIZE, but its usage in obj->slab lookups
is pretty handy.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/slab.h
kern/src/arena.c
kern/src/slab.c