Hi all, On Wed, 22 May 2013 13:47:41 +1000 Stephen Rothwell wrote: > > Today's linux-next merge of the driver-core tree got a conflict in > drivers/base/cpu.c between commit 0902a9044fa5 ("Driver core: Use generic > offline/online for CPU offline/online") from the pm tree and commit > 1c4e2d70afb1 ("cpu: make sure that cpu/online file created before > KOBJ_ADD is emitted") from the driver-core tree. > > I fixed it up (they do some bits in common - see below) and can carry the > fix as necessary (no action is required). > > diff --cc drivers/base/cpu.c > index 7431ba6,c377673..0000000 > --- a/drivers/base/cpu.c > +++ b/drivers/base/cpu.c > @@@ -38,39 -34,66 +38,48 @@@ static void change_cpu_under_node(struc > cpu->node_id = to_nid; > } > > -static ssize_t show_online(struct device *dev, > - struct device_attribute *attr, > - char *buf) > +static int __ref cpu_subsys_online(struct device *dev) > { > struct cpu *cpu = container_of(dev, struct cpu, dev); > + int cpuid = dev->id; > + int from_nid, to_nid; > + int ret; > + > + cpu_hotplug_driver_lock(); > + > + from_nid = cpu_to_node(cpuid); > + ret = cpu_up(cpuid); > + /* > + * When hot adding memory to memoryless node and enabling a cpu > + * on the node, node number of the cpu may internally change. > + */ > + to_nid = cpu_to_node(cpuid); > + if (from_nid != to_nid) > + change_cpu_under_node(cpu, from_nid, to_nid); > > - return sprintf(buf, "%u\n", !!cpu_online(cpu->dev.id)); > + cpu_hotplug_driver_unlock(); > + return ret; > } > > -static ssize_t __ref store_online(struct device *dev, > - struct device_attribute *attr, > - const char *buf, size_t count) > +static int cpu_subsys_offline(struct device *dev) > { > - struct cpu *cpu = container_of(dev, struct cpu, dev); > - int cpuid = cpu->dev.id; > - int from_nid, to_nid; > - ssize_t ret; > + int ret; > > cpu_hotplug_driver_lock(); > - switch (buf[0]) { > - case '0': > - ret = cpu_down(cpuid); > - if (!ret) > - kobject_uevent(&dev->kobj, KOBJ_OFFLINE); > - break; > - case '1': > - from_nid = cpu_to_node(cpuid); > - ret = cpu_up(cpuid); > - > - /* > - * When hot adding memory to memoryless node and enabling a cpu > - * on the node, node number of the cpu may internally change. > - */ > - to_nid = cpu_to_node(cpuid); > - if (from_nid != to_nid) > - change_cpu_under_node(cpu, from_nid, to_nid); > - > - if (!ret) > - kobject_uevent(&dev->kobj, KOBJ_ONLINE); > - break; > - default: > - ret = -EINVAL; > - } > + ret = cpu_down(dev->id); > cpu_hotplug_driver_unlock(); > - > - if (ret >= 0) > - ret = count; > return ret; > } > -static DEVICE_ATTR(online, 0644, show_online, store_online); > > + static struct attribute *hotplug_cpu_attrs[] = { > + &dev_attr_online.attr, > + NULL > + }; > + > + static struct attribute_group hotplug_cpu_attr_group = { > + .attrs = hotplug_cpu_attrs, > + }; > + > void unregister_cpu(struct cpu *cpu) > { > int logical_cpu = cpu->dev.id; > @@@ -102,20 -125,8 +111,19 @@@ static ssize_t cpu_release_store(struc > static DEVICE_ATTR(probe, S_IWUSR, NULL, cpu_probe_store); > static DEVICE_ATTR(release, S_IWUSR, NULL, cpu_release_store); > #endif /* CONFIG_ARCH_CPU_PROBE_RELEASE */ > - > #endif /* CONFIG_HOTPLUG_CPU */ > > +struct bus_type cpu_subsys = { > + .name = "cpu", > + .dev_name = "cpu", > + .match = cpu_subsys_match, > +#ifdef CONFIG_HOTPLUG_CPU > + .online = cpu_subsys_online, > + .offline = cpu_subsys_offline, > +#endif > +}; > +EXPORT_SYMBOL_GPL(cpu_subsys); > + > #ifdef CONFIG_KEXEC > #include OK, after doing that I got this error: drivers/base/cpu.c:75:3: error: 'dev_attr_online' undeclared here (not in a function) &dev_attr_online.attr, ^ So I applied this merge fix patch: diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 811bb5a..ff97614 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c @@ -71,15 +71,6 @@ static int cpu_subsys_offline(struct device *dev) return ret; } -static struct attribute *hotplug_cpu_attrs[] = { - &dev_attr_online.attr, - NULL -}; - -static struct attribute_group hotplug_cpu_attr_group = { - .attrs = hotplug_cpu_attrs, -}; - void unregister_cpu(struct cpu *cpu) { int logical_cpu = cpu->dev.id; @@ -182,9 +173,6 @@ static const struct attribute_group *hotplugable_cpu_attr_groups[] = { #ifdef CONFIG_KEXEC &crash_note_cpu_attr_group, #endif -#ifdef CONFIG_HOTPLUG_CPU - &hotplug_cpu_attr_group, -#endif NULL }; Better ideas welcome :-) -- Cheers, Stephen Rothwell sfr@canb.auug.org.au