Commit-ID:  a12486641cddbe825d0441140c7f43e30096bf70
Gitweb:     https://git.kernel.org/tip/a12486641cddbe825d0441140c7f43e30096bf70
Author:     Randy Dunlap <rdun...@infradead.org>
AuthorDate: Wed, 3 Jul 2019 15:27:24 -0700
Committer:  Thomas Gleixner <t...@linutronix.de>
CommitDate: Mon, 8 Jul 2019 14:52:27 +0200

cpu/hotplug: Fix CONFIG_SYSFS=n build errors

Following link errors happen when building a almost-allmodconfig but
CONFIG_SYSFS is not set/enabled:

 ld: arch/x86/power/cpu.o: in function `hibernate_resume_nonboot_cpu_disable':
 cpu.c:(.text+0x9f4): undefined reference to `cpuhp_smt_enable'
 ld: arch/x86/power/hibernate.o: in function `arch_resume_nosmt':
 hibernate.c:(.text+0x7f7): undefined reference to `cpuhp_smt_enable'
 ld: hibernate.c:(.text+0x809): undefined reference to `cpuhp_smt_disable'

The missing functions should not be inside #if CONFIG_SYSFS/#endif. Moving
them around and adjusting the #ifdeffery makes also the non-SYSFS stub for
__store_smt_control() obsolete.

No functional change.

Fixes: 98f8cdce1db5 ("cpu/hotplug: Add sysfs state interface")
Signed-off-by: Randy Dunlap <rdun...@infradead.org>
Signed-off-by: Thomas Gleixner <t...@linutronix.de>
Link: 
https://lkml.kernel.org/r/9906a70d-7a4a-03a1-f555-072315703...@infradead.org
---
 kernel/cpu.c | 242 +++++++++++++++++++++++++++++------------------------------
 1 file changed, 118 insertions(+), 124 deletions(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index ef1c565edc5d..1eec77e7950e 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -376,7 +376,7 @@ static void lockdep_release_cpus_lock(void)
 {
 }
 
-#endif /* CONFIG_HOTPLUG_CPU */
+#endif /* CONFIG_HOTPLUG_CPU */
 
 /*
  * Architectures that need SMT-specific errata handling during SMT hotplug
@@ -1892,6 +1892,123 @@ void __cpuhp_remove_state(enum cpuhp_state state, bool 
invoke)
 }
 EXPORT_SYMBOL(__cpuhp_remove_state);
 
+#ifdef CONFIG_HOTPLUG_CPU
+
+static void cpuhp_offline_cpu_device(unsigned int cpu)
+{
+       struct device *dev = get_cpu_device(cpu);
+
+       dev->offline = true;
+       /* Tell user space about the state change */
+       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);
+}
+
+int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval)
+{
+       int cpu, ret = 0;
+
+       cpu_maps_update_begin();
+       for_each_online_cpu(cpu) {
+               if (topology_is_primary_thread(cpu))
+                       continue;
+               ret = cpu_down_maps_locked(cpu, CPUHP_OFFLINE);
+               if (ret)
+                       break;
+               /*
+                * As this needs to hold the cpu maps lock it's impossible
+                * to call device_offline() because that ends up calling
+                * cpu_down() which takes cpu maps lock. cpu maps lock
+                * needs to be held as this might race against in kernel
+                * abusers of the hotplug machinery (thermal management).
+                *
+                * So nothing would update device:offline state. That would
+                * leave the sysfs entry stale and prevent onlining after
+                * smt control has been changed to 'off' again. This is
+                * called under the sysfs hotplug lock, so it is properly
+                * serialized against the regular offline usage.
+                */
+               cpuhp_offline_cpu_device(cpu);
+       }
+       if (!ret)
+               cpu_smt_control = ctrlval;
+       cpu_maps_update_done();
+       return ret;
+}
+
+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;
+}
+
+#if defined(CONFIG_HOTPLUG_SMT) && defined(CONFIG_SYSFS)
+static ssize_t
+__store_smt_control(struct device *dev, struct device_attribute *attr,
+                   const char *buf, size_t count)
+{
+       int ctrlval, ret;
+
+       if (sysfs_streq(buf, "on"))
+               ctrlval = CPU_SMT_ENABLED;
+       else if (sysfs_streq(buf, "off"))
+               ctrlval = CPU_SMT_DISABLED;
+       else if (sysfs_streq(buf, "forceoff"))
+               ctrlval = CPU_SMT_FORCE_DISABLED;
+       else
+               return -EINVAL;
+
+       if (cpu_smt_control == CPU_SMT_FORCE_DISABLED)
+               return -EPERM;
+
+       if (cpu_smt_control == CPU_SMT_NOT_SUPPORTED)
+               return -ENODEV;
+
+       ret = lock_device_hotplug_sysfs();
+       if (ret)
+               return ret;
+
+       if (ctrlval != cpu_smt_control) {
+               switch (ctrlval) {
+               case CPU_SMT_ENABLED:
+                       ret = cpuhp_smt_enable();
+                       break;
+               case CPU_SMT_DISABLED:
+               case CPU_SMT_FORCE_DISABLED:
+                       ret = cpuhp_smt_disable(ctrlval);
+                       break;
+               }
+       }
+
+       unlock_device_hotplug();
+       return ret ? ret : count;
+}
+#endif /* CONFIG_HOTPLUG_SMT && CONFIG_SYSFS */
+
+#endif /* CONFIG_HOTPLUG_CPU */
+
 #if defined(CONFIG_SYSFS) && defined(CONFIG_HOTPLUG_CPU)
 static ssize_t show_cpuhp_state(struct device *dev,
                                struct device_attribute *attr, char *buf)
@@ -2044,129 +2161,6 @@ static const struct attribute_group 
cpuhp_cpu_root_attr_group = {
        NULL
 };
 
-#ifdef CONFIG_HOTPLUG_SMT
-
-static void cpuhp_offline_cpu_device(unsigned int cpu)
-{
-       struct device *dev = get_cpu_device(cpu);
-
-       dev->offline = true;
-       /* Tell user space about the state change */
-       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);
-}
-
-int cpuhp_smt_disable(enum cpuhp_smt_control ctrlval)
-{
-       int cpu, ret = 0;
-
-       cpu_maps_update_begin();
-       for_each_online_cpu(cpu) {
-               if (topology_is_primary_thread(cpu))
-                       continue;
-               ret = cpu_down_maps_locked(cpu, CPUHP_OFFLINE);
-               if (ret)
-                       break;
-               /*
-                * As this needs to hold the cpu maps lock it's impossible
-                * to call device_offline() because that ends up calling
-                * cpu_down() which takes cpu maps lock. cpu maps lock
-                * needs to be held as this might race against in kernel
-                * abusers of the hotplug machinery (thermal management).
-                *
-                * So nothing would update device:offline state. That would
-                * leave the sysfs entry stale and prevent onlining after
-                * smt control has been changed to 'off' again. This is
-                * called under the sysfs hotplug lock, so it is properly
-                * serialized against the regular offline usage.
-                */
-               cpuhp_offline_cpu_device(cpu);
-       }
-       if (!ret)
-               cpu_smt_control = ctrlval;
-       cpu_maps_update_done();
-       return ret;
-}
-
-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
-__store_smt_control(struct device *dev, struct device_attribute *attr,
-                   const char *buf, size_t count)
-{
-       int ctrlval, ret;
-
-       if (sysfs_streq(buf, "on"))
-               ctrlval = CPU_SMT_ENABLED;
-       else if (sysfs_streq(buf, "off"))
-               ctrlval = CPU_SMT_DISABLED;
-       else if (sysfs_streq(buf, "forceoff"))
-               ctrlval = CPU_SMT_FORCE_DISABLED;
-       else
-               return -EINVAL;
-
-       if (cpu_smt_control == CPU_SMT_FORCE_DISABLED)
-               return -EPERM;
-
-       if (cpu_smt_control == CPU_SMT_NOT_SUPPORTED)
-               return -ENODEV;
-
-       ret = lock_device_hotplug_sysfs();
-       if (ret)
-               return ret;
-
-       if (ctrlval != cpu_smt_control) {
-               switch (ctrlval) {
-               case CPU_SMT_ENABLED:
-                       ret = cpuhp_smt_enable();
-                       break;
-               case CPU_SMT_DISABLED:
-               case CPU_SMT_FORCE_DISABLED:
-                       ret = cpuhp_smt_disable(ctrlval);
-                       break;
-               }
-       }
-
-       unlock_device_hotplug();
-       return ret ? ret : count;
-}
-
-#else /* !CONFIG_HOTPLUG_SMT */
-static ssize_t
-__store_smt_control(struct device *dev, struct device_attribute *attr,
-                   const char *buf, size_t count)
-{
-       return -ENODEV;
-}
-#endif /* CONFIG_HOTPLUG_SMT */
-
 static const char *smt_states[] = {
        [CPU_SMT_ENABLED]               = "on",
        [CPU_SMT_DISABLED]              = "off",

Reply via email to