xen/time: Free onlined per-cpu data structure if we want to online it again.
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tue, 4 Jun 2013 21:13:29 +0000 (17:13 -0400)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Mon, 10 Jun 2013 12:43:37 +0000 (08:43 -0400)
If the per-cpu time data structure has been onlined already and
we are trying to online it again, then free the previous copy
before blindly over-writting it.

A developer naturally should not call this function multiple times
but just in case.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
arch/x86/xen/time.c

index 6a56ae0..aec0b14 100644 (file)
@@ -401,6 +401,20 @@ static irqreturn_t xen_timer_interrupt(int irq, void *dev_id)
        return ret;
 }
 
+void xen_teardown_timer(int cpu)
+{
+       struct clock_event_device *evt;
+       BUG_ON(cpu == 0);
+       evt = &per_cpu(xen_clock_events, cpu).evt;
+
+       if (evt->irq >= 0) {
+               unbind_from_irqhandler(evt->irq, NULL);
+               evt->irq = -1;
+               kfree(per_cpu(xen_clock_events, cpu).name);
+               per_cpu(xen_clock_events, cpu).name = NULL;
+       }
+}
+
 void xen_setup_timer(int cpu)
 {
        char *name;
@@ -409,6 +423,8 @@ void xen_setup_timer(int cpu)
 
        evt = &per_cpu(xen_clock_events, cpu).evt;
        WARN(evt->irq >= 0, "IRQ%d for CPU%d is already allocated\n", evt->irq, cpu);
+       if (evt->irq >= 0)
+               xen_teardown_timer(cpu);
 
        printk(KERN_INFO "installing Xen timer for CPU %d\n", cpu);
 
@@ -429,19 +445,6 @@ void xen_setup_timer(int cpu)
        per_cpu(xen_clock_events, cpu).name = name;
 }
 
-void xen_teardown_timer(int cpu)
-{
-       struct clock_event_device *evt;
-       BUG_ON(cpu == 0);
-       evt = &per_cpu(xen_clock_events, cpu).evt;
-
-       if (evt->irq >= 0) {
-               unbind_from_irqhandler(evt->irq, NULL);
-               evt->irq = -1;
-               kfree(per_cpu(xen_clock_events, cpu).name);
-               per_cpu(xen_clock_events, cpu).name = NULL;
-       }
-}
 
 void xen_setup_cpu_clockevents(void)
 {