Re: [PATCH 01/17] mm/sparse: drop power-of-2 size requirement for struct mem_section

From: David Laight

Date: Wed Jul 15 2026 - 05:38:53 EST


On Thu, 2 Jul 2026 17:38:05 +0800
Muchun Song <songmuchun@xxxxxxxxxxxxx> wrote:

> struct mem_section is currently forced to a power-of-2 size so the
> section-to-root lookup can use a mask instead of a modulo.
>
> That requirement adds configuration-dependent padding, especially with
> CONFIG_PAGE_EXTENSION, just to preserve the lookup scheme.
>
> Drop the constraint and use a plain modulo for the lookup instead. The
> divisor is constant, so the generated code remains cheap while avoiding
> the extra padding. It also removes an unnecessary layout constraint
> from the type.

This has a side effect of changing the size of the 'section' from
PAGE_SIZE to something 'a bit smaller' when CONFIG_PAGE_EXTENSION
is defined.
I don't think it actually matters, the allocation is done by:

static noinline struct mem_section __ref *sparse_index_alloc(int nid)
{
struct mem_section *section = NULL;
unsigned long array_size = SECTIONS_PER_ROOT *
sizeof(struct mem_section);

if (slab_is_available()) {
section = kzalloc_node(array_size, GFP_KERNEL, nid);
} else {
section = memblock_alloc_node(array_size, SMP_CACHE_BYTES,
nid);

so the size might get rounded up to PAGE_SIZE anyway.

I also suspect that '% 24u' might be enough slower than '% 32u' to
generate a measurable performance drop.
(It doesn't matter whether you do '& 31' or '% 32u'.)

David