x86/xen: split xen_smp_intr_init()/xen_smp_intr_free()
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 14 Mar 2017 17:35:42 +0000 (18:35 +0100)
committerJuergen Gross <jgross@suse.com>
Tue, 2 May 2017 09:04:18 +0000 (11:04 +0200)
xen_smp_intr_init() and xen_smp_intr_free() have PV-specific code and as
a praparatory change to splitting smp.c we need to split these fucntions.
Create xen_smp_intr_init_pv()/xen_smp_intr_free_pv().

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: Juergen Gross <jgross@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
arch/x86/xen/enlighten_pv.c
arch/x86/xen/smp.c
arch/x86/xen/smp.h

index 1cb7947df29666cd11fe64cc10fa2887591e1fa7..b226f67fb741473fef27f350d3fe2293b187dd06 100644 (file)
@@ -1477,12 +1477,21 @@ static int xen_cpu_up_prepare_pv(unsigned int cpu)
                     cpu, rc);
                return rc;
        }
+
+       rc = xen_smp_intr_init_pv(cpu);
+       if (rc) {
+               WARN(1, "xen_smp_intr_init_pv() for CPU %d failed: %d\n",
+                    cpu, rc);
+               return rc;
+       }
+
        return 0;
 }
 
 static int xen_cpu_dead_pv(unsigned int cpu)
 {
        xen_smp_intr_free(cpu);
+       xen_smp_intr_free_pv(cpu);
 
        xen_teardown_timer(cpu);
 
index eaa36162ed4a996e35250037b77add28d19c7867..18fbec1fca342743736cb2f5d4b3badcd5b9131d 100644 (file)
@@ -133,9 +133,10 @@ void xen_smp_intr_free(unsigned int cpu)
                kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
                per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
        }
-       if (xen_hvm_domain())
-               return;
+}
 
+void xen_smp_intr_free_pv(unsigned int cpu)
+{
        if (per_cpu(xen_irq_work, cpu).irq >= 0) {
                unbind_from_irqhandler(per_cpu(xen_irq_work, cpu).irq, NULL);
                per_cpu(xen_irq_work, cpu).irq = -1;
@@ -149,11 +150,12 @@ void xen_smp_intr_free(unsigned int cpu)
                kfree(per_cpu(xen_pmu_irq, cpu).name);
                per_cpu(xen_pmu_irq, cpu).name = NULL;
        }
-};
+}
+
 int xen_smp_intr_init(unsigned int cpu)
 {
        int rc;
-       char *resched_name, *callfunc_name, *debug_name, *pmu_name;
+       char *resched_name, *callfunc_name, *debug_name;
 
        resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu);
        rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
@@ -200,12 +202,17 @@ int xen_smp_intr_init(unsigned int cpu)
        per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
        per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
 
-       /*
-        * The IRQ worker on PVHVM goes through the native path and uses the
-        * IPI mechanism.
-        */
-       if (xen_hvm_domain())
-               return 0;
+       return 0;
+
+ fail:
+       xen_smp_intr_free(cpu);
+       return rc;
+}
+
+int xen_smp_intr_init_pv(unsigned int cpu)
+{
+       int rc;
+       char *callfunc_name, *pmu_name;
 
        callfunc_name = kasprintf(GFP_KERNEL, "irqwork%d", cpu);
        rc = bind_ipi_to_irqhandler(XEN_IRQ_WORK_VECTOR,
@@ -234,7 +241,7 @@ int xen_smp_intr_init(unsigned int cpu)
        return 0;
 
  fail:
-       xen_smp_intr_free(cpu);
+       xen_smp_intr_free_pv(cpu);
        return rc;
 }
 
index 9beef333584abee258d704af97c8af8dd226d33a..33320cea5a016102e34946827b30d4712fb67a90 100644 (file)
@@ -11,6 +11,8 @@ extern void xen_send_IPI_self(int vector);
 
 extern int xen_smp_intr_init(unsigned int cpu);
 extern void xen_smp_intr_free(unsigned int cpu);
+int xen_smp_intr_init_pv(unsigned int cpu);
+void xen_smp_intr_free_pv(unsigned int cpu);
 
 #else /* CONFIG_SMP */
 
@@ -19,6 +21,12 @@ static inline int xen_smp_intr_init(unsigned int cpu)
        return 0;
 }
 static inline void xen_smp_intr_free(unsigned int cpu) {}
+
+static inline int xen_smp_intr_init_pv(unsigned int cpu)
+{
+       return 0;
+}
+static inline void xen_smp_intr_free_pv(unsigned int cpu) {}
 #endif /* CONFIG_SMP */
 
 #endif