From f22347346e5eff6dd614d4c151b66fa04744dff6 Mon Sep 17 00:00:00 2001 From: Sainath Grandhi Date: Tue, 2 Apr 2019 22:53:58 -0700 Subject: [PATCH] hv: Remove separate interrupt routine for pre-launched VMs As vector re-mapping is enabled for pre-launched/partition mode VMs, there is no more need for separate interrupt routine i.e. partition_mode_dispatch_interrupt. Tracked-On: #2879 Signed-off-by: Sainath Grandhi Reviewed-by: Eddie Dong --- hypervisor/arch/x86/guest/assign.c | 8 ++++---- hypervisor/arch/x86/guest/virq.c | 4 ---- hypervisor/arch/x86/irq.c | 22 ---------------------- hypervisor/dm/vpci/vmsi.c | 2 +- hypervisor/dm/vpci/vmsix.c | 2 +- hypervisor/include/arch/x86/guest/assign.h | 4 +++- hypervisor/include/arch/x86/irq.h | 3 --- 7 files changed, 9 insertions(+), 36 deletions(-) diff --git a/hypervisor/arch/x86/guest/assign.c b/hypervisor/arch/x86/guest/assign.c index 971990568..11a7bdb1e 100644 --- a/hypervisor/arch/x86/guest/assign.c +++ b/hypervisor/arch/x86/guest/assign.c @@ -579,8 +579,8 @@ void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src) * entry_nr = 0 means first vector * user must provide bdf and entry_nr */ -int32_t ptirq_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, - uint16_t entry_nr, struct ptirq_msi_info *info) +int32_t ptirq_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t phys_bdf, + uint16_t entry_nr, struct ptirq_msi_info *info) { struct ptirq_remapping_info *entry; DEFINE_MSI_SID(virt_sid, virt_bdf, entry_nr); @@ -597,8 +597,8 @@ int32_t ptirq_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, entry = ptirq_lookup_entry_by_sid(PTDEV_INTR_MSI, &virt_sid, vm); if (entry == NULL) { /* SOS_VM we add mapping dynamically */ - if (is_sos_vm(vm)) { - entry = add_msix_remapping(vm, virt_bdf, virt_bdf, entry_nr); + if (is_sos_vm(vm) || is_prelaunched_vm(vm)) { + entry = add_msix_remapping(vm, virt_bdf, phys_bdf, entry_nr); if (entry == NULL) { pr_err("dev-assign: msi entry exist in others"); } diff --git a/hypervisor/arch/x86/guest/virq.c b/hypervisor/arch/x86/guest/virq.c index ef5a3291f..ab5c2f9cf 100644 --- a/hypervisor/arch/x86/guest/virq.c +++ b/hypervisor/arch/x86/guest/virq.c @@ -414,11 +414,7 @@ int32_t external_interrupt_vmexit_handler(struct acrn_vcpu *vcpu) ctx.rflags = vcpu_get_rflags(vcpu); ctx.cs = exec_vmread32(VMX_GUEST_CS_SEL); -#ifdef CONFIG_PARTITION_MODE - partition_mode_dispatch_interrupt(&ctx); -#else dispatch_interrupt(&ctx); -#endif vcpu_retain_rip(vcpu); TRACE_2L(TRACE_VMEXIT_EXTERNAL_INTERRUPT, ctx.vector, 0UL); diff --git a/hypervisor/arch/x86/irq.c b/hypervisor/arch/x86/irq.c index 5c97a0e52..524e258ed 100644 --- a/hypervisor/arch/x86/irq.c +++ b/hypervisor/arch/x86/irq.c @@ -380,28 +380,6 @@ void dispatch_exception(struct intr_excp_ctx *ctx) cpu_dead(); } -#ifdef CONFIG_PARTITION_MODE -void partition_mode_dispatch_interrupt(struct intr_excp_ctx *ctx) -{ - uint8_t vr = ctx->vector; - struct acrn_vcpu *vcpu; - - /* - * There is no vector and APIC ID remapping for VMs in - * ACRN partition mode. Device interrupts are injected with the same - * vector into vLAPIC of vCPU running on the pCPU. Vectors used for - * HV services are handled by HV using dispatch_interrupt. - */ - vcpu = per_cpu(vcpu, get_cpu_id()); - if (vr < VECTOR_FIXED_START) { - send_lapic_eoi(); - vlapic_set_intr(vcpu, vr, LAPIC_TRIG_EDGE); - } else { - dispatch_interrupt(ctx); - } -} -#endif - static void init_irq_descs(void) { uint32_t i; diff --git a/hypervisor/dm/vpci/vmsi.c b/hypervisor/dm/vpci/vmsi.c index 2d18867f4..488c77529 100644 --- a/hypervisor/dm/vpci/vmsi.c +++ b/hypervisor/dm/vpci/vmsi.c @@ -93,7 +93,7 @@ static int32_t vmsi_remap(const struct pci_vdev *vdev, bool enable) info.vmsi_data.full = 0U; } - ret = ptirq_msix_remap(vm, vdev->vbdf.value, 0U, &info); + ret = ptirq_msix_remap(vm, vdev->vbdf.value, pbdf.value, 0U, &info); if (ret == 0) { /* Update MSI Capability structure to physical device */ pci_pdev_write_cfg(pbdf, capoff + PCIR_MSI_ADDR, 0x4U, (uint32_t)info.pmsi_addr.full); diff --git a/hypervisor/dm/vpci/vmsix.c b/hypervisor/dm/vpci/vmsix.c index a67c26df7..35411e608 100644 --- a/hypervisor/dm/vpci/vmsix.c +++ b/hypervisor/dm/vpci/vmsix.c @@ -69,7 +69,7 @@ static int32_t vmsix_remap_entry(const struct pci_vdev *vdev, uint32_t index, bo info.vmsi_addr.full = vdev->msix.tables[index].addr; info.vmsi_data.full = (enable) ? vdev->msix.tables[index].data : 0U; - ret = ptirq_msix_remap(vdev->vpci->vm, vdev->vbdf.value, (uint16_t)index, &info); + ret = ptirq_msix_remap(vdev->vpci->vm, vdev->vbdf.value, vdev->pdev->bdf.value, (uint16_t)index, &info); if (ret == 0) { /* Write the table entry to the physical structure */ hva = hpa2hva(vdev->msix.mmio_hpa + vdev->msix.table_offset); diff --git a/hypervisor/include/arch/x86/guest/assign.h b/hypervisor/include/arch/x86/guest/assign.h index 52a84af1d..9af58663d 100644 --- a/hypervisor/include/arch/x86/guest/assign.h +++ b/hypervisor/include/arch/x86/guest/assign.h @@ -47,6 +47,7 @@ void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src); * * @param[in] vm pointer to acrn_vm * @param[in] virt_bdf virtual bdf associated with the passthrough device + * @param[in] phys_bdf virtual bdf associated with the passthrough device * @param[in] entry_nr indicate coming vectors, entry_nr = 0 means first vector * @param[in] info structure used for MSI/MSI-x remapping * @@ -60,7 +61,8 @@ void ptirq_intx_ack(struct acrn_vm *vm, uint32_t virt_pin, uint32_t vpin_src); * @pre info != NULL * */ -int32_t ptirq_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t entry_nr, struct ptirq_msi_info *info); +int32_t ptirq_msix_remap(struct acrn_vm *vm, uint16_t virt_bdf, uint16_t phys_bdf, + uint16_t entry_nr, struct ptirq_msi_info *info); /** diff --git a/hypervisor/include/arch/x86/irq.h b/hypervisor/include/arch/x86/irq.h index d7d6b401a..58214761a 100644 --- a/hypervisor/include/arch/x86/irq.h +++ b/hypervisor/include/arch/x86/irq.h @@ -91,9 +91,6 @@ void init_default_irqs(uint16_t cpu_id); void dispatch_exception(struct intr_excp_ctx *ctx); void dispatch_interrupt(const struct intr_excp_ctx *ctx); -#ifdef CONFIG_PARTITION_MODE -void partition_mode_dispatch_interrupt(struct intr_excp_ctx *ctx); -#endif void setup_notification(void); void setup_posted_intr_notification(void);