]> git.hungrycats.org Git - linux/commitdiff
[PATCH] Hotplug CPUs: Sysfs Online Attribute
authorRusty Russell <rusty@rustcorp.com.au>
Fri, 19 Mar 2004 00:02:37 +0000 (16:02 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 19 Mar 2004 00:02:37 +0000 (16:02 -0800)
Add "online" sysfs attribute to cpus to bring them up and down.

Again, only under CONFIG_HOTPLUG_CPU.

drivers/base/cpu.c

index cf92d77467a8b1979f59798f40f41f7829a30836..82b4430ab3412782e70a80891da5c57674a066bb 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/init.h>
 #include <linux/cpu.h>
 #include <linux/topology.h>
+#include <linux/device.h>
 
 
 struct sysdev_class cpu_sysdev_class = {
@@ -14,6 +15,46 @@ struct sysdev_class cpu_sysdev_class = {
 };
 EXPORT_SYMBOL(cpu_sysdev_class);
 
+#ifdef CONFIG_HOTPLUG_CPU
+static ssize_t show_online(struct sys_device *dev, char *buf)
+{
+       struct cpu *cpu = container_of(dev, struct cpu, sysdev);
+
+       return sprintf(buf, "%u\n", !!cpu_online(cpu->sysdev.id));
+}
+
+static ssize_t store_online(struct sys_device *dev, const char *buf,
+                           size_t count)
+{
+       struct cpu *cpu = container_of(dev, struct cpu, sysdev);
+       ssize_t ret;
+
+       switch (buf[0]) {
+       case '0':
+               ret = cpu_down(cpu->sysdev.id);
+               break;
+       case '1':
+               ret = cpu_up(cpu->sysdev.id);
+               break;
+       default:
+               ret = -EINVAL;
+       }
+
+       if (ret >= 0)
+               ret = count;
+       return ret;
+}
+static SYSDEV_ATTR(online, 0600, show_online, store_online);
+
+static void __init register_cpu_control(struct cpu *cpu)
+{
+       sysdev_create_file(&cpu->sysdev, &attr_online);
+}
+#else /* ... !CONFIG_HOTPLUG_CPU */
+static inline void register_cpu_control(struct cpu *cpu)
+{
+}
+#endif /* CONFIG_HOTPLUG_CPU */
 
 /*
  * register_cpu - Setup a driverfs device for a CPU.
@@ -34,6 +75,8 @@ int __init register_cpu(struct cpu *cpu, int num, struct node *root)
                error = sysfs_create_link(&root->sysdev.kobj,
                                          &cpu->sysdev.kobj,
                                          kobject_name(&cpu->sysdev.kobj));
+       if (!error)
+               register_cpu_control(cpu);
        return error;
 }