Commit 2848a28b authored by David Hildenbrand's avatar David Hildenbrand Committed by Linus Torvalds

drivers/base/node: consolidate node device subsystem initialization in node_dev_init()

...  and call node_dev_init() after memory_dev_init() from driver_init(),
so before any of the existing arch/subsys calls.  All online nodes should
be known at that point: early during boot, arch code determines node and
zone ranges and sets the relevant nodes online; usually this happens in
setup_arch().

This is in line with memory_dev_init(), which initializes the memory
device subsystem and creates all memory block devices.

Similar to memory_dev_init(), panic() if anything goes wrong, we don't
want to continue with such basic initialization errors.

The important part is that node_dev_init() gets called after
memory_dev_init() and after cpu_dev_init(), but before any of the relevant
archs call register_cpu() to register the new cpu device under the node
device.  The latter should be the case for the current users of
topology_init().

Link: https://lkml.kernel.org/r/20220203105212.30385-1-david@redhat.comSigned-off-by: default avatarDavid Hildenbrand <david@redhat.com>
Reviewed-by: default avatarOscar Salvador <osalvador@suse.de>
Tested-by: Anatoly Pugachev <matorola@gmail.com> (sparc64)
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Rich Felker <dalias@libc.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7ea0d2d7
...@@ -406,9 +406,6 @@ static int __init topology_init(void) ...@@ -406,9 +406,6 @@ static int __init topology_init(void)
{ {
int i; int i;
for_each_online_node(i)
register_one_node(i);
for_each_possible_cpu(i) { for_each_possible_cpu(i) {
struct cpu *cpu = &per_cpu(cpu_data.cpu, i); struct cpu *cpu = &per_cpu(cpu_data.cpu, i);
cpu->hotpluggable = cpu_can_disable(i); cpu->hotpluggable = cpu_can_disable(i);
......
...@@ -70,16 +70,6 @@ static int __init topology_init(void) ...@@ -70,16 +70,6 @@ static int __init topology_init(void)
{ {
int i, err = 0; int i, err = 0;
#ifdef CONFIG_NUMA
/*
* MCD - Do we want to register all ONLINE nodes, or all POSSIBLE nodes?
*/
for_each_online_node(i) {
if ((err = register_one_node(i)))
goto out;
}
#endif
sysfs_cpus = kcalloc(NR_CPUS, sizeof(struct ia64_cpu), GFP_KERNEL); sysfs_cpus = kcalloc(NR_CPUS, sizeof(struct ia64_cpu), GFP_KERNEL);
if (!sysfs_cpus) if (!sysfs_cpus)
panic("kzalloc in topology_init failed - NR_CPUS too big?"); panic("kzalloc in topology_init failed - NR_CPUS too big?");
......
...@@ -12,11 +12,6 @@ static int __init topology_init(void) ...@@ -12,11 +12,6 @@ static int __init topology_init(void)
{ {
int i, ret; int i, ret;
#ifdef CONFIG_NUMA
for_each_online_node(i)
register_one_node(i);
#endif /* CONFIG_NUMA */
for_each_present_cpu(i) { for_each_present_cpu(i) {
struct cpu *c = &per_cpu(cpu_devices, i); struct cpu *c = &per_cpu(cpu_devices, i);
......
...@@ -1110,14 +1110,6 @@ EXPORT_SYMBOL_GPL(cpu_remove_dev_attr_group); ...@@ -1110,14 +1110,6 @@ EXPORT_SYMBOL_GPL(cpu_remove_dev_attr_group);
/* NUMA stuff */ /* NUMA stuff */
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
static void __init register_nodes(void)
{
int i;
for (i = 0; i < MAX_NUMNODES; i++)
register_one_node(i);
}
int sysfs_add_device_to_node(struct device *dev, int nid) int sysfs_add_device_to_node(struct device *dev, int nid)
{ {
struct node *node = node_devices[nid]; struct node *node = node_devices[nid];
...@@ -1132,13 +1124,6 @@ void sysfs_remove_device_from_node(struct device *dev, int nid) ...@@ -1132,13 +1124,6 @@ void sysfs_remove_device_from_node(struct device *dev, int nid)
sysfs_remove_link(&node->dev.kobj, kobject_name(&dev->kobj)); sysfs_remove_link(&node->dev.kobj, kobject_name(&dev->kobj));
} }
EXPORT_SYMBOL_GPL(sysfs_remove_device_from_node); EXPORT_SYMBOL_GPL(sysfs_remove_device_from_node);
#else
static void __init register_nodes(void)
{
return;
}
#endif #endif
/* Only valid if CPU is present. */ /* Only valid if CPU is present. */
...@@ -1155,8 +1140,6 @@ static int __init topology_init(void) ...@@ -1155,8 +1140,6 @@ static int __init topology_init(void)
{ {
int cpu, r; int cpu, r;
register_nodes();
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
struct cpu *c = &per_cpu(cpu_devices, cpu); struct cpu *c = &per_cpu(cpu_devices, cpu);
......
...@@ -301,9 +301,6 @@ static int __init topology_init(void) ...@@ -301,9 +301,6 @@ static int __init topology_init(void)
{ {
int i, ret; int i, ret;
for_each_online_node(i)
register_one_node(i);
for_each_possible_cpu(i) { for_each_possible_cpu(i) {
struct cpu *cpu = &per_cpu(cpu_devices, i); struct cpu *cpu = &per_cpu(cpu_devices, i);
......
...@@ -33,10 +33,3 @@ void __init numa_setup(void) ...@@ -33,10 +33,3 @@ void __init numa_setup(void)
NODE_DATA(0)->node_spanned_pages = memblock_end_of_DRAM() >> PAGE_SHIFT; NODE_DATA(0)->node_spanned_pages = memblock_end_of_DRAM() >> PAGE_SHIFT;
NODE_DATA(0)->node_id = 0; NODE_DATA(0)->node_id = 0;
} }
static int __init numa_init_late(void)
{
register_one_node(0);
return 0;
}
arch_initcall(numa_init_late);
...@@ -46,11 +46,6 @@ static int __init topology_init(void) ...@@ -46,11 +46,6 @@ static int __init topology_init(void)
{ {
int i, ret; int i, ret;
#ifdef CONFIG_NUMA
for_each_online_node(i)
register_one_node(i);
#endif
for_each_present_cpu(i) { for_each_present_cpu(i) {
struct cpu *c = &per_cpu(cpu_devices, i); struct cpu *c = &per_cpu(cpu_devices, i);
......
...@@ -244,22 +244,10 @@ static void __init check_mmu_stats(void) ...@@ -244,22 +244,10 @@ static void __init check_mmu_stats(void)
mmu_stats_supported = 1; mmu_stats_supported = 1;
} }
static void register_nodes(void)
{
#ifdef CONFIG_NUMA
int i;
for (i = 0; i < MAX_NUMNODES; i++)
register_one_node(i);
#endif
}
static int __init topology_init(void) static int __init topology_init(void)
{ {
int cpu, ret; int cpu, ret;
register_nodes();
check_mmu_stats(); check_mmu_stats();
for_each_possible_cpu(cpu) { for_each_possible_cpu(cpu) {
......
...@@ -154,11 +154,6 @@ static int __init topology_init(void) ...@@ -154,11 +154,6 @@ static int __init topology_init(void)
{ {
int i; int i;
#ifdef CONFIG_NUMA
for_each_online_node(i)
register_one_node(i);
#endif
for_each_present_cpu(i) for_each_present_cpu(i)
arch_register_cpu(i); arch_register_cpu(i);
......
...@@ -35,5 +35,6 @@ void __init driver_init(void) ...@@ -35,5 +35,6 @@ void __init driver_init(void)
auxiliary_bus_init(); auxiliary_bus_init();
cpu_dev_init(); cpu_dev_init();
memory_dev_init(); memory_dev_init();
node_dev_init();
container_dev_init(); container_dev_init();
} }
...@@ -1065,26 +1065,30 @@ static const struct attribute_group *cpu_root_attr_groups[] = { ...@@ -1065,26 +1065,30 @@ static const struct attribute_group *cpu_root_attr_groups[] = {
}; };
#define NODE_CALLBACK_PRI 2 /* lower than SLAB */ #define NODE_CALLBACK_PRI 2 /* lower than SLAB */
static int __init register_node_type(void) void __init node_dev_init(void)
{ {
int ret; static struct notifier_block node_memory_callback_nb = {
.notifier_call = node_memory_callback,
.priority = NODE_CALLBACK_PRI,
};
int ret, i;
BUILD_BUG_ON(ARRAY_SIZE(node_state_attr) != NR_NODE_STATES); BUILD_BUG_ON(ARRAY_SIZE(node_state_attr) != NR_NODE_STATES);
BUILD_BUG_ON(ARRAY_SIZE(node_state_attrs)-1 != NR_NODE_STATES); BUILD_BUG_ON(ARRAY_SIZE(node_state_attrs)-1 != NR_NODE_STATES);
ret = subsys_system_register(&node_subsys, cpu_root_attr_groups); ret = subsys_system_register(&node_subsys, cpu_root_attr_groups);
if (!ret) { if (ret)
static struct notifier_block node_memory_callback_nb = { panic("%s() failed to register subsystem: %d\n", __func__, ret);
.notifier_call = node_memory_callback,
.priority = NODE_CALLBACK_PRI, register_hotmemory_notifier(&node_memory_callback_nb);
};
register_hotmemory_notifier(&node_memory_callback_nb);
}
/* /*
* Note: we're not going to unregister the node class if we fail * Create all node devices, which will properly link the node
* to register the node state class attribute files. * to applicable memory block devices and already created cpu devices.
*/ */
return ret; for_each_online_node(i) {
ret = register_one_node(i);
if (ret)
panic("%s() failed to add node: %d\n", __func__, ret);
}
} }
postcore_initcall(register_node_type);
...@@ -112,6 +112,7 @@ static inline void link_mem_sections(int nid, unsigned long start_pfn, ...@@ -112,6 +112,7 @@ static inline void link_mem_sections(int nid, unsigned long start_pfn,
extern void unregister_node(struct node *node); extern void unregister_node(struct node *node);
#ifdef CONFIG_NUMA #ifdef CONFIG_NUMA
extern void node_dev_init(void);
/* Core of the node registration - only memory hotplug should use this */ /* Core of the node registration - only memory hotplug should use this */
extern int __register_one_node(int nid); extern int __register_one_node(int nid);
...@@ -149,6 +150,9 @@ extern void register_hugetlbfs_with_node(node_registration_func_t doregister, ...@@ -149,6 +150,9 @@ extern void register_hugetlbfs_with_node(node_registration_func_t doregister,
node_registration_func_t unregister); node_registration_func_t unregister);
#endif #endif
#else #else
static inline void node_dev_init(void)
{
}
static inline int __register_one_node(int nid) static inline int __register_one_node(int nid)
{ {
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment