On 8/29/22 17:43, Tom Lane wrote:
> Tomas Vondra <tomas.vondra@enterprisedb.com> writes:
>> I suspect it's a pre-existing bug in Slab allocator, because it does this:
>
>> #define SlabBlockGetChunk(slab, block, idx) \
>> ((MemoryChunk *) ((char *) (block) + sizeof(SlabBlock) \
>> + (idx * slab->fullChunkSize)))
>
>> and SlabBlock is only 20B, i.e. not a multiple of 8B. Which would mean
>> that even if we allocate block and size the chunks carefully (with all
>> the MAXALIGN things), we ultimately slice the block incorrectly.
>
> Right, same conclusion I just came to. But it's not a "pre-existing"
> bug, because sizeof(SlabBlock) *was* maxaligned until David added
> another field to it.
>
Yeah, that's true. Still, there was an implicit expectation the size is
maxaligned, but it wasn't mentioned anywhere. I don't even recall if I
was aware of it when I wrote that code, or if I was just lucky.
> I think adding a padding field to SlabBlock would be a less messy
> solution than your patch.
Maybe, although I find it a bit annoying that we do MAXALIGN() for a
bunch of structs, and then in other places we add padding. Maybe not for
Slab, but e.g. for Generation. Maybe we should try doing the same thing
in all those places.
regards
--
Tomas Vondra
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company