From: Julien Grall Date: Sat, 19 Apr 2014 21:32:01 +0000 (+0100) Subject: xen/intr: Introduce xen_pic_assign_cpu X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=b00a256e7fcecf0032e3852a6cdf2b1fc9958603;p=people%2Fjulieng%2Ffreebsd.git xen/intr: Introduce xen_pic_assign_cpu --- diff --git a/sys/xen/xen_intr.c b/sys/xen/xen_intr.c index a728ddb22e62..a44a4702ba7f 100644 --- a/sys/xen/xen_intr.c +++ b/sys/xen/xen_intr.c @@ -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); } /*