Commit 215af549 authored by Thomas Gleixner's avatar Thomas Gleixner

cpu/hotplug: Online siblings when SMT control is turned on

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: default avatarThomas Gleixner <tglx@linutronix.de>
parent 390d975e
...@@ -1979,6 +1979,15 @@ static void cpuhp_offline_cpu_device(unsigned int cpu) ...@@ -1979,6 +1979,15 @@ static void cpuhp_offline_cpu_device(unsigned int cpu)
kobject_uevent(&dev->kobj, KOBJ_OFFLINE); 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) static int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval)
{ {
int cpu, ret = 0; int cpu, ret = 0;
...@@ -2011,11 +2020,24 @@ static int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval) ...@@ -2011,11 +2020,24 @@ static int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval)
return ret; return ret;
} }
static void cpuhp_smt_enable(void) static int cpuhp_smt_enable(void)
{ {
int cpu, ret = 0;
cpu_maps_update_begin(); cpu_maps_update_begin();
cpu_smt_control = CPU_SMT_ENABLED; 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(); cpu_maps_update_done();
return ret;
} }
static ssize_t static ssize_t
...@@ -2046,7 +2068,7 @@ store_smt_control(struct device *dev, struct device_attribute *attr, ...@@ -2046,7 +2068,7 @@ store_smt_control(struct device *dev, struct device_attribute *attr,
if (ctrlval != cpu_smt_control) { if (ctrlval != cpu_smt_control) {
switch (ctrlval) { switch (ctrlval) {
case CPU_SMT_ENABLED: case CPU_SMT_ENABLED:
cpuhp_smt_enable(); ret = cpuhp_smt_enable();
break; break;
case CPU_SMT_DISABLED: case CPU_SMT_DISABLED:
case CPU_SMT_FORCE_DISABLED: case CPU_SMT_FORCE_DISABLED:
......
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