Skip to content

Commit a431dbb

Browse files
Waiman-Longtorvalds
authored andcommitted
mm/sparsemem: fix 'mem_section' will never be NULL gcc 12 warning
The gcc 12 compiler reports a "'mem_section' will never be NULL" warning on the following code: static inline struct mem_section *__nr_to_section(unsigned long nr) { #ifdef CONFIG_SPARSEMEM_EXTREME if (!mem_section) return NULL; #endif if (!mem_section[SECTION_NR_TO_ROOT(nr)]) return NULL; : It happens with CONFIG_SPARSEMEM_EXTREME off. The mem_section definition is #ifdef CONFIG_SPARSEMEM_EXTREME extern struct mem_section **mem_section; #else extern struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT]; #endif In the !CONFIG_SPARSEMEM_EXTREME case, mem_section is a static 2-dimensional array and so the check "!mem_section[SECTION_NR_TO_ROOT(nr)]" doesn't make sense. Fix this warning by moving the "!mem_section[SECTION_NR_TO_ROOT(nr)]" check up inside the CONFIG_SPARSEMEM_EXTREME block and adding an explicit NR_SECTION_ROOTS check to make sure that there is no out-of-bound array access. Link: https://lkml.kernel.org/r/20220331180246.2746210-1-longman@redhat.com Fixes: 3e34726 ("sparsemem extreme implementation") Signed-off-by: Waiman Long <longman@redhat.com> Reported-by: Justin Forbes <jforbes@redhat.com> Cc: "Kirill A . Shutemov" <kirill.shutemov@linux.intel.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Rafael Aquini <aquini@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent eafc0a0 commit a431dbb

1 file changed

Lines changed: 7 additions & 4 deletions

File tree

include/linux/mmzone.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,13 +1397,16 @@ static inline unsigned long *section_to_usemap(struct mem_section *ms)
13971397

13981398
static inline struct mem_section *__nr_to_section(unsigned long nr)
13991399
{
1400+
unsigned long root = SECTION_NR_TO_ROOT(nr);
1401+
1402+
if (unlikely(root >= NR_SECTION_ROOTS))
1403+
return NULL;
1404+
14001405
#ifdef CONFIG_SPARSEMEM_EXTREME
1401-
if (!mem_section)
1406+
if (!mem_section || !mem_section[root])
14021407
return NULL;
14031408
#endif
1404-
if (!mem_section[SECTION_NR_TO_ROOT(nr)])
1405-
return NULL;
1406-
return &mem_section[SECTION_NR_TO_ROOT(nr)][nr & SECTION_ROOT_MASK];
1409+
return &mem_section[root][nr & SECTION_ROOT_MASK];
14071410
}
14081411
extern size_t mem_section_usage_size(void);
14091412

0 commit comments

Comments
 (0)