]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
cpu/hotplug: Online siblings when SMT control is turned on
authorThomas Gleixner <tglx@linutronix.de>
Sat, 7 Jul 2018 09:40:18 +0000 (11:40 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 8 Aug 2018 12:08:07 +0000 (14:08 +0200)
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>
CVE-2018-3620
CVE-2018-3646

Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
kernel/cpu.c

index 55471c3e1eac343eb52a7e834a2056c018015d70..d06ae6fc876fb5657c9da68497d9da03ea9031a0 100644 (file)
@@ -1991,6 +1991,15 @@ static void cpuhp_offline_cpu_device(unsigned int cpu)
        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;
@@ -2023,11 +2032,24 @@ static int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval)
        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
@@ -2058,7 +2080,7 @@ store_smt_control(struct device *dev, struct device_attribute *attr,
        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: