From: "Michael S. Tsirkin" <mst@redhat.com>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: mtosatti@redhat.com, gleb@redhat.com, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org, agraf@suse.de
Subject: Re: [PATCH] kvm: Allow build-time configuration of KVM device assignment
Date: Sun, 21 Apr 2013 13:53:12 +0300 [thread overview]
Message-ID: <20130421105312.GC12137@redhat.com> (raw)
In-Reply-To: <20130416194605.23183.31789.stgit@bling.home>
On Tue, Apr 16, 2013 at 01:49:18PM -0600, Alex Williamson wrote:
> We hope to at some point deprecate KVM legacy device assignment in
> favor of VFIO-based assignment. Towards that end, allow legacy
> device assignment to be deconfigured.
>
> Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
> ---
>
> This depends on Alex Graf's irqfd generalization series to remove
> IRQ routing code from assigned-dev.c.
>
> arch/ia64/include/uapi/asm/kvm.h | 1 -
> arch/ia64/kvm/Kconfig | 13 +++++++++++--
> arch/ia64/kvm/Makefile | 6 +++---
> arch/ia64/kvm/kvm-ia64.c | 2 --
> arch/x86/include/uapi/asm/kvm.h | 1 -
> arch/x86/kvm/Kconfig | 13 +++++++++++--
> arch/x86/kvm/Makefile | 5 +++--
> arch/x86/kvm/x86.c | 6 ++++--
> include/linux/kvm_host.h | 30 ++++++++----------------------
> include/uapi/linux/kvm.h | 4 ----
> 10 files changed, 40 insertions(+), 41 deletions(-)
>
> diff --git a/arch/ia64/include/uapi/asm/kvm.h b/arch/ia64/include/uapi/asm/kvm.h
> index ec6c6b3..99503c2 100644
> --- a/arch/ia64/include/uapi/asm/kvm.h
> +++ b/arch/ia64/include/uapi/asm/kvm.h
> @@ -27,7 +27,6 @@
> /* Select x86 specific features in <linux/kvm.h> */
> #define __KVM_HAVE_IOAPIC
> #define __KVM_HAVE_IRQ_LINE
> -#define __KVM_HAVE_DEVICE_ASSIGNMENT
>
> /* Architectural interrupt line count. */
> #define KVM_NR_INTERRUPTS 256
> diff --git a/arch/ia64/kvm/Kconfig b/arch/ia64/kvm/Kconfig
> index 2cd225f..e792664 100644
> --- a/arch/ia64/kvm/Kconfig
> +++ b/arch/ia64/kvm/Kconfig
> @@ -21,8 +21,6 @@ config KVM
> tristate "Kernel-based Virtual Machine (KVM) support"
> depends on BROKEN
> depends on HAVE_KVM && MODULES
> - # for device assignment:
> - depends on PCI
> depends on BROKEN
> select PREEMPT_NOTIFIERS
> select ANON_INODES
> @@ -50,6 +48,17 @@ config KVM_INTEL
> Provides support for KVM on Itanium 2 processors equipped with the VT
> extensions.
>
> +config KVM_DEVICE_ASSIGNMENT
> + bool "KVM legacy PCI device assignment support"
> + depends on KVM && PCI && IOMMU_API
> + default y
> + ---help---
> + Provide support for legacy PCI device assignment through KVM. The
> + kernel now also supports a full featured userspace device driver
> + framework through VFIO, which supersedes much of this support.
> +
> + If unsure, say Y.
> +
> source drivers/vhost/Kconfig
>
> endif # VIRTUALIZATION
> diff --git a/arch/ia64/kvm/Makefile b/arch/ia64/kvm/Makefile
> index db3d7c5..1a40537 100644
> --- a/arch/ia64/kvm/Makefile
> +++ b/arch/ia64/kvm/Makefile
> @@ -49,10 +49,10 @@ ccflags-y := -Ivirt/kvm -Iarch/ia64/kvm/
> asflags-y := -Ivirt/kvm -Iarch/ia64/kvm/
>
> common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
> - coalesced_mmio.o irq_comm.o assigned-dev.o)
> + coalesced_mmio.o irq_comm.o)
>
> -ifeq ($(CONFIG_IOMMU_API),y)
> -common-objs += $(addprefix ../../../virt/kvm/, iommu.o)
> +ifeq ($(CONFIG_KVM_DEVICE_ASSIGNMENT),y)
> +common-objs += $(addprefix ../../../virt/kvm/, assigned-dev.o iommu.o)
> endif
>
> kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
> diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
> index 7a54455..a21c2c5 100644
> --- a/arch/ia64/kvm/kvm-ia64.c
> +++ b/arch/ia64/kvm/kvm-ia64.c
> @@ -1366,9 +1366,7 @@ void kvm_arch_sync_events(struct kvm *kvm)
> void kvm_arch_destroy_vm(struct kvm *kvm)
> {
> kvm_iommu_unmap_guest(kvm);
> -#ifdef KVM_CAP_DEVICE_ASSIGNMENT
> kvm_free_all_assigned_devices(kvm);
> -#endif
> kfree(kvm->arch.vioapic);
> kvm_release_vm_pages(kvm);
> }
> diff --git a/arch/x86/include/uapi/asm/kvm.h b/arch/x86/include/uapi/asm/kvm.h
> index 923478e..63e6622 100644
> --- a/arch/x86/include/uapi/asm/kvm.h
> +++ b/arch/x86/include/uapi/asm/kvm.h
> @@ -30,7 +30,6 @@
> #define __KVM_HAVE_IOAPIC
> #define __KVM_HAVE_IRQCHIP
> #define __KVM_HAVE_IRQ_LINE
> -#define __KVM_HAVE_DEVICE_ASSIGNMENT
> #define __KVM_HAVE_MSI
> #define __KVM_HAVE_USER_NMI
> #define __KVM_HAVE_GUEST_DEBUG
> diff --git a/arch/x86/kvm/Kconfig b/arch/x86/kvm/Kconfig
> index 586f000..46e0832 100644
> --- a/arch/x86/kvm/Kconfig
> +++ b/arch/x86/kvm/Kconfig
> @@ -21,8 +21,6 @@ config KVM
> tristate "Kernel-based Virtual Machine (KVM) support"
> depends on HAVE_KVM
> depends on HIGH_RES_TIMERS
> - # for device assignment:
> - depends on PCI
> # for TASKSTATS/TASK_DELAY_ACCT:
> depends on NET
> select PREEMPT_NOTIFIERS
> @@ -82,6 +80,17 @@ config KVM_MMU_AUDIT
> This option adds a R/W kVM module parameter 'mmu_audit', which allows
> audit KVM MMU at runtime.
>
> +config KVM_DEVICE_ASSIGNMENT
> + bool "KVM legacy PCI device assignment support"
> + depends on KVM && PCI && IOMMU_API
> + default y
> + ---help---
> + Provide support for legacy PCI device assignment through KVM. The
> + kernel now also supports a full featured userspace device driver
> + framework through VFIO, which supersedes much of this support.
> +
> + If unsure, say Y.
> +
> # OK, it's a little counter-intuitive to do this, but it puts it neatly under
> # the virtualization menu.
> source drivers/vhost/Kconfig
> diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile
> index a797b8e..d609e1d 100644
> --- a/arch/x86/kvm/Makefile
> +++ b/arch/x86/kvm/Makefile
> @@ -7,8 +7,9 @@ CFLAGS_vmx.o := -I.
>
> kvm-y += $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \
> coalesced_mmio.o irq_comm.o eventfd.o \
> - assigned-dev.o irqchip.o)
> -kvm-$(CONFIG_IOMMU_API) += $(addprefix ../../../virt/kvm/, iommu.o)
> + irqchip.o)
> +kvm-$(CONFIG_KVM_DEVICE_ASSIGNMENT) += $(addprefix ../../../virt/kvm/, \
> + assigned-dev.o iommu.o)
> kvm-$(CONFIG_KVM_ASYNC_PF) += $(addprefix ../../../virt/kvm/, async_pf.o)
>
> kvm-y += x86.o mmu.o emulate.o i8259.o irq.o lapic.o \
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 9d9904f..86b9217 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -2492,7 +2492,6 @@ int kvm_dev_ioctl_check_extension(long ext)
> case KVM_CAP_USER_NMI:
> case KVM_CAP_REINJECT_CONTROL:
> case KVM_CAP_IRQ_INJECT_STATUS:
> - case KVM_CAP_ASSIGN_DEV_IRQ:
> case KVM_CAP_IRQFD:
> case KVM_CAP_IOEVENTFD:
> case KVM_CAP_PIT2:
> @@ -2510,9 +2509,12 @@ int kvm_dev_ioctl_check_extension(long ext)
> case KVM_CAP_XSAVE:
> case KVM_CAP_ASYNC_PF:
> case KVM_CAP_GET_TSC_KHZ:
> - case KVM_CAP_PCI_2_3:
> case KVM_CAP_KVMCLOCK_CTRL:
> case KVM_CAP_READONLY_MEM:
> +#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
> + case KVM_CAP_ASSIGN_DEV_IRQ:
> + case KVM_CAP_PCI_2_3:
> +#endif
> r = 1;
> break;
> case KVM_CAP_COALESCED_MMIO:
> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> index 8b25ea2..3358428 100644
> --- a/include/linux/kvm_host.h
> +++ b/include/linux/kvm_host.h
> @@ -667,7 +667,6 @@ static inline wait_queue_head_t *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu)
>
> int kvm_arch_init_vm(struct kvm *kvm, unsigned long type);
> void kvm_arch_destroy_vm(struct kvm *kvm);
> -void kvm_free_all_assigned_devices(struct kvm *kvm);
> void kvm_arch_sync_events(struct kvm *kvm);
>
> int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu);
> @@ -736,7 +735,7 @@ void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id);
> /* For vcpu->arch.iommu_flags */
> #define KVM_IOMMU_CACHE_COHERENCY 0x1
>
> -#ifdef CONFIG_IOMMU_API
> +#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
> int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot);
> void kvm_iommu_unmap_pages(struct kvm *kvm, struct kvm_memory_slot *slot);
> int kvm_iommu_map_guest(struct kvm *kvm);
> @@ -745,7 +744,7 @@ int kvm_assign_device(struct kvm *kvm,
> struct kvm_assigned_dev_kernel *assigned_dev);
> int kvm_deassign_device(struct kvm *kvm,
> struct kvm_assigned_dev_kernel *assigned_dev);
> -#else /* CONFIG_IOMMU_API */
> +#else
> static inline int kvm_iommu_map_pages(struct kvm *kvm,
> struct kvm_memory_slot *slot)
> {
> @@ -757,28 +756,11 @@ static inline void kvm_iommu_unmap_pages(struct kvm *kvm,
> {
> }
>
> -static inline int kvm_iommu_map_guest(struct kvm *kvm)
> -{
> - return -ENODEV;
> -}
> -
> static inline int kvm_iommu_unmap_guest(struct kvm *kvm)
> {
> return 0;
> }
> -
> -static inline int kvm_assign_device(struct kvm *kvm,
> - struct kvm_assigned_dev_kernel *assigned_dev)
> -{
> - return 0;
> -}
> -
> -static inline int kvm_deassign_device(struct kvm *kvm,
> - struct kvm_assigned_dev_kernel *assigned_dev)
> -{
> - return 0;
> -}
> -#endif /* CONFIG_IOMMU_API */
> +#endif
>
> static inline void __guest_enter(void)
> {
> @@ -1032,11 +1014,13 @@ static inline bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu) { return true; }
>
> #endif
>
> -#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
> +#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
>
> long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl,
> unsigned long arg);
>
> +void kvm_free_all_assigned_devices(struct kvm *kvm);
> +
> #else
>
> static inline long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl,
> @@ -1045,6 +1029,8 @@ static inline long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl,
> return -ENOTTY;
> }
>
> +static inline void kvm_free_all_assigned_devices(struct kvm *kvm) {}
> +
> #endif
>
> static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu)
> diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
> index c38d269..d647b56 100644
> --- a/include/uapi/linux/kvm.h
> +++ b/include/uapi/linux/kvm.h
> @@ -561,9 +561,7 @@ struct kvm_ppc_smmu_info {
> #define KVM_CAP_MP_STATE 14
> #define KVM_CAP_COALESCED_MMIO 15
> #define KVM_CAP_SYNC_MMU 16 /* Changes to host mmap are reflected in guest */
> -#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
> #define KVM_CAP_DEVICE_ASSIGNMENT 17
> -#endif
> #define KVM_CAP_IOMMU 18
> #ifdef __KVM_HAVE_MSI
> #define KVM_CAP_DEVICE_MSI 20
> @@ -583,9 +581,7 @@ struct kvm_ppc_smmu_info {
> #define KVM_CAP_IRQ_ROUTING 25
> #endif
> #define KVM_CAP_IRQ_INJECT_STATUS 26
> -#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
> #define KVM_CAP_DEVICE_DEASSIGNMENT 27
> -#endif
> #ifdef __KVM_HAVE_MSIX
> #define KVM_CAP_DEVICE_MSIX 28
> #endif
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2013-04-21 10:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-16 19:49 [PATCH] kvm: Allow build-time configuration of KVM device assignment Alex Williamson
2013-04-16 21:17 ` Alexander Graf
2013-04-18 7:59 ` Gleb Natapov
2013-04-21 10:53 ` Michael S. Tsirkin [this message]
2013-04-28 10:13 ` Gleb Natapov
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=20130421105312.GC12137@redhat.com \
--to=mst@redhat.com \
--cc=agraf@suse.de \
--cc=alex.williamson@redhat.com \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtosatti@redhat.com \
/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: link
Be 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.