| From foo@baz Tue Aug 14 16:14:56 CEST 2018 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Sat, 7 Jul 2018 11:40:18 +0200 |
| Subject: cpu/hotplug: Online siblings when SMT control is turned on |
| |
| From: Thomas Gleixner <tglx@linutronix.de> |
| |
| commit 215af5499d9e2b55f111d2431ea20218115f29b3 upstream |
| |
| Writing 'off' to /sys/devices/system/cpu/smt/control offlines all SMT |
| siblings. Writing 'on' merily enables the abilify to online them, but does |
| not online them automatically. |
| |
| Make 'on' more useful by onlining all offline siblings. |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| kernel/cpu.c | 26 ++++++++++++++++++++++++-- |
| 1 file changed, 24 insertions(+), 2 deletions(-) |
| |
| --- a/kernel/cpu.c |
| +++ b/kernel/cpu.c |
| @@ -1917,6 +1917,15 @@ static void cpuhp_offline_cpu_device(uns |
| kobject_uevent(&dev->kobj, KOBJ_OFFLINE); |
| } |
| |
| +static void cpuhp_online_cpu_device(unsigned int cpu) |
| +{ |
| + struct device *dev = get_cpu_device(cpu); |
| + |
| + dev->offline = false; |
| + /* Tell user space about the state change */ |
| + kobject_uevent(&dev->kobj, KOBJ_ONLINE); |
| +} |
| + |
| static int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval) |
| { |
| int cpu, ret = 0; |
| @@ -1949,11 +1958,24 @@ static int cpuhp_smt_disable(enum cpuhp_ |
| return ret; |
| } |
| |
| -static void cpuhp_smt_enable(void) |
| +static int cpuhp_smt_enable(void) |
| { |
| + int cpu, ret = 0; |
| + |
| cpu_maps_update_begin(); |
| cpu_smt_control = CPU_SMT_ENABLED; |
| + for_each_present_cpu(cpu) { |
| + /* Skip online CPUs and CPUs on offline nodes */ |
| + if (cpu_online(cpu) || !node_online(cpu_to_node(cpu))) |
| + continue; |
| + ret = _cpu_up(cpu, 0, CPUHP_ONLINE); |
| + if (ret) |
| + break; |
| + /* See comment in cpuhp_smt_disable() */ |
| + cpuhp_online_cpu_device(cpu); |
| + } |
| cpu_maps_update_done(); |
| + return ret; |
| } |
| |
| static ssize_t |
| @@ -1984,7 +2006,7 @@ store_smt_control(struct device *dev, st |
| if (ctrlval != cpu_smt_control) { |
| switch (ctrlval) { |
| case CPU_SMT_ENABLED: |
| - cpuhp_smt_enable(); |
| + ret = cpuhp_smt_enable(); |
| break; |
| case CPU_SMT_DISABLED: |
| case CPU_SMT_FORCE_DISABLED: |