Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kvm: Allow build-time configuration of KVM device assignment

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>
Reviewed-by: Alexander Graf <agraf@suse.de>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Gleb Natapov <gleb@redhat.com>

authored by

Alex Williamson and committed by
Gleb Natapov
2a5bab10 064d1afa

+40 -41
-1
arch/ia64/include/uapi/asm/kvm.h
··· 27 27 /* Select x86 specific features in <linux/kvm.h> */ 28 28 #define __KVM_HAVE_IOAPIC 29 29 #define __KVM_HAVE_IRQ_LINE 30 - #define __KVM_HAVE_DEVICE_ASSIGNMENT 31 30 32 31 /* Architectural interrupt line count. */ 33 32 #define KVM_NR_INTERRUPTS 256
+11 -2
arch/ia64/kvm/Kconfig
··· 21 21 tristate "Kernel-based Virtual Machine (KVM) support" 22 22 depends on BROKEN 23 23 depends on HAVE_KVM && MODULES 24 - # for device assignment: 25 - depends on PCI 26 24 depends on BROKEN 27 25 select PREEMPT_NOTIFIERS 28 26 select ANON_INODES ··· 48 50 ---help--- 49 51 Provides support for KVM on Itanium 2 processors equipped with the VT 50 52 extensions. 53 + 54 + config KVM_DEVICE_ASSIGNMENT 55 + bool "KVM legacy PCI device assignment support" 56 + depends on KVM && PCI && IOMMU_API 57 + default y 58 + ---help--- 59 + Provide support for legacy PCI device assignment through KVM. The 60 + kernel now also supports a full featured userspace device driver 61 + framework through VFIO, which supersedes much of this support. 62 + 63 + If unsure, say Y. 51 64 52 65 source drivers/vhost/Kconfig 53 66
+3 -3
arch/ia64/kvm/Makefile
··· 49 49 asflags-y := -Ivirt/kvm -Iarch/ia64/kvm/ 50 50 51 51 common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \ 52 - coalesced_mmio.o irq_comm.o assigned-dev.o irqchip.o) 52 + coalesced_mmio.o irq_comm.o) 53 53 54 - ifeq ($(CONFIG_IOMMU_API),y) 55 - common-objs += $(addprefix ../../../virt/kvm/, iommu.o) 54 + ifeq ($(CONFIG_KVM_DEVICE_ASSIGNMENT),y) 55 + common-objs += $(addprefix ../../../virt/kvm/, assigned-dev.o iommu.o) 56 56 endif 57 57 58 58 kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
-2
arch/ia64/kvm/kvm-ia64.c
··· 1368 1368 void kvm_arch_destroy_vm(struct kvm *kvm) 1369 1369 { 1370 1370 kvm_iommu_unmap_guest(kvm); 1371 - #ifdef KVM_CAP_DEVICE_ASSIGNMENT 1372 1371 kvm_free_all_assigned_devices(kvm); 1373 - #endif 1374 1372 kfree(kvm->arch.vioapic); 1375 1373 kvm_release_vm_pages(kvm); 1376 1374 }
-1
arch/x86/include/uapi/asm/kvm.h
··· 29 29 #define __KVM_HAVE_PIT 30 30 #define __KVM_HAVE_IOAPIC 31 31 #define __KVM_HAVE_IRQ_LINE 32 - #define __KVM_HAVE_DEVICE_ASSIGNMENT 33 32 #define __KVM_HAVE_MSI 34 33 #define __KVM_HAVE_USER_NMI 35 34 #define __KVM_HAVE_GUEST_DEBUG
+11 -2
arch/x86/kvm/Kconfig
··· 21 21 tristate "Kernel-based Virtual Machine (KVM) support" 22 22 depends on HAVE_KVM 23 23 depends on HIGH_RES_TIMERS 24 - # for device assignment: 25 - depends on PCI 26 24 # for TASKSTATS/TASK_DELAY_ACCT: 27 25 depends on NET 28 26 select PREEMPT_NOTIFIERS ··· 80 82 ---help--- 81 83 This option adds a R/W kVM module parameter 'mmu_audit', which allows 82 84 audit KVM MMU at runtime. 85 + 86 + config KVM_DEVICE_ASSIGNMENT 87 + bool "KVM legacy PCI device assignment support" 88 + depends on KVM && PCI && IOMMU_API 89 + default y 90 + ---help--- 91 + Provide support for legacy PCI device assignment through KVM. The 92 + kernel now also supports a full featured userspace device driver 93 + framework through VFIO, which supersedes much of this support. 94 + 95 + If unsure, say Y. 83 96 84 97 # OK, it's a little counter-intuitive to do this, but it puts it neatly under 85 98 # the virtualization menu.
+3 -2
arch/x86/kvm/Makefile
··· 7 7 8 8 kvm-y += $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \ 9 9 coalesced_mmio.o irq_comm.o eventfd.o \ 10 - assigned-dev.o irqchip.o) 11 - kvm-$(CONFIG_IOMMU_API) += $(addprefix ../../../virt/kvm/, iommu.o) 10 + irqchip.o) 11 + kvm-$(CONFIG_KVM_DEVICE_ASSIGNMENT) += $(addprefix ../../../virt/kvm/, \ 12 + assigned-dev.o iommu.o) 12 13 kvm-$(CONFIG_KVM_ASYNC_PF) += $(addprefix ../../../virt/kvm/, async_pf.o) 13 14 14 15 kvm-y += x86.o mmu.o emulate.o i8259.o irq.o lapic.o \
+4 -2
arch/x86/kvm/x86.c
··· 2501 2501 case KVM_CAP_USER_NMI: 2502 2502 case KVM_CAP_REINJECT_CONTROL: 2503 2503 case KVM_CAP_IRQ_INJECT_STATUS: 2504 - case KVM_CAP_ASSIGN_DEV_IRQ: 2505 2504 case KVM_CAP_IRQFD: 2506 2505 case KVM_CAP_IOEVENTFD: 2507 2506 case KVM_CAP_PIT2: ··· 2518 2519 case KVM_CAP_XSAVE: 2519 2520 case KVM_CAP_ASYNC_PF: 2520 2521 case KVM_CAP_GET_TSC_KHZ: 2521 - case KVM_CAP_PCI_2_3: 2522 2522 case KVM_CAP_KVMCLOCK_CTRL: 2523 2523 case KVM_CAP_READONLY_MEM: 2524 + #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT 2525 + case KVM_CAP_ASSIGN_DEV_IRQ: 2526 + case KVM_CAP_PCI_2_3: 2527 + #endif 2524 2528 r = 1; 2525 2529 break; 2526 2530 case KVM_CAP_COALESCED_MMIO:
+8 -22
include/linux/kvm_host.h
··· 667 667 668 668 int kvm_arch_init_vm(struct kvm *kvm, unsigned long type); 669 669 void kvm_arch_destroy_vm(struct kvm *kvm); 670 - void kvm_free_all_assigned_devices(struct kvm *kvm); 671 670 void kvm_arch_sync_events(struct kvm *kvm); 672 671 673 672 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu); ··· 735 736 /* For vcpu->arch.iommu_flags */ 736 737 #define KVM_IOMMU_CACHE_COHERENCY 0x1 737 738 738 - #ifdef CONFIG_IOMMU_API 739 + #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT 739 740 int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot); 740 741 void kvm_iommu_unmap_pages(struct kvm *kvm, struct kvm_memory_slot *slot); 741 742 int kvm_iommu_map_guest(struct kvm *kvm); ··· 744 745 struct kvm_assigned_dev_kernel *assigned_dev); 745 746 int kvm_deassign_device(struct kvm *kvm, 746 747 struct kvm_assigned_dev_kernel *assigned_dev); 747 - #else /* CONFIG_IOMMU_API */ 748 + #else 748 749 static inline int kvm_iommu_map_pages(struct kvm *kvm, 749 750 struct kvm_memory_slot *slot) 750 751 { ··· 756 757 { 757 758 } 758 759 759 - static inline int kvm_iommu_map_guest(struct kvm *kvm) 760 - { 761 - return -ENODEV; 762 - } 763 - 764 760 static inline int kvm_iommu_unmap_guest(struct kvm *kvm) 765 761 { 766 762 return 0; 767 763 } 768 - 769 - static inline int kvm_assign_device(struct kvm *kvm, 770 - struct kvm_assigned_dev_kernel *assigned_dev) 771 - { 772 - return 0; 773 - } 774 - 775 - static inline int kvm_deassign_device(struct kvm *kvm, 776 - struct kvm_assigned_dev_kernel *assigned_dev) 777 - { 778 - return 0; 779 - } 780 - #endif /* CONFIG_IOMMU_API */ 764 + #endif 781 765 782 766 static inline void __guest_enter(void) 783 767 { ··· 1014 1032 1015 1033 #endif 1016 1034 1017 - #ifdef __KVM_HAVE_DEVICE_ASSIGNMENT 1035 + #ifdef CONFIG_KVM_DEVICE_ASSIGNMENT 1018 1036 1019 1037 long kvm_vm_ioctl_assigned_device(struct kvm *kvm, unsigned ioctl, 1020 1038 unsigned long arg); 1039 + 1040 + void kvm_free_all_assigned_devices(struct kvm *kvm); 1021 1041 1022 1042 #else 1023 1043 ··· 1028 1044 { 1029 1045 return -ENOTTY; 1030 1046 } 1047 + 1048 + static inline void kvm_free_all_assigned_devices(struct kvm *kvm) {} 1031 1049 1032 1050 #endif 1033 1051
-4
include/uapi/linux/kvm.h
··· 561 561 #define KVM_CAP_MP_STATE 14 562 562 #define KVM_CAP_COALESCED_MMIO 15 563 563 #define KVM_CAP_SYNC_MMU 16 /* Changes to host mmap are reflected in guest */ 564 - #ifdef __KVM_HAVE_DEVICE_ASSIGNMENT 565 564 #define KVM_CAP_DEVICE_ASSIGNMENT 17 566 - #endif 567 565 #define KVM_CAP_IOMMU 18 568 566 #ifdef __KVM_HAVE_MSI 569 567 #define KVM_CAP_DEVICE_MSI 20 ··· 579 581 #endif 580 582 #define KVM_CAP_IRQ_ROUTING 25 581 583 #define KVM_CAP_IRQ_INJECT_STATUS 26 582 - #ifdef __KVM_HAVE_DEVICE_ASSIGNMENT 583 584 #define KVM_CAP_DEVICE_DEASSIGNMENT 27 584 - #endif 585 585 #ifdef __KVM_HAVE_MSIX 586 586 #define KVM_CAP_DEVICE_MSIX 28 587 587 #endif