NUMA hotplug emulator
Subsystems (3)
RFC 4/7 NUMA hotplug emulator
hotplug emulator: Abstract cpu register functions
Abstract function arch_register_cpu and register_cpu, move the implementation details to a sub function with prefix "__".
each of the sub function has an extra parameter nid, it can be used to register CPU under a fake NUMA node, it is a reserved interface for cpu hotplug emulation (CPU PROBE/RELEASE) in x86.
---
arch/x86/kernel/topology.c +10 -1
@@ -34,7 +34,11 @@ static DEFINE_PER_CPU(struct x86_cpu, cpu_devices);#ifdef CONFIG_HOTPLUG_CPU -int __ref arch_register_cpu (int num) +/* +* Add nid(NUMA node id) as parameter for cpu hotplug emulation. It supports +* to register a CPU to any nodes. +*/ +static int __ref __arch_register_cpu (int num,int nid) {/* * CPU0 cannot be offlined due to several
@@ -50,6 +54,11 @@ int __ref arch_register_cpu(int num)return register_cpu (&per_cpu (cpu_devices, num).cpu, num); } + +int __ref arch_register_cpu (int num) +{ +return __arch_register_cpu (num,NUMA_NO_NODE ); +}EXPORT_SYMBOL (arch_register_cpu);void arch_unregister_cpu (int num)
drivers/base/cpu.c +17 -5
@@ -208,17 +208,20 @@ static ssize_t print_cpus_offline(struct sysdev_class *class, static SYSDEV_CLASS_ATTR(offline, 0444, print_cpus_offline, NULL);/* -* register_cpu - Setup a sysfs device for a CPU. +* __register_cpu -Initialize and register the CPU device. +* * @cpu - cpu->hotpluggable field set to 1 will generate a control file in * sysfs for this CPU. * @num - CPU number to use when creating the device. +* @nid - numa node id * -* Initialize and register the CPU device. +* We do not calculate nid by funciton cpu_to_node(), and change it as a +* parameter, it is an reserved interface for CPU hotplug emulation. */ -int __cpuinit register_cpu (struct cpu *cpu,int num) +static int __cpuinit __register_cpu (struct cpu *cpu,int num,int nid) {int error; - cpu->node_id =cpu_to_node (num); + cpu->node_id = nid; cpu->sysdev.id = num; cpu->sysdev.cls = &cpu_sysdev_class;
@@ -229,7 +232,7 @@ int __cpuinit register_cpu(struct cpu *cpu, int num)if (!error)per_cpu (cpu_sys_devices, num) = &cpu->sysdev;if (!error) -register_cpu_under_node (num,cpu_to_node (num)); +register_cpu_under_node (num, nid);#ifdef CONFIG_KEXEC if (!error)
@@ -238,6 +241,15 @@ int __cpuinit register_cpu(struct cpu *cpu, int num)return error; } +/* +* register_cpu - Setup a sysfs device for a CPU. +* Initialize and register the CPU device. +*/ +int __cpuinit register_cpu (struct cpu *cpu,int num) +{ +return __register_cpu (cpu, num,cpu_to_node (num)); +} +struct sys_device *get_cpu_sysdev (unsigned cpu) {if (cpu < nr_cpu_ids &&cpu_possible (cpu))
Signature · 2 lines
Thanks & Regards, Shaohui
hotplug emulator: Abstract cpu register functions
Abstract function arch_register_cpu and register_cpu, move the implementation details to a sub function with prefix "__".
each of the sub function has an extra parameter nid, it can be used to register CPU under a fake NUMA node, it is a reserved interface for cpu hotplug emulation (CPU PROBE/RELEASE) in x86.
---
arch/x86/kernel/topology.c +10 -1
@@ -34,7 +34,11 @@ static DEFINE_PER_CPU(struct x86_cpu, cpu_devices);#ifdef CONFIG_HOTPLUG_CPU -int __ref arch_register_cpu (int num) +/* +* Add nid(NUMA node id) as parameter for cpu hotplug emulation. It supports +* to register a CPU to any nodes. +*/ +static int __ref __arch_register_cpu (int num,int nid) {/* * CPU0 cannot be offlined due to several
@@ -50,6 +54,11 @@ int __ref arch_register_cpu(int num)return register_cpu (&per_cpu (cpu_devices, num).cpu, num); } + +int __ref arch_register_cpu (int num) +{ +return __arch_register_cpu (num,NUMA_NO_NODE ); +}EXPORT_SYMBOL (arch_register_cpu);void arch_unregister_cpu (int num)
drivers/base/cpu.c +17 -5
@@ -208,17 +208,20 @@ static ssize_t print_cpus_offline(struct sysdev_class *class, static SYSDEV_CLASS_ATTR(offline, 0444, print_cpus_offline, NULL);/* -* register_cpu - Setup a sysfs device for a CPU. +* __register_cpu -Initialize and register the CPU device. +* * @cpu - cpu->hotpluggable field set to 1 will generate a control file in * sysfs for this CPU. * @num - CPU number to use when creating the device. +* @nid - numa node id * -* Initialize and register the CPU device. +* We do not calculate nid by funciton cpu_to_node(), and change it as a +* parameter, it is an reserved interface for CPU hotplug emulation. */ -int __cpuinit register_cpu (struct cpu *cpu,int num) +static int __cpuinit __register_cpu (struct cpu *cpu,int num,int nid) {int error; - cpu->node_id =cpu_to_node (num); + cpu->node_id = nid; cpu->sysdev.id = num; cpu->sysdev.cls = &cpu_sysdev_class;
@@ -229,7 +232,7 @@ int __cpuinit register_cpu(struct cpu *cpu, int num)if (!error)per_cpu (cpu_sys_devices, num) = &cpu->sysdev;if (!error) -register_cpu_under_node (num,cpu_to_node (num)); +register_cpu_under_node (num, nid);#ifdef CONFIG_KEXEC if (!error)
@@ -238,6 +241,15 @@ int __cpuinit register_cpu(struct cpu *cpu, int num)return error; } +/* +* register_cpu - Setup a sysfs device for a CPU. +* Initialize and register the CPU device. +*/ +int __cpuinit register_cpu (struct cpu *cpu,int num) +{ +return __register_cpu (cpu, num,cpu_to_node (num)); +} +struct sys_device *get_cpu_sysdev (unsigned cpu) {if (cpu < nr_cpu_ids &&cpu_possible (cpu))