]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
xen/intr: Introduce xen_pic_assign_cpu
authorJulien Grall <julien.grall@linaro.org>
Sat, 19 Apr 2014 21:32:01 +0000 (22:32 +0100)
committerJulien Grall <julien.grall@citrix.com>
Mon, 5 Oct 2015 17:55:08 +0000 (18:55 +0100)
sys/xen/xen_intr.c

index a728ddb22e625b605f267a688b46a4b34718116c..a44a4702ba7f0870512b542cb1c99c234cefba19 100644 (file)
@@ -143,7 +143,8 @@ static int  xen_intr_vector(struct intsrc *isrc);
 static int     xen_intr_source_pending(struct intsrc *isrc);
 static int     xen_intr_config_intr(struct intsrc *isrc,
                     enum intr_trigger trig, enum intr_polarity pol);
-static int     xen_intr_assign_cpu(struct intsrc *isrc, u_int apic_id);
+static int     xen_intr_assign_cpu(struct intsrc *isrc, u_int to_cpu);
+static int     xen_pic_assign_cpu(struct intsrc *isrc, u_int apic_id);
 
 static void    xen_intr_pirq_enable_source(struct intsrc *isrc);
 static void    xen_intr_pirq_disable_source(struct intsrc *isrc, int eoi);
@@ -167,7 +168,7 @@ struct pic xen_intr_pic = {
        .pic_suspend        = xen_intr_suspend,
        .pic_resume         = xen_intr_resume,
        .pic_config_intr    = xen_intr_config_intr,
-       .pic_assign_cpu     = xen_intr_assign_cpu
+       .pic_assign_cpu     = xen_pic_assign_cpu
 };
 
 /**
@@ -183,7 +184,7 @@ struct pic xen_intr_pirq_pic = {
        .pic_vector         = xen_intr_vector,
        .pic_source_pending = xen_intr_source_pending,
        .pic_config_intr    = xen_intr_pirq_config_intr,
-       .pic_assign_cpu     = xen_intr_assign_cpu
+       .pic_assign_cpu     = xen_pic_assign_cpu
 };
 
 static struct mtx       xen_intr_isrc_lock;
@@ -675,7 +676,7 @@ xen_rebind_ipi(struct xenisrc *isrc)
 {
 #ifdef SMP
        int cpu = isrc->xi_cpu;
-       int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+       int vcpu_id = cpu_to_vcpu_id(cpu);
        int error;
        struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
 
@@ -688,8 +689,7 @@ xen_rebind_ipi(struct xenisrc *isrc)
        isrc->xi_cpu = 0;
        xen_intr_port_to_isrc[bind_ipi.port] = isrc;
 
-       error = xen_intr_assign_cpu(&isrc->xi_intsrc,
-                                   cpu_apic_ids[cpu]);
+       error = xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
        if (error)
                panic("unable to bind xen IPI to CPU#%d: %d",
                      cpu, error);
@@ -704,7 +704,7 @@ static void
 xen_rebind_virq(struct xenisrc *isrc)
 {
        int cpu = isrc->xi_cpu;
-       int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+       int vcpu_id = cpu_to_vcpu_id(cpu);
        int error;
        struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq,
                                              .vcpu = vcpu_id };
@@ -719,8 +719,7 @@ xen_rebind_virq(struct xenisrc *isrc)
        xen_intr_port_to_isrc[bind_virq.port] = isrc;
 
 #ifdef SMP
-       error = xen_intr_assign_cpu(&isrc->xi_intsrc,
-                                   cpu_apic_ids[cpu]);
+       error = xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
        if (error)
                panic("unable to bind xen VIRQ#%d to CPU#%d: %d",
                      isrc->xi_virq, cpu, error);
@@ -850,24 +849,22 @@ xen_intr_config_intr(struct intsrc *isrc, enum intr_trigger trig,
  * Configure CPU affinity for interrupt source event delivery.
  *
  * \param isrc     The interrupt source to configure.
- * \param apic_id  The apic id of the CPU for handling future events.
+ * \param to_cpu   The id of the CPU for handling future events.
  *
  * \returns  0 if successful, otherwise an errno.
  */
 static int
-xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
+xen_intr_assign_cpu(struct intsrc *base_isrc, u_int to_cpu)
 {
 #ifdef SMP
        struct evtchn_bind_vcpu bind_vcpu;
        struct xenisrc *isrc;
-       u_int to_cpu, vcpu_id;
-       int error, masked;
+       u_int vcpu_id = cpu_to_vcpu_id(to_cpu);
+       int error;
 
        if (xen_vector_callback_enabled == 0)
                return (EOPNOTSUPP);
 
-       to_cpu = apic_cpuid(apic_id);
-       vcpu_id = pcpu_find(to_cpu)->pc_vcpu_id;
        xen_intr_intrcnt_add(to_cpu);
 
        mtx_lock(&xen_intr_isrc_lock);
@@ -918,6 +915,13 @@ out:
 #endif
 }
 
+/* Wrapper of xen_intr_assign_cpu to use as pic callbacks */
+static int
+xen_pic_assign_cpu(struct intsrc *isrc, u_int apic_id)
+{
+       return xen_intr_assign_cpu(isrc, apic_cpuid(apic_id));
+}
+
 /*------------------- Virtual Interrupt Source PIC Functions -----------------*/
 /*
  * Mask a level triggered interrupt source.
@@ -1263,7 +1267,7 @@ xen_intr_bind_virq(device_t dev, u_int virq, u_int cpu,
     driver_filter_t filter, driver_intr_t handler, void *arg,
     enum intr_type flags, xen_intr_handle_t *port_handlep)
 {
-       int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+       int vcpu_id = cpu_to_vcpu_id(cpu);
        struct xenisrc *isrc;
        struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = vcpu_id };
        int error;
@@ -1306,7 +1310,7 @@ xen_intr_bind_virq(device_t dev, u_int virq, u_int cpu,
                 * masks manually so events can't fire on the wrong cpu
                 * during AP startup.
                 */
-               xen_intr_assign_cpu(&isrc->xi_intsrc, cpu_apic_ids[cpu]);
+               xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
        }
 #endif
 
@@ -1326,7 +1330,7 @@ xen_intr_alloc_and_bind_ipi(device_t dev, u_int cpu,
     xen_intr_handle_t *port_handlep)
 {
 #ifdef SMP
-       int vcpu_id = pcpu_find(cpu)->pc_vcpu_id;
+       int vcpu_id = cpu_to_vcpu_id(cpu);
        struct xenisrc *isrc;
        struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id };
        int error;
@@ -1366,7 +1370,7 @@ xen_intr_alloc_and_bind_ipi(device_t dev, u_int cpu,
                 * masks manually so events can't fire on the wrong cpu
                 * during AP startup.
                 */
-               xen_intr_assign_cpu(&isrc->xi_intsrc, cpu_apic_ids[cpu]);
+               xen_intr_assign_cpu(&isrc->xi_intsrc, cpu);
        }
 
        /*