Hi all,

On Wed, 22 May 2013 13:47:41 +1000 Stephen Rothwell <s...@canb.auug.org.au> 
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 <linux/kexec.h>

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                    s...@canb.auug.org.au

Attachment: pgp7Hfq_1r3Q5.pgp
Description: PGP signature

Reply via email to