[PATCH v3 0/5] KVM/vfio: Use file-based reference counting for KVM

Steffen Eiden posted 5 patches 2 hours ago
arch/s390/include/asm/kvm_host_s390.h |  4 ++-
arch/s390/kvm/s390/pci.c              |  9 ++++--
arch/x86/include/asm/kvm_host.h       |  2 ++
arch/x86/include/asm/kvm_page_track.h |  8 ++---
arch/x86/kvm/Makefile                 |  4 +--
arch/x86/kvm/mmu/page_track.c         | 22 +++++++++-----
arch/x86/kvm/svm/sev.c                |  8 ++---
drivers/s390/crypto/vfio_ap_ops.c     | 20 ++++++++----
drivers/vfio/group.c                  | 11 ++++++-
drivers/vfio/vfio.h                   | 12 ++++----
drivers/vfio/vfio_main.c              | 57 +++++++++++------------------------
include/linux/kvm_host.h              | 18 +++++++++++
include/linux/vfio.h                  |  5 ++-
virt/kvm/kvm_main.c                   | 21 +++++++++++--
virt/kvm/vfio.c                       | 13 +++++---
15 files changed, 130 insertions(+), 84 deletions(-)
[PATCH v3 0/5] KVM/vfio: Use file-based reference counting for KVM
Posted by Steffen Eiden 2 hours ago
This series switches the KVM-VFIO interface and external consumers over to
standard file-based reference counting, eliminating all external KVM symbol
exports.

This is a spin-off for the arm on s390 series [1] to address all the
relevant persons w/o polluting their mailbox.

Currently, VFIO integrates with KVM by looking up kvm_get_kvm_safe() and
kvm_put_kvm() dynamically using symbol_get(), manually tracking module
reference counts and storing a put_kvm function pointer in struct
vfio_device.

In the ARM64-on-s390 architecture, a second concurrent KVM module
(kvm-arm64) is introduced alongside native KVM to host hardware-accelerated
ARM64 guests. Having exported global symbols (like kvm_get_kvm/kvm_put_kvm)
creates symbol conflicts and prevents clean coexistence of two KVM modules.

Additionally, the file based counting simplifies the code and reuses
the existing fs refcounting.

Instead of passing raw KVM pointers and managing module symbols manually, the
interface now passes the underlying VM file descriptor throughout VFIO and
associated architecture subsystems. To safely extract the KVM instance from a
file, an architecture-namespaced helper mechanism is introduced that verifies
the file belongs to the expected KVM implementation before accessing its
internal state. A back-pointer from the KVM instance to its associated file is
maintained across its lifecycle so subsystems can safely acquire file
references on demand. Finally, with VFIO, architecture page tracking, and
device hooks converted to use file references, the remaining KVM reference-
counting exports are restricted strictly to internal KVM modules.

	Steffen

[1] https://lore.kernel.org/all/20260918133107.1042730-1-seiden@linux.ibm.com

---
Changes in v3:
- Split the previous single monolithic patch into 5 smaller, focused patches:
  1. Add opt-in macro infrastructure for `file_to_kvm_<arch>()` helpers.
  2. Add `kvm->file` back-pointer to `struct kvm`.
  3. Use `file_to_kvm_x86()` helper in AMD SEV.
  4. Convert VFIO, s390 vfio-ap/zpci, and x86 page-track to file-based refcounting.
  5. Restrict `kvm_get_kvm`/`kvm_put_kvm` to `EXPORT_SYMBOL_FOR_KVM_INTERNAL`.
- Introduce macro-generated, typed `file_to_kvm_<arch>()` helpers instead of generic casts.
- Clean up `vfio_pci_zdev.c` by passing `struct file *` through `zpci_kvm_hook.kvm_register`.
- Update x86 page-track and s390 AP/PCI to use `file_to_kvm_<arch>()`.
- Update x86 Makefile export checks.
- Link to v2: https://lore.kernel.org/r/20260903-vfio-v2-1-ef4cd4190ae7@linux.ibm.com

Changes in v2:
- Rebase on 7.3-rc1+ and resolve conflict with 9f240376d034 ("s390/pci: Store
  PCI error information for passthrough devices"),
- Fix stub prototype for vfio_group_set_kvm for !CONFIG_VFIO_GROUP
- Link to v1:   https://lore.kernel.org/r/20260812-vfio-v1-1-5cfe0b1fa4e7@linux.ibm.com

---
Steffen Eiden (5):
      KVM: Introduce file_to_kvm_<arch>() infrastructure
      KVM: Add file back-pointer to struct kvm
      KVM: x86: Use file_to_kvm_x86() in SEV
      KVM/vfio: Use file-based reference counting for KVM
      KVM: Restrict kvm_get_kvm/kvm_put_kvm export to internal KVM modules

 arch/s390/include/asm/kvm_host_s390.h |  4 ++-
 arch/s390/kvm/s390/pci.c              |  9 ++++--
 arch/x86/include/asm/kvm_host.h       |  2 ++
 arch/x86/include/asm/kvm_page_track.h |  8 ++---
 arch/x86/kvm/Makefile                 |  4 +--
 arch/x86/kvm/mmu/page_track.c         | 22 +++++++++-----
 arch/x86/kvm/svm/sev.c                |  8 ++---
 drivers/s390/crypto/vfio_ap_ops.c     | 20 ++++++++----
 drivers/vfio/group.c                  | 11 ++++++-
 drivers/vfio/vfio.h                   | 12 ++++----
 drivers/vfio/vfio_main.c              | 57 +++++++++++------------------------
 include/linux/kvm_host.h              | 18 +++++++++++
 include/linux/vfio.h                  |  5 ++-
 virt/kvm/kvm_main.c                   | 21 +++++++++++--
 virt/kvm/vfio.c                       | 13 +++++---
 15 files changed, 130 insertions(+), 84 deletions(-)

base-commit: 5dd1818b15d98d4a20806cd00b1b40320b06004f

---
Steffen Eiden <seiden@linux.ibm.com>