xen_intr.c (255726) | xen_intr.c (256073) |
---|---|
1/****************************************************************************** 2 * xen_intr.c 3 * 4 * Xen event and interrupt services for x86 PV and HVM guests. 5 * 6 * Copyright (c) 2002-2005, K A Fraser 7 * Copyright (c) 2005, Intel Corporation <xiaofeng.ling@intel.com> 8 * Copyright (c) 2012, Spectra Logic Corporation --- 16 unchanged lines hidden (view full) --- 25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 29 * IN THE SOFTWARE. 30 */ 31 32#include <sys/cdefs.h> | 1/****************************************************************************** 2 * xen_intr.c 3 * 4 * Xen event and interrupt services for x86 PV and HVM guests. 5 * 6 * Copyright (c) 2002-2005, K A Fraser 7 * Copyright (c) 2005, Intel Corporation <xiaofeng.ling@intel.com> 8 * Copyright (c) 2012, Spectra Logic Corporation --- 16 unchanged lines hidden (view full) --- 25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 29 * IN THE SOFTWARE. 30 */ 31 32#include <sys/cdefs.h> |
33__FBSDID("$FreeBSD: head/sys/x86/xen/xen_intr.c 255726 2013-09-20 05:06:03Z gibbs $"); | 33__FBSDID("$FreeBSD: head/sys/x86/xen/xen_intr.c 256073 2013-10-05 23:11:01Z gibbs $"); |
34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/bus.h> 38#include <sys/malloc.h> 39#include <sys/kernel.h> 40#include <sys/limits.h> 41#include <sys/lock.h> --- 564 unchanged lines hidden (view full) --- 606{ 607} 608 609static void 610xen_rebind_ipi(struct xenisrc *isrc) 611{ 612#ifdef SMP 613 int cpu = isrc->xi_cpu; | 34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/bus.h> 38#include <sys/malloc.h> 39#include <sys/kernel.h> 40#include <sys/limits.h> 41#include <sys/lock.h> --- 564 unchanged lines hidden (view full) --- 606{ 607} 608 609static void 610xen_rebind_ipi(struct xenisrc *isrc) 611{ 612#ifdef SMP 613 int cpu = isrc->xi_cpu; |
614 int acpi_id = pcpu_find(cpu)->pc_acpi_id; | 614 int vcpu_id = pcpu_find(cpu)->pc_vcpu_id; |
615 int error; | 615 int error; |
616 struct evtchn_bind_ipi bind_ipi = { .vcpu = acpi_id }; | 616 struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id }; |
617 618 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, 619 &bind_ipi); 620 if (error != 0) 621 panic("unable to rebind xen IPI: %d", error); 622 623 isrc->xi_port = bind_ipi.port; 624 isrc->xi_cpu = 0; --- 10 unchanged lines hidden (view full) --- 635 panic("Resume IPI event channel on UP"); 636#endif 637} 638 639static void 640xen_rebind_virq(struct xenisrc *isrc) 641{ 642 int cpu = isrc->xi_cpu; | 617 618 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, 619 &bind_ipi); 620 if (error != 0) 621 panic("unable to rebind xen IPI: %d", error); 622 623 isrc->xi_port = bind_ipi.port; 624 isrc->xi_cpu = 0; --- 10 unchanged lines hidden (view full) --- 635 panic("Resume IPI event channel on UP"); 636#endif 637} 638 639static void 640xen_rebind_virq(struct xenisrc *isrc) 641{ 642 int cpu = isrc->xi_cpu; |
643 int acpi_id = pcpu_find(cpu)->pc_acpi_id; | 643 int vcpu_id = pcpu_find(cpu)->pc_vcpu_id; |
644 int error; 645 struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq, | 644 int error; 645 struct evtchn_bind_virq bind_virq = { .virq = isrc->xi_virq, |
646 .vcpu = acpi_id }; | 646 .vcpu = vcpu_id }; |
647 648 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, 649 &bind_virq); 650 if (error != 0) 651 panic("unable to rebind xen VIRQ#%d: %d", isrc->xi_virq, error); 652 653 isrc->xi_port = bind_virq.port; 654 isrc->xi_cpu = 0; --- 136 unchanged lines hidden (view full) --- 791 * \returns 0 if successful, otherwise an errno. 792 */ 793static int 794xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id) 795{ 796#ifdef SMP 797 struct evtchn_bind_vcpu bind_vcpu; 798 struct xenisrc *isrc; | 647 648 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, 649 &bind_virq); 650 if (error != 0) 651 panic("unable to rebind xen VIRQ#%d: %d", isrc->xi_virq, error); 652 653 isrc->xi_port = bind_virq.port; 654 isrc->xi_cpu = 0; --- 136 unchanged lines hidden (view full) --- 791 * \returns 0 if successful, otherwise an errno. 792 */ 793static int 794xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id) 795{ 796#ifdef SMP 797 struct evtchn_bind_vcpu bind_vcpu; 798 struct xenisrc *isrc; |
799 u_int to_cpu, acpi_id; | 799 u_int to_cpu, vcpu_id; |
800 int error; 801 802#ifdef XENHVM 803 if (xen_vector_callback_enabled == 0) 804 return (EOPNOTSUPP); 805#endif 806 807 to_cpu = apic_cpuid(apic_id); | 800 int error; 801 802#ifdef XENHVM 803 if (xen_vector_callback_enabled == 0) 804 return (EOPNOTSUPP); 805#endif 806 807 to_cpu = apic_cpuid(apic_id); |
808 acpi_id = pcpu_find(to_cpu)->pc_acpi_id; | 808 vcpu_id = pcpu_find(to_cpu)->pc_vcpu_id; |
809 xen_intr_intrcnt_add(to_cpu); 810 811 mtx_lock(&xen_intr_isrc_lock); 812 isrc = (struct xenisrc *)base_isrc; 813 if (!is_valid_evtchn(isrc->xi_port)) { 814 mtx_unlock(&xen_intr_isrc_lock); 815 return (EINVAL); 816 } --- 8 unchanged lines hidden (view full) --- 825 evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port); 826 isrc->xi_cpu = to_cpu; 827 evtchn_cpu_unmask_port(isrc->xi_cpu, isrc->xi_port); 828 mtx_unlock(&xen_intr_isrc_lock); 829 return (0); 830 } 831 832 bind_vcpu.port = isrc->xi_port; | 809 xen_intr_intrcnt_add(to_cpu); 810 811 mtx_lock(&xen_intr_isrc_lock); 812 isrc = (struct xenisrc *)base_isrc; 813 if (!is_valid_evtchn(isrc->xi_port)) { 814 mtx_unlock(&xen_intr_isrc_lock); 815 return (EINVAL); 816 } --- 8 unchanged lines hidden (view full) --- 825 evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port); 826 isrc->xi_cpu = to_cpu; 827 evtchn_cpu_unmask_port(isrc->xi_cpu, isrc->xi_port); 828 mtx_unlock(&xen_intr_isrc_lock); 829 return (0); 830 } 831 832 bind_vcpu.port = isrc->xi_port; |
833 bind_vcpu.vcpu = acpi_id; | 833 bind_vcpu.vcpu = vcpu_id; |
834 835 /* 836 * Allow interrupts to be fielded on the new VCPU before 837 * we ask the hypervisor to deliver them there. 838 */ 839 evtchn_cpu_unmask_port(to_cpu, isrc->xi_port); 840 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu); 841 if (isrc->xi_cpu != to_cpu) { --- 216 unchanged lines hidden (view full) --- 1058 return (0); 1059} 1060 1061int 1062xen_intr_bind_virq(device_t dev, u_int virq, u_int cpu, 1063 driver_filter_t filter, driver_intr_t handler, void *arg, 1064 enum intr_type flags, xen_intr_handle_t *port_handlep) 1065{ | 834 835 /* 836 * Allow interrupts to be fielded on the new VCPU before 837 * we ask the hypervisor to deliver them there. 838 */ 839 evtchn_cpu_unmask_port(to_cpu, isrc->xi_port); 840 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu); 841 if (isrc->xi_cpu != to_cpu) { --- 216 unchanged lines hidden (view full) --- 1058 return (0); 1059} 1060 1061int 1062xen_intr_bind_virq(device_t dev, u_int virq, u_int cpu, 1063 driver_filter_t filter, driver_intr_t handler, void *arg, 1064 enum intr_type flags, xen_intr_handle_t *port_handlep) 1065{ |
1066 int acpi_id = pcpu_find(cpu)->pc_acpi_id; | 1066 int vcpu_id = pcpu_find(cpu)->pc_vcpu_id; |
1067 struct xenisrc *isrc; | 1067 struct xenisrc *isrc; |
1068 struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = acpi_id }; | 1068 struct evtchn_bind_virq bind_virq = { .virq = virq, .vcpu = vcpu_id }; |
1069 int error; 1070 1071 /* Ensure the target CPU is ready to handle evtchn interrupts. */ 1072 xen_intr_intrcnt_add(cpu); 1073 1074 isrc = NULL; 1075 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, &bind_virq); 1076 if (error != 0) { --- 44 unchanged lines hidden (view full) --- 1121} 1122 1123int 1124xen_intr_alloc_and_bind_ipi(device_t dev, u_int cpu, 1125 driver_filter_t filter, enum intr_type flags, 1126 xen_intr_handle_t *port_handlep) 1127{ 1128#ifdef SMP | 1069 int error; 1070 1071 /* Ensure the target CPU is ready to handle evtchn interrupts. */ 1072 xen_intr_intrcnt_add(cpu); 1073 1074 isrc = NULL; 1075 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq, &bind_virq); 1076 if (error != 0) { --- 44 unchanged lines hidden (view full) --- 1121} 1122 1123int 1124xen_intr_alloc_and_bind_ipi(device_t dev, u_int cpu, 1125 driver_filter_t filter, enum intr_type flags, 1126 xen_intr_handle_t *port_handlep) 1127{ 1128#ifdef SMP |
1129 int acpi_id = pcpu_find(cpu)->pc_acpi_id; | 1129 int vcpu_id = pcpu_find(cpu)->pc_vcpu_id; |
1130 struct xenisrc *isrc; | 1130 struct xenisrc *isrc; |
1131 struct evtchn_bind_ipi bind_ipi = { .vcpu = acpi_id }; | 1131 struct evtchn_bind_ipi bind_ipi = { .vcpu = vcpu_id }; |
1132 int error; 1133 1134 /* Ensure the target CPU is ready to handle evtchn interrupts. */ 1135 xen_intr_intrcnt_add(cpu); 1136 1137 isrc = NULL; 1138 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, &bind_ipi); 1139 if (error != 0) { --- 102 unchanged lines hidden --- | 1132 int error; 1133 1134 /* Ensure the target CPU is ready to handle evtchn interrupts. */ 1135 xen_intr_intrcnt_add(cpu); 1136 1137 isrc = NULL; 1138 error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, &bind_ipi); 1139 if (error != 0) { --- 102 unchanged lines hidden --- |