From: Feng Wu <feng.wu@intel.com> To: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org, gleb@kernel.org, pbonzini@redhat.com, dwmw2@infradead.org, joro@8bytes.org, alex.williamson@redhat.com, jiang.liu@linux.intel.com Cc: linux-kernel@vger.kernel.org, iommu@lists.linux-foundation.org, kvm@vger.kernel.org, Feng Wu <feng.wu@intel.com> Subject: [v2 19/25] KVM: x86: kvm-vfio: VT-d posted-interrupts setup Date: Wed, 3 Dec 2014 15:39:48 +0800 [thread overview] Message-ID: <1417592394-24343-20-git-send-email-feng.wu@intel.com> (raw) In-Reply-To: <1417592394-24343-1-git-send-email-feng.wu@intel.com> This patch defines macro __KVM_HAVE_ARCH_KVM_VFIO_POSTING and implement kvm_arch_vfio_update_pi_irte for x86 architecture. Signed-off-by: Feng Wu <feng.wu@intel.com> --- arch/x86/include/asm/kvm_host.h | 2 + arch/x86/kvm/Makefile | 2 +- arch/x86/kvm/kvm_vfio_x86.c | 68 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletions(-) create mode 100644 arch/x86/kvm/kvm_vfio_x86.c diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 9b45b78..6878429 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -82,6 +82,8 @@ static inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level) (base_gfn >> KVM_HPAGE_GFN_SHIFT(level)); } +#define __KVM_HAVE_ARCH_KVM_VFIO_POSTING + #define SELECTOR_TI_MASK (1 << 2) #define SELECTOR_RPL_MASK 0x03 diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index 25d22b2..8809d58 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -14,7 +14,7 @@ kvm-$(CONFIG_KVM_DEVICE_ASSIGNMENT) += $(KVM)/assigned-dev.o $(KVM)/iommu.o kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o kvm-y += x86.o mmu.o emulate.o i8259.o irq.o lapic.o \ - i8254.o cpuid.o pmu.o + i8254.o cpuid.o pmu.o kvm_vfio_x86.o kvm-intel-y += vmx.o kvm-amd-y += svm.o diff --git a/arch/x86/kvm/kvm_vfio_x86.c b/arch/x86/kvm/kvm_vfio_x86.c new file mode 100644 index 0000000..c59a31a --- /dev/null +++ b/arch/x86/kvm/kvm_vfio_x86.c @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2014 Intel Corporation. + * Authors: Feng Wu <feng.wu@intel.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/kvm_host.h> +#include <asm/irq_remapping.h> + +/* + * kvm_arch_vfio_update_pi_irte - set IRTE for Posted-Interrupts + * + * @kvm: kvm + * @host_irq: host irq of the interrupt + * @guest_irq: gsi of the interrupt + * returns 0 on success, < 0 on failure + */ +int kvm_arch_vfio_update_pi_irte(struct kvm *kvm, unsigned int host_irq, + uint32_t guest_irq) +{ + struct kvm_kernel_irq_routing_entry *e; + struct kvm_irq_routing_table *irq_rt; + struct kvm_lapic_irq irq; + struct kvm_vcpu *vcpu; + struct vcpu_data vcpu_info; + int idx, ret = -EINVAL; + + idx = srcu_read_lock(&kvm->irq_srcu); + irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); + BUG_ON(guest_irq >= irq_rt->nr_rt_entries); + + hlist_for_each_entry(e, &irq_rt->map[guest_irq], link) { + if (e->type != KVM_IRQ_ROUTING_MSI) + continue; + /* + * VT-d PI cannot support posting multicast/broadcast + * interrupts to a VCPU, we still use interrupt remapping + * for these kind of interrupts. + */ + + kvm_set_msi_irq(e, &irq); + if (!kvm_find_dest_vcpu(kvm, &irq, &vcpu)) + continue; + + vcpu_info.pi_desc_addr = kvm_x86_ops->get_pi_desc_addr(vcpu); + vcpu_info.vector = irq.vector; + + if (irq_set_vcpu_affinity(host_irq, &vcpu_info) < 0) { + printk(KERN_INFO "%s: failed to update PI IRTE\n", + __func__); + ret = -EINVAL; + goto out; + } + } + + ret = 0; +out: + srcu_read_unlock(&kvm->irq_srcu, idx); + return ret; +} -- 1.7.1
WARNING: multiple messages have this Message-ID (diff)
From: Feng Wu <feng.wu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> To: tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org, mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org, x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, gleb-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, pbonzini-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org, joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org, alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, jiang.liu-VuQAYsv1563Yd54FQh9/CA@public.gmane.org Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, kvm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Subject: [v2 19/25] KVM: x86: kvm-vfio: VT-d posted-interrupts setup Date: Wed, 3 Dec 2014 15:39:48 +0800 [thread overview] Message-ID: <1417592394-24343-20-git-send-email-feng.wu@intel.com> (raw) In-Reply-To: <1417592394-24343-1-git-send-email-feng.wu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> This patch defines macro __KVM_HAVE_ARCH_KVM_VFIO_POSTING and implement kvm_arch_vfio_update_pi_irte for x86 architecture. Signed-off-by: Feng Wu <feng.wu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> --- arch/x86/include/asm/kvm_host.h | 2 + arch/x86/kvm/Makefile | 2 +- arch/x86/kvm/kvm_vfio_x86.c | 68 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletions(-) create mode 100644 arch/x86/kvm/kvm_vfio_x86.c diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 9b45b78..6878429 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -82,6 +82,8 @@ static inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level) (base_gfn >> KVM_HPAGE_GFN_SHIFT(level)); } +#define __KVM_HAVE_ARCH_KVM_VFIO_POSTING + #define SELECTOR_TI_MASK (1 << 2) #define SELECTOR_RPL_MASK 0x03 diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile index 25d22b2..8809d58 100644 --- a/arch/x86/kvm/Makefile +++ b/arch/x86/kvm/Makefile @@ -14,7 +14,7 @@ kvm-$(CONFIG_KVM_DEVICE_ASSIGNMENT) += $(KVM)/assigned-dev.o $(KVM)/iommu.o kvm-$(CONFIG_KVM_ASYNC_PF) += $(KVM)/async_pf.o kvm-y += x86.o mmu.o emulate.o i8259.o irq.o lapic.o \ - i8254.o cpuid.o pmu.o + i8254.o cpuid.o pmu.o kvm_vfio_x86.o kvm-intel-y += vmx.o kvm-amd-y += svm.o diff --git a/arch/x86/kvm/kvm_vfio_x86.c b/arch/x86/kvm/kvm_vfio_x86.c new file mode 100644 index 0000000..c59a31a --- /dev/null +++ b/arch/x86/kvm/kvm_vfio_x86.c @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2014 Intel Corporation. + * Authors: Feng Wu <feng.wu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License, version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/kvm_host.h> +#include <asm/irq_remapping.h> + +/* + * kvm_arch_vfio_update_pi_irte - set IRTE for Posted-Interrupts + * + * @kvm: kvm + * @host_irq: host irq of the interrupt + * @guest_irq: gsi of the interrupt + * returns 0 on success, < 0 on failure + */ +int kvm_arch_vfio_update_pi_irte(struct kvm *kvm, unsigned int host_irq, + uint32_t guest_irq) +{ + struct kvm_kernel_irq_routing_entry *e; + struct kvm_irq_routing_table *irq_rt; + struct kvm_lapic_irq irq; + struct kvm_vcpu *vcpu; + struct vcpu_data vcpu_info; + int idx, ret = -EINVAL; + + idx = srcu_read_lock(&kvm->irq_srcu); + irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu); + BUG_ON(guest_irq >= irq_rt->nr_rt_entries); + + hlist_for_each_entry(e, &irq_rt->map[guest_irq], link) { + if (e->type != KVM_IRQ_ROUTING_MSI) + continue; + /* + * VT-d PI cannot support posting multicast/broadcast + * interrupts to a VCPU, we still use interrupt remapping + * for these kind of interrupts. + */ + + kvm_set_msi_irq(e, &irq); + if (!kvm_find_dest_vcpu(kvm, &irq, &vcpu)) + continue; + + vcpu_info.pi_desc_addr = kvm_x86_ops->get_pi_desc_addr(vcpu); + vcpu_info.vector = irq.vector; + + if (irq_set_vcpu_affinity(host_irq, &vcpu_info) < 0) { + printk(KERN_INFO "%s: failed to update PI IRTE\n", + __func__); + ret = -EINVAL; + goto out; + } + } + + ret = 0; +out: + srcu_read_unlock(&kvm->irq_srcu, idx); + return ret; +} -- 1.7.1
next prev parent reply other threads:[~2014-12-03 7:52 UTC|newest] Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-12-03 7:39 [v2 00/25] Add VT-d Posted-Interrupts support Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 01/25] genirq: Introduce irq_set_vcpu_affinity() to target an interrupt to a VCPU Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 02/25] iommu: Add new member capability to struct irq_remap_ops Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 03/25] iommu, x86: Define new irte structure for VT-d Posted-Interrupts Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 04/25] iommu, x86: Implement irq_set_vcpu_affinity for intel_ir_chip Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 05/25] x86, irq: Implement irq_set_vcpu_affinity for pci_msi_ir_controller Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 06/25] iommu, x86: No need to migrating irq for VT-d Posted-Interrupts Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 07/25] iommu, x86: Add cap_pi_support() to detect VT-d PI capability Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 08/25] iommu, x86: Add intel_irq_remapping_capability() for Intel Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 09/25] iommu, x86: define irq_remapping_cap() Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 10/25] KVM: change struct pi_desc for VT-d Posted-Interrupts Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 11/25] KVM: Add some helper functions for Posted-Interrupts Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 12/25] KVM: Initialize VT-d Posted-Interrupts Descriptor Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 13/25] KVM: Define a new interface kvm_find_dest_vcpu() for VT-d PI Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 14/25] KVM: Get Posted-Interrupts descriptor address from struct kvm_vcpu Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 15/25] KVM: Make struct kvm_irq_routing_table accessible Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 16/25] KVM: make kvm_set_msi_irq() public Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 17/25] KVM: kvm-vfio: User API for VT-d Posted-Interrupts Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-04 14:04 ` Eric Auger 2014-12-04 14:04 ` Eric Auger 2014-12-08 4:58 ` Wu, Feng 2014-12-08 4:58 ` Wu, Feng 2014-12-08 5:21 ` Alex Williamson 2014-12-08 5:21 ` Alex Williamson 2014-12-09 11:38 ` Wu, Feng 2014-12-09 11:38 ` Wu, Feng 2014-12-11 5:55 ` Wu, Feng 2014-12-11 5:55 ` Wu, Feng 2014-12-11 15:45 ` Alex Williamson 2014-12-11 15:45 ` Alex Williamson 2014-12-03 7:39 ` [v2 18/25] KVM: kvm-vfio: implement the VFIO skeleton " Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-04 15:35 ` Eric Auger 2014-12-04 15:35 ` Eric Auger 2014-12-08 4:58 ` Wu, Feng 2014-12-08 4:58 ` Wu, Feng 2014-12-08 5:12 ` Alex Williamson 2014-12-08 5:12 ` Alex Williamson 2014-12-08 10:15 ` Eric Auger 2014-12-08 10:15 ` Eric Auger 2014-12-09 11:51 ` Wu, Feng 2014-12-09 11:51 ` Wu, Feng 2014-12-03 7:39 ` Feng Wu [this message] 2014-12-03 7:39 ` [v2 19/25] KVM: x86: kvm-vfio: VT-d posted-interrupts setup Feng Wu 2014-12-03 7:39 ` [v2 20/25] x86, irq: Define a global vector for VT-d Posted-Interrupts Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 21/25] KVM: Update Posted-Interrupts descriptor during vCPU scheduling Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 22/25] KVM: Change NDST field after " Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 23/25] KVM: Add the handler for Wake-up Vector Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 24/25] KVM: Suppress posted-interrupt when 'SN' is set Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-03 7:39 ` [v2 25/25] iommu/vt-d: Add a command line parameter for VT-d posted-interrupts Feng Wu 2014-12-03 7:39 ` Feng Wu 2014-12-08 13:36 ` [v2 00/25] Add VT-d Posted-Interrupts support Wu, Feng 2014-12-08 13:36 ` Wu, Feng
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1417592394-24343-20-git-send-email-feng.wu@intel.com \ --to=feng.wu@intel.com \ --cc=alex.williamson@redhat.com \ --cc=dwmw2@infradead.org \ --cc=gleb@kernel.org \ --cc=hpa@zytor.com \ --cc=iommu@lists.linux-foundation.org \ --cc=jiang.liu@linux.intel.com \ --cc=joro@8bytes.org \ --cc=kvm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mingo@redhat.com \ --cc=pbonzini@redhat.com \ --cc=tglx@linutronix.de \ --cc=x86@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.