Re: [PATCH] mm/sparse: keep mem_section_usage_size() internal
Muchun Song <[email protected]> Tue, 4 Aug 2026 19:10:50 +0800
| Newsgroups | gmane.linux.kernel,gmane.linux.kernel.mm |
|---|---|
| Message-ID | <[email protected]> |
> On Aug 4, 2026, at 18:09, David Hildenbrand (Arm) <[email protected]> = wrote: >=20 > On 8/4/26 12:01, Muchun Song wrote: >> mem_section_usage_size() is only needed by sparsemem implementation = code, >> but declaring it in mmzone.h makes the helper visible to all mmzone.h >> users. >=20 > Worth mentioning that >=20 > commit ae751d567baa08342e5e34b378b72a6f9b2cfada > Author: David Hildenbrand (Arm) <[email protected]> > Date: Mon May 11 16:05:34 2026 +0200 >=20 > mm/bootmem_info: stop marking mem_section_usage as MIX_SECTION_INFO >=20 > Remove the last external user. Will do. >=20 >>=20 >> Move the helper to sparse.h so sparse.c and sparse-vmemmap.c can = share >> it through the internal header. While doing so, calculate the = allocation >> size with struct_size(), which ties the expression to the = pageblock_flags >> trailing array instead of open-coding the struct header plus bitmap = size. >>=20 >> Signed-off-by: Muchun Song <[email protected]> >> --- >> include/linux/mmzone.h | 1 - >> mm/sparse.c | 10 ---------- >> mm/sparse.h | 6 ++++++ >> 3 files changed, 6 insertions(+), 11 deletions(-) >>=20 >> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h >> index a26c8b855222..86891163e0ef 100644 >> --- a/include/linux/mmzone.h >> +++ b/include/linux/mmzone.h >> @@ -2070,7 +2070,6 @@ static inline struct mem_section = *__nr_to_section(unsigned long nr) >> #endif >> return &mem_section[root][nr & SECTION_ROOT_MASK]; >> } >> -extern size_t mem_section_usage_size(void); >>=20 >> /* >> * We use the lower bits of the mem_map pointer to store a little bit = of >> diff --git a/mm/sparse.c b/mm/sparse.c >> index 704a9dec2b9a..46458e5300e2 100644 >> --- a/mm/sparse.c >> +++ b/mm/sparse.c >> @@ -213,16 +213,6 @@ static void __init memblocks_present(void) >> memory_present(nid, start, end); >> } >>=20 >> -static unsigned long usemap_size(void) >> -{ >> - return BITS_TO_LONGS(SECTION_BLOCKFLAGS_BITS) * sizeof(unsigned = long); >> -} >> - >> -size_t mem_section_usage_size(void) >> -{ >> - return sizeof(struct mem_section_usage) + usemap_size(); >> -} >> - >> #ifdef CONFIG_SPARSEMEM_VMEMMAP >> unsigned long __init section_map_size(void) >> { >> diff --git a/mm/sparse.h b/mm/sparse.h >> index 95aa031213f2..4960a17b706f 100644 >> --- a/mm/sparse.h >> +++ b/mm/sparse.h >> @@ -47,6 +47,12 @@ static inline void __section_mark_present(struct = mem_section *ms, >>=20 >> ms->section_mem_map |=3D SECTION_MARKED_PRESENT; >> } >> + >> +static inline size_t mem_section_usage_size(void) >> +{ >> + return struct_size((struct mem_section_usage *)NULL, = pageblock_flags, >> + BITS_TO_LONGS(SECTION_BLOCKFLAGS_BITS)); >> +} >=20 > There is struct_size_t() that avoids the manual "NULL" trick. I hadn't noticed that API before. Thanks for the heads-up. I'll send a v2 to fix this. Muchun, Thanks. >=20 > --=20 > Cheers, >=20 > David