Re: [PATCH] mm/sparse: keep mem_section_usage_size() internal
"David Hildenbrand (Arm)" <[email protected]> Tue, 4 Aug 2026 12:09:04 +0200
| Newsgroups | gmane.linux.kernel,gmane.linux.kernel.mm |
|---|---|
| Message-ID | <[email protected]> |
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. Worth mentioning that commit ae751d567baa08342e5e34b378b72a6f9b2cfada Author: David Hildenbrand (Arm) <[email protected]> Date: Mon May 11 16:05:34 2026 +0200 mm/bootmem_info: stop marking mem_section_usage as MIX_SECTION_INFO Remove the last external user. > > 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. > > 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(-) > > 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); > > /* > * 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); > } > > -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, > > ms->section_mem_map |= 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)); > +} There is struct_size_t() that avoids the manual "NULL" trick. -- Cheers, David