Skip to content

Commit 3464046

Browse files
Yasuaki Ishimatsutorvalds
authored andcommitted
numa, cpu hotplug: change links of CPU and node when changing node number by onlining CPU
When booting x86 system contains memoryless node, node numbers of CPUs on memoryless node were changed to nearest online node number by init_cpu_to_node() because the node is not online. In my system, node numbers of cpu#30-44 and 75-89 were changed from 2 to 0 as follows: $ numactl --hardware available: 2 nodes (0-1) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 node 0 size: 32394 MB node 0 free: 27898 MB node 1 cpus: 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 node 1 size: 32768 MB node 1 free: 30335 MB If we hot add memory to memoryless node and offine/online all CPUs on the node, node numbers of these CPUs are changed to correct node numbers by srat_detect_node() because the node become online. In this case, node numbers of cpu#30-44 and 75-89 were changed from 0 to 2 in my system as follows: $ numactl --hardware available: 3 nodes (0-2) node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 node 0 size: 32394 MB node 0 free: 27218 MB node 1 cpus: 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 node 1 size: 32768 MB node 1 free: 30014 MB node 2 cpus: 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 node 2 size: 16384 MB node 2 free: 16384 MB But "cpu to node" and "node to cpu" links were not changed as follows: $ ls /sys/devices/system/cpu/cpu30/|grep node node0 $ ls /sys/devices/system/node/node0/|grep cpu30 cpu30 "numactl --hardware" shows that cpu30 belongs to node 2. But sysfs links does not change. This patch changes "cpu to node" and "node to cpu" links when node number changed by onlining CPU. Signed-off-by: Yasuaki Ishimatsu <[email protected]> Cc: KOSAKI Motohiro <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: "H. Peter Anvin" <[email protected]> Cc: "Srivatsa S. Bhat" <[email protected]> Cc: Greg KH <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 349daa0 commit 3464046

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

drivers/base/cpu.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,15 @@ EXPORT_SYMBOL_GPL(cpu_subsys);
2525
static DEFINE_PER_CPU(struct device *, cpu_sys_devices);
2626

2727
#ifdef CONFIG_HOTPLUG_CPU
28+
static void change_cpu_under_node(struct cpu *cpu,
29+
unsigned int from_nid, unsigned int to_nid)
30+
{
31+
int cpuid = cpu->dev.id;
32+
unregister_cpu_under_node(cpuid, from_nid);
33+
register_cpu_under_node(cpuid, to_nid);
34+
cpu->node_id = to_nid;
35+
}
36+
2837
static ssize_t show_online(struct device *dev,
2938
struct device_attribute *attr,
3039
char *buf)
@@ -39,17 +48,29 @@ static ssize_t __ref store_online(struct device *dev,
3948
const char *buf, size_t count)
4049
{
4150
struct cpu *cpu = container_of(dev, struct cpu, dev);
51+
int cpuid = cpu->dev.id;
52+
int from_nid, to_nid;
4253
ssize_t ret;
4354

4455
cpu_hotplug_driver_lock();
4556
switch (buf[0]) {
4657
case '0':
47-
ret = cpu_down(cpu->dev.id);
58+
ret = cpu_down(cpuid);
4859
if (!ret)
4960
kobject_uevent(&dev->kobj, KOBJ_OFFLINE);
5061
break;
5162
case '1':
52-
ret = cpu_up(cpu->dev.id);
63+
from_nid = cpu_to_node(cpuid);
64+
ret = cpu_up(cpuid);
65+
66+
/*
67+
* When hot adding memory to memoryless node and enabling a cpu
68+
* on the node, node number of the cpu may internally change.
69+
*/
70+
to_nid = cpu_to_node(cpuid);
71+
if (from_nid != to_nid)
72+
change_cpu_under_node(cpu, from_nid, to_nid);
73+
5374
if (!ret)
5475
kobject_uevent(&dev->kobj, KOBJ_ONLINE);
5576
break;

0 commit comments

Comments
 (0)