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

VFIO: KVM: x86: Drop kvm_arch_{start,end}_assignment()

Drop kvm_arch_{start,end}_assignment() and all associated code now that
KVM x86 no longer consumes assigned_device_count. Tracking whether or not
a VFIO-assigned device is formally associated with a VM is fundamentally
flawed, as such an association is optional for general usage, i.e. is prone
to false negatives. E.g. prior to commit 2edd9cb79fb3 ("kvm: detect
assigned device via irqbypass manager"), device passthrough via VFIO would
fail to enable IRQ bypass if userspace omitted the formal VFIO<=>KVM
binding.

And device drivers that *need* the VFIO<=>KVM connection, e.g. KVM-GT,
shouldn't be relying on generic x86 tracking infrastructure.

Cc: Jim Mattson <jmattson@google.com>
Link: https://lore.kernel.org/r/20250523011756.3243624-6-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>

-41
-2
arch/x86/include/asm/kvm_host.h
··· 1381 1381 1382 1382 #define __KVM_HAVE_ARCH_NONCOHERENT_DMA 1383 1383 atomic_t noncoherent_dma_count; 1384 - #define __KVM_HAVE_ARCH_ASSIGNED_DEVICE 1385 - atomic_t assigned_device_count; 1386 1384 unsigned long nr_possible_bypass_irqs; 1387 1385 1388 1386 #ifdef CONFIG_KVM_IOAPIC
-18
arch/x86/kvm/x86.c
··· 13438 13438 return kvm_lapic_enabled(vcpu) && apf_pageready_slot_free(vcpu); 13439 13439 } 13440 13440 13441 - void kvm_arch_start_assignment(struct kvm *kvm) 13442 - { 13443 - atomic_inc(&kvm->arch.assigned_device_count); 13444 - } 13445 - EXPORT_SYMBOL_GPL(kvm_arch_start_assignment); 13446 - 13447 - void kvm_arch_end_assignment(struct kvm *kvm) 13448 - { 13449 - atomic_dec(&kvm->arch.assigned_device_count); 13450 - } 13451 - EXPORT_SYMBOL_GPL(kvm_arch_end_assignment); 13452 - 13453 - bool noinstr kvm_arch_has_assigned_device(struct kvm *kvm) 13454 - { 13455 - return raw_atomic_read(&kvm->arch.assigned_device_count); 13456 - } 13457 - EXPORT_SYMBOL_GPL(kvm_arch_has_assigned_device); 13458 - 13459 13441 static void kvm_noncoherent_dma_assignment_start_or_stop(struct kvm *kvm) 13460 13442 { 13461 13443 /*
-18
include/linux/kvm_host.h
··· 1690 1690 return false; 1691 1691 } 1692 1692 #endif 1693 - #ifdef __KVM_HAVE_ARCH_ASSIGNED_DEVICE 1694 - void kvm_arch_start_assignment(struct kvm *kvm); 1695 - void kvm_arch_end_assignment(struct kvm *kvm); 1696 - bool kvm_arch_has_assigned_device(struct kvm *kvm); 1697 - #else 1698 - static inline void kvm_arch_start_assignment(struct kvm *kvm) 1699 - { 1700 - } 1701 - 1702 - static inline void kvm_arch_end_assignment(struct kvm *kvm) 1703 - { 1704 - } 1705 - 1706 - static __always_inline bool kvm_arch_has_assigned_device(struct kvm *kvm) 1707 - { 1708 - return false; 1709 - } 1710 - #endif 1711 1693 1712 1694 static inline struct rcuwait *kvm_arch_vcpu_get_wait(struct kvm_vcpu *vcpu) 1713 1695 {
-3
virt/kvm/vfio.c
··· 175 175 kvf->file = get_file(filp); 176 176 list_add_tail(&kvf->node, &kv->file_list); 177 177 178 - kvm_arch_start_assignment(dev->kvm); 179 178 kvm_vfio_file_set_kvm(kvf->file, dev->kvm); 180 179 kvm_vfio_update_coherency(dev); 181 180 ··· 204 205 continue; 205 206 206 207 list_del(&kvf->node); 207 - kvm_arch_end_assignment(dev->kvm); 208 208 #ifdef CONFIG_SPAPR_TCE_IOMMU 209 209 kvm_spapr_tce_release_vfio_group(dev->kvm, kvf); 210 210 #endif ··· 334 336 fput(kvf->file); 335 337 list_del(&kvf->node); 336 338 kfree(kvf); 337 - kvm_arch_end_assignment(dev->kvm); 338 339 } 339 340 340 341 kvm_vfio_update_coherency(dev);