Skip to content
  • Mike Rapoport's avatar
    mm: make DEFERRED_STRUCT_PAGE_INIT explicitly depend on SPARSEMEM · 8bca1a92
    Mike Rapoport authored
    [ Upstream commit d39f8fb4 ]
    
    The deferred memory initialization relies on section definitions, e.g
    PAGES_PER_SECTION, that are only available when CONFIG_SPARSEMEM=y on
    most architectures.
    
    Initially DEFERRED_STRUCT_PAGE_INIT depended on explicit
    ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT configuration option, but since
    the commit 2e3ca40f ("mm: relax deferred struct page
    requirements") this requirement was relaxed and now it is possible to
    enable DEFERRED_STRUCT_PAGE_INIT on architectures that support
    DISCONTINGMEM and NO_BOOTMEM which causes build failures.
    
    For instance, setting SMP=y and DEFERRED_STRUCT_PAGE_INIT=y on arc
    causes the following build failure:
    
        CC      mm/page_alloc.o
      mm/page_alloc.c: In function 'update_defer_init':
      mm/page_alloc.c:321:14: error: 'PAGES_PER_SECTION'
      undeclared (first use in this function); did you mean 'USEC_PER_SEC'?
            (pfn & (PAGES_PER_SECTION - 1)) == 0) {
                    ^~~~~~~~~~~~~~~~~
                    USEC_PER_SEC
      mm/page_alloc.c:321:14: note: each undeclared identifier is reported only once for each function it appears in
      In file included from include/linux/cache.h:5:0,
                       from include/linux/printk.h:9,
                       from include/linux/kernel.h:14,
                       from include/asm-generic/bug.h:18,
                       from arch/arc/include/asm/bug.h:32,
                       from include/linux/bug.h:5,
                       from include/linux/mmdebug.h:5,
                       from include/linux/mm.h:9,
                       from mm/page_alloc.c:18:
      mm/page_alloc.c: In function 'deferred_grow_zone':
      mm/page_alloc.c:1624:52: error: 'PAGES_PER_SECTION' undeclared (first use in this function); did you mean 'USEC_PER_SEC'?
        unsigned long nr_pages_needed = ALIGN(1 << order, PAGES_PER_SECTION);
                                                          ^
      include/uapi/linux/kernel.h:11:47: note: in definition of macro '__ALIGN_KERNEL_MASK'
       #define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
                                                     ^~~~
      include/linux/kernel.h:58:22: note: in expansion of macro '__ALIGN_KERNEL'
       #define ALIGN(x, a)  __ALIGN_KERNEL((x), (a))
                            ^~~~~~~~~~~~~~
      mm/page_alloc.c:1624:34: note: in expansion of macro 'ALIGN'
        unsigned long nr_pages_needed = ALIGN(1 << order, PAGES_PER_SECTION);
                                        ^~~~~
      In file included from include/asm-generic/bug.h:18:0,
                       from arch/arc/include/asm/bug.h:32,
                       from include/linux/bug.h:5,
                       from include/linux/mmdebug.h:5,
                       from include/linux/mm.h:9,
                       from mm/page_alloc.c:18:
      mm/page_alloc.c: In function 'free_area_init_node':
      mm/page_alloc.c:6379:50: error: 'PAGES_PER_SECTION' undeclared (first use in this function); did you mean 'USEC_PER_SEC'?
        pgdat->static_init_pgcnt = min_t(unsigned long, PAGES_PER_SECTION,
                                                        ^
      include/linux/kernel.h:812:22: note: in definition of macro '__typecheck'
         (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
                            ^
      include/linux/kernel.h:836:24: note: in expansion of macro '__safe_cmp'
        __builtin_choose_expr(__safe_cmp(x, y), \
                              ^~~~~~~~~~
      include/linux/kernel.h:904:27: note: in expansion of macro '__careful_cmp'
       #define min_t(type, x, y) __careful_cmp((type)(x), (type)(y), <)
                                 ^~~~~~~~~~~~~
      mm/page_alloc.c:6379:29: note: in expansion of macro 'min_t'
        pgdat->static_init_pgcnt = min_t(unsigned long, PAGES_PER_SECTION,
                                   ^~~~~
      include/linux/kernel.h:836:2: error: first argument to '__builtin_choose_expr' not a constant
        __builtin_choose_expr(__safe_cmp(x, y), \
        ^
      include/linux/kernel.h:904:27: note: in expansion of macro '__careful_cmp'
       #define min_t(type, x, y) __careful_cmp((type)(x), (type)(y), <)
                                 ^~~~~~~~~~~~~
      mm/page_alloc.c:6379:29: note: in expansion of macro 'min_t'
        pgdat->static_init_pgcnt = min_t(unsigned long, PAGES_PER_SECTION,
                                   ^~~~~
      scripts/Makefile.build:317: recipe for target 'mm/page_alloc.o' failed
    
    Let's make the DEFERRED_STRUCT_PAGE_INIT explicitly depend on SPARSEMEM
    as the systems that support DISCONTIGMEM do not seem to have that huge
    amounts of memory that would make DEFERRED_STRUCT_PAGE_INIT relevant.
    
    Link: http://lkml.kernel.org/r/1530279308-24988-1-git-send-email-rppt@linux.vnet.ibm.com
    
    
    Signed-off-by: default avatarMike Rapoport <rppt@linux.vnet.ibm.com>
    Acked-by: default avatarMichal Hocko <mhocko@suse.com>
    Reviewed-by: default avatarPavel Tatashin <pasha.tatashin@oracle.com>
    Tested-by: default avatarRandy Dunlap <rdunlap@infradead.org>
    Cc: Pasha Tatashin <Pavel.Tatashin@microsoft.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    8bca1a92