xen/arm: don't try to re-register vcpu_info on cpu_hotplug.
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>
Thu, 22 Oct 2015 16:22:46 +0000 (16:22 +0000)
committerDavid Vrabel <david.vrabel@citrix.com>
Fri, 23 Oct 2015 13:20:48 +0000 (14:20 +0100)
Call disable_percpu_irq on CPU_DYING and enable_percpu_irq when the cpu
is coming up.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Reviewed-by: Julien Grall <julien.grall@citrix.com>
arch/arm/xen/enlighten.c

index dad4ffb0934c836b324a51aa53f3c8c26ce72aa9..fc7ea529f462de75149c31168f01f17a42908e76 100644 (file)
@@ -86,6 +86,14 @@ static void xen_percpu_init(void)
        int err;
        int cpu = get_cpu();
 
+       /* 
+        * VCPUOP_register_vcpu_info cannot be called twice for the same
+        * vcpu, so if vcpu_info is already registered, just get out. This
+        * can happen with cpu-hotplug.
+        */
+       if (per_cpu(xen_vcpu, cpu) != NULL)
+               goto after_register_vcpu_info;
+
        pr_info("Xen: initializing cpu%d\n", cpu);
        vcpup = per_cpu_ptr(xen_vcpu_info, cpu);
 
@@ -96,6 +104,7 @@ static void xen_percpu_init(void)
        BUG_ON(err);
        per_cpu(xen_vcpu, cpu) = vcpup;
 
+after_register_vcpu_info:
        enable_percpu_irq(xen_events_irq, 0);
        put_cpu();
 }
@@ -124,6 +133,9 @@ static int xen_cpu_notification(struct notifier_block *self,
        case CPU_STARTING:
                xen_percpu_init();
                break;
+       case CPU_DYING:
+               disable_percpu_irq(xen_events_irq);
+               break;
        default:
                break;
        }