On Thu 24-03-22 10:04:43, Thomas Bogendoerfer wrote: > On Wed, Mar 23, 2022 at 05:46:59PM +0100, Michal Hocko wrote: > > > > If you fix the issue, kindly add following tag as appropriate > > > > Reported-by: kernel test robot <lkp@xxxxxxxxx> > > > > > > > > All errors (new ones prefixed by >>): > > > > > > > > mips64-linux-ld: mm/page_alloc.o: in function `free_area_init': > > > > >> (.init.text+0x1680): undefined reference to `node_data' > > > > mips64-linux-ld: (.init.text+0x1690): undefined reference to `node_data' > > > > > > OK, I can see what is going here. The page allocator normally > > > uses NODE_DATA but arch_refresh_nodedata refers to node_data directly. > > > This is a problem with > > > arch/mips/include/asm/mach-loongson64/mmzone.h: > > > extern struct pglist_data *__node_data[]; > > > > > > #define NODE_DATA(n) (__node_data[n]) > > > > > > Unfortunately we cannot use NODE_DATA there because of header inclusion > > > ordering. I will think about a solution. > > > > Is there any reason why (some?) MIPS arches use __node_data rather than > > node_data as most other architectures? Would it be acceptable to do the > > renaming? It would help to cover the above compilation problem because > > arch_refresh_nodedata could keep using node_data directly. > > I've just checked history and I don't see a reason for __node_data. > So I'm fine with changing it to node_data. Thanks a lot for double checking Thomas! This is a dump&simple sed over mips file. 0-day guys, could you give it a try please? --- diff --git a/arch/mips/include/asm/mach-ip27/mmzone.h b/arch/mips/include/asm/mach-ip27/mmzone.h index 08c36e50a860..a798ad379da1 100644 --- a/arch/mips/include/asm/mach-ip27/mmzone.h +++ b/arch/mips/include/asm/mach-ip27/mmzone.h @@ -20,9 +20,9 @@ struct node_data { struct hub_data hub; }; -extern struct node_data *__node_data[]; +extern struct node_data *node_data[]; -#define NODE_DATA(n) (&__node_data[(n)]->pglist) -#define hub_data(n) (&__node_data[(n)]->hub) +#define NODE_DATA(n) (&node_data[(n)]->pglist) +#define hub_data(n) (&node_data[(n)]->hub) #endif /* _ASM_MACH_MMZONE_H */ diff --git a/arch/mips/include/asm/mach-loongson64/mmzone.h b/arch/mips/include/asm/mach-loongson64/mmzone.h index ebb1deaa77b9..14e2b860ad65 100644 --- a/arch/mips/include/asm/mach-loongson64/mmzone.h +++ b/arch/mips/include/asm/mach-loongson64/mmzone.h @@ -14,9 +14,9 @@ #define pa_to_nid(addr) (((addr) & 0xf00000000000) >> NODE_ADDRSPACE_SHIFT) #define nid_to_addrbase(nid) ((unsigned long)(nid) << NODE_ADDRSPACE_SHIFT) -extern struct pglist_data *__node_data[]; +extern struct pglist_data *node_data[]; -#define NODE_DATA(n) (__node_data[n]) +#define NODE_DATA(n) (node_data[n]) extern void setup_zero_pages(void); extern void __init prom_init_numa_memory(void); diff --git a/arch/mips/loongson64/numa.c b/arch/mips/loongson64/numa.c index e8e3e48c5333..abbbc70ce980 100644 --- a/arch/mips/loongson64/numa.c +++ b/arch/mips/loongson64/numa.c @@ -29,8 +29,8 @@ unsigned char __node_distances[MAX_NUMNODES][MAX_NUMNODES]; EXPORT_SYMBOL(__node_distances); -struct pglist_data *__node_data[MAX_NUMNODES]; -EXPORT_SYMBOL(__node_data); +struct pglist_data *node_data[MAX_NUMNODES]; +EXPORT_SYMBOL(node_data); cpumask_t __node_cpumask[MAX_NUMNODES]; EXPORT_SYMBOL(__node_cpumask); @@ -107,7 +107,7 @@ static void __init node_mem_init(unsigned int node) tnid = early_pfn_to_nid(nd_pa >> PAGE_SHIFT); if (tnid != node) pr_info("NODE_DATA(%d) on node %d\n", node, tnid); - __node_data[node] = nd; + node_data[node] = nd; NODE_DATA(node)->node_start_pfn = start_pfn; NODE_DATA(node)->node_spanned_pages = end_pfn - start_pfn; diff --git a/arch/mips/sgi-ip27/ip27-memory.c b/arch/mips/sgi-ip27/ip27-memory.c index adc2faeecf7c..1c3a0b92d134 100644 --- a/arch/mips/sgi-ip27/ip27-memory.c +++ b/arch/mips/sgi-ip27/ip27-memory.c @@ -33,9 +33,9 @@ #define SLOT_PFNSHIFT (SLOT_SHIFT - PAGE_SHIFT) #define PFN_NASIDSHFT (NASID_SHFT - PAGE_SHIFT) -struct node_data *__node_data[MAX_NUMNODES]; +struct node_data *node_data[MAX_NUMNODES]; -EXPORT_SYMBOL(__node_data); +EXPORT_SYMBOL(node_data); static u64 gen_region_mask(void) { @@ -358,8 +358,8 @@ static void __init node_mem_init(nasid_t node) /* * Allocate the node data structures on the node first. */ - __node_data[node] = __va(slot_freepfn << PAGE_SHIFT); - memset(__node_data[node], 0, PAGE_SIZE); + node_data[node] = __va(slot_freepfn << PAGE_SHIFT); + memset(node_data[node], 0, PAGE_SIZE); NODE_DATA(node)->node_start_pfn = start_pfn; NODE_DATA(node)->node_spanned_pages = end_pfn - start_pfn; @@ -401,7 +401,7 @@ void __init prom_meminit(void) node_mem_init(node); continue; } - __node_data[node] = &null_node; + node_data[node] = &null_node; } } -- Michal Hocko SUSE Labs