* [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM
@ 2026-10-09 14:27 Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 1/6] KVM: Introduce file_to_kvm_<arch>() infrastructure Christian Borntraeger
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Christian Borntraeger @ 2026-10-09 14:27 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, Janosch Frank, Claudio Imbrenda, David Hildenbrand,
linux-s390, Christian Borntraeger, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Eric Farman, Sean Christopherson, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin,
Matthew Rosato, Farhan Ali, Tony Krowiak, Halil Pasic,
Jason Herne, Harald Freudenberger, Holger Dengler,
Alex Williamson, linux-kernel, Steffen Eiden, Jason Gunthorpe
Paolo,
The following changes since commit df2908090cda368b01ff43709f51890076c56157:
Linux 7.3-rc2 (2026-09-06 15:07:20 -0700)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git tags/kvm-s390-next-7.4-1
for you to fetch changes up to c22295d0d75f5590fdde5493cb90e2d50d5f508e:
KVM: Remove unused file_is_kvm (2026-10-02 10:40:01 +0200)
The tag points to the vfio_file_reference branch of the kvms390 repo
https://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git/log/?h=vfio_file_reference
----------------------------------------------------------------
KVM/vfio: Use file-based reference counting for KVM
This series switches the KVM-VFIO interface and external consumers over to
standard file-based reference counting, eliminating all external KVM symbol
exports.
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 Eiden (6):
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
KVM: Remove unused file_is_kvm
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 | 10 +++---
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/device_cdev.c | 2 +-
drivers/vfio/group.c | 13 ++++++--
drivers/vfio/vfio.h | 14 ++++-----
drivers/vfio/vfio_main.c | 57 +++++++++++------------------------
include/linux/kvm_host.h | 19 +++++++++++-
include/linux/vfio.h | 5 ++-
virt/kvm/kvm_main.c | 21 +++++++++----
virt/kvm/vfio.c | 13 +++++---
16 files changed, 132 insertions(+), 91 deletions(-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* [GIT PULL 1/6] KVM: Introduce file_to_kvm_<arch>() infrastructure
2026-10-09 14:27 [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
@ 2026-10-09 14:27 ` Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 2/6] KVM: Add file back-pointer to struct kvm Christian Borntraeger
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Christian Borntraeger @ 2026-10-09 14:27 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, Janosch Frank, Claudio Imbrenda, David Hildenbrand,
linux-s390, Christian Borntraeger, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Eric Farman, Sean Christopherson, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin,
Matthew Rosato, Farhan Ali, Tony Krowiak, Halil Pasic,
Jason Herne, Harald Freudenberger, Holger Dengler,
Alex Williamson, linux-kernel, Steffen Eiden, Jason Gunthorpe
From: Steffen Eiden <seiden@linux.ibm.com>
Add a macro mechanism that generates an opt-in and arch-namespaced
file_to_kvm_<arch>() to convert a file reference to a kvm object if the
file handle represents a kvm handle.
Activate for x86 and for s390 (native KVM only).
Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
---
arch/s390/include/asm/kvm_host_s390.h | 2 ++
arch/x86/include/asm/kvm_host.h | 2 ++
arch/x86/kvm/Makefile | 1 +
include/linux/kvm_host.h | 12 ++++++++++++
virt/kvm/kvm_main.c | 11 +++++++++++
5 files changed, 28 insertions(+)
diff --git a/arch/s390/include/asm/kvm_host_s390.h b/arch/s390/include/asm/kvm_host_s390.h
index cd692f8fb764..8a7eed5847e1 100644
--- a/arch/s390/include/asm/kvm_host_s390.h
+++ b/arch/s390/include/asm/kvm_host_s390.h
@@ -27,6 +27,8 @@
#include <asm/isc.h>
#include <asm/guarded_storage.h>
+#define kvm_file_to_kvm_arch s390
+
#define KVM_HAVE_MMU_RWLOCK
#define KVM_MAX_VCPUS 255
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 683bb8bf43a9..e460073ff176 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -44,6 +44,8 @@
#include <hyperv/hvhdk.h>
+#define kvm_file_to_kvm_arch x86
+
#define __KVM_HAVE_ARCH_VCPU_DEBUGFS
/*
diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile
index 0474604ab8a1..e6d395ede9e2 100644
--- a/arch/x86/kvm/Makefile
+++ b/arch/x86/kvm/Makefile
@@ -61,6 +61,7 @@ exports_grep_trailer := --include='*.[ch]' -nrw $(srctree)/virt/kvm $(srctree)/a
-e kvm_page_track_unregister_notifier \
-e kvm_write_track_add_gfn \
-e kvm_write_track_remove_gfn \
+ -e kvm_file_to_kvm_fn \
-e kvm_get_kvm \
-e kvm_get_kvm_safe \
-e kvm_put_kvm
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 03bfc92864b6..e840ceda9f16 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1082,6 +1082,18 @@ void kvm_get_kvm(struct kvm *kvm);
bool kvm_get_kvm_safe(struct kvm *kvm);
void kvm_put_kvm(struct kvm *kvm);
bool file_is_kvm(struct file *file);
+
+/*
+ * Architectures define kvm_file_to_kvm_arch to <arch>
+ * to get a typed, arch-namespaced helper:
+ *
+ * struct kvm *file_to_kvm_<arch>(struct file *file)
+ */
+#ifdef kvm_file_to_kvm_arch
+#define kvm_file_to_kvm_fn CONCATENATE(file_to_kvm_, kvm_file_to_kvm_arch)
+struct kvm *kvm_file_to_kvm_fn(struct file *file);
+#endif /* kvm_file_to_kvm_arch */
+
void kvm_put_kvm_no_destroy(struct kvm *kvm);
static inline struct kvm_memslots *__kvm_memslots(struct kvm *kvm, int as_id)
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 65eb26a0520d..0172ca94f82e 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -5496,6 +5496,17 @@ bool file_is_kvm(struct file *file)
}
EXPORT_SYMBOL_FOR_KVM_INTERNAL(file_is_kvm);
+#ifdef kvm_file_to_kvm_arch
+struct kvm *kvm_file_to_kvm_fn(struct file *file)
+{
+ if (!file || file->f_op != &kvm_vm_fops)
+ return NULL;
+
+ return file->private_data;
+}
+EXPORT_SYMBOL_GPL(kvm_file_to_kvm_fn);
+#endif
+
static int kvm_dev_ioctl_create_vm(unsigned long type)
{
char fdname[ITOA_MAX_LEN + 1];
--
2.53.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [GIT PULL 2/6] KVM: Add file back-pointer to struct kvm
2026-10-09 14:27 [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 1/6] KVM: Introduce file_to_kvm_<arch>() infrastructure Christian Borntraeger
@ 2026-10-09 14:27 ` Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 3/6] KVM: x86: Use file_to_kvm_x86() in SEV Christian Borntraeger
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Christian Borntraeger @ 2026-10-09 14:27 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, Janosch Frank, Claudio Imbrenda, David Hildenbrand,
linux-s390, Christian Borntraeger, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Eric Farman, Sean Christopherson, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin,
Matthew Rosato, Farhan Ali, Tony Krowiak, Halil Pasic,
Jason Herne, Harald Freudenberger, Holger Dengler,
Alex Williamson, linux-kernel, Steffen Eiden, Jason Gunthorpe
From: Steffen Eiden <seiden@linux.ibm.com>
Add kvm->file as a no-reference back-pointer to the VM file in struct
kvm. The pointer is set at VM creation time and cleared under
WRITE_ONCE() in kvm_vm_release() before the file is freed.
Callers storing the file must take their own reference.
Co-developed-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
---
include/linux/kvm_host.h | 6 ++++++
virt/kvm/kvm_main.c | 4 ++++
2 files changed, 10 insertions(+)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index e840ceda9f16..943b108f01cd 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -784,6 +784,12 @@ struct kvm {
* kvm_swap_active_memslots().
*/
struct mutex slots_arch_lock;
+ /*
+ * Back-reference to the VM file for subsystems (e.g., VFIO). Holds no
+ * reference to avoid pinning the VM. Callers storing the file must
+ * take their own reference.
+ */
+ struct file *file;
struct mm_struct *mm; /* userspace tied to this vm */
unsigned long nr_memslot_pages;
/* The two memslot sets - active and inactive (per address space) */
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 0172ca94f82e..bab71d398236 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1352,6 +1352,8 @@ static int kvm_vm_release(struct inode *inode, struct file *filp)
kvm_irqfd_release(kvm);
+ WRITE_ONCE(kvm->file, NULL);
+
kvm_put_kvm(kvm);
return 0;
}
@@ -5532,6 +5534,8 @@ static int kvm_dev_ioctl_create_vm(unsigned long type)
goto put_kvm;
}
+ kvm->file = file;
+
/*
* Don't call kvm_put_kvm anymore at this point; file->f_op is
* already set, with ->release() being kvm_vm_release(). In error
--
2.53.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [GIT PULL 3/6] KVM: x86: Use file_to_kvm_x86() in SEV
2026-10-09 14:27 [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 1/6] KVM: Introduce file_to_kvm_<arch>() infrastructure Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 2/6] KVM: Add file back-pointer to struct kvm Christian Borntraeger
@ 2026-10-09 14:27 ` Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 4/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Christian Borntraeger @ 2026-10-09 14:27 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, Janosch Frank, Claudio Imbrenda, David Hildenbrand,
linux-s390, Christian Borntraeger, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Eric Farman, Sean Christopherson, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin,
Matthew Rosato, Farhan Ali, Tony Krowiak, Halil Pasic,
Jason Herne, Harald Freudenberger, Holger Dengler,
Alex Williamson, linux-kernel, Steffen Eiden, Jason Gunthorpe
From: Steffen Eiden <seiden@linux.ibm.com>
Use the new arch-namespaced helper instead of open-coding the file check
and private_data cast separately.
Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
---
arch/x86/kvm/svm/sev.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
index 5705723f1f41..6b0eacde4f06 100644
--- a/arch/x86/kvm/svm/sev.c
+++ b/arch/x86/kvm/svm/sev.c
@@ -2145,10 +2145,10 @@ int sev_vm_move_enc_context_from(struct kvm *kvm, unsigned int source_fd)
if (fd_empty(f))
return -EBADF;
- if (!file_is_kvm(fd_file(f)))
+ source_kvm = file_to_kvm_x86(fd_file(f));
+ if (!source_kvm)
return -EBADF;
- source_kvm = fd_file(f)->private_data;
ret = sev_lock_two_vms(kvm, source_kvm);
if (ret)
return ret;
@@ -2866,10 +2866,10 @@ int sev_vm_copy_enc_context_from(struct kvm *kvm, unsigned int source_fd)
if (fd_empty(f))
return -EBADF;
- if (!file_is_kvm(fd_file(f)))
+ source_kvm = file_to_kvm_x86(fd_file(f));
+ if (!source_kvm)
return -EBADF;
- source_kvm = fd_file(f)->private_data;
ret = sev_lock_two_vms(kvm, source_kvm);
if (ret)
return ret;
--
2.53.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [GIT PULL 4/6] KVM/vfio: Use file-based reference counting for KVM
2026-10-09 14:27 [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
` (2 preceding siblings ...)
2026-10-09 14:27 ` [GIT PULL 3/6] KVM: x86: Use file_to_kvm_x86() in SEV Christian Borntraeger
@ 2026-10-09 14:27 ` Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 5/6] KVM: Restrict kvm_get_kvm/kvm_put_kvm export to internal KVM modules Christian Borntraeger
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Christian Borntraeger @ 2026-10-09 14:27 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, Janosch Frank, Claudio Imbrenda, David Hildenbrand,
linux-s390, Christian Borntraeger, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Eric Farman, Sean Christopherson, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin,
Matthew Rosato, Farhan Ali, Tony Krowiak, Halil Pasic,
Jason Herne, Harald Freudenberger, Holger Dengler,
Alex Williamson, linux-kernel, Steffen Eiden, Jason Gunthorpe
From: Steffen Eiden <seiden@linux.ibm.com>
Replace manual module reference counting with file-based reference
counting for KVM integration. Previously, VFIO used symbol_get() to
obtain function pointers for kvm_get_kvm_safe() and kvm_put_kvm(),
then manually tracked module references through these symbols. This
approach required storing the put_kvm function pointer in each device
and carefully managing symbol references.
Pass struct file pointers instead of struct kvm pointers throughout the
VFIO-KVM interface, leveraging the kernel's existing file reference
counting via get_file()/get_file_active() and fput(). Convert the x86
page-track API and update s390 vfio to use file_to_kvm_<arch>(). This
simplifies the code.
Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Co-developed-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Acked-by: Alex Williamson <alex@shazbot.org>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Sean Christopherson <seanjc@google.com>
[borntraeger@linux.ibm.com remove _safe from vfio_device_get_kvm_safe]
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
---
arch/s390/include/asm/kvm_host_s390.h | 2 +-
arch/s390/kvm/s390/pci.c | 9 ++++-
arch/x86/include/asm/kvm_page_track.h | 10 +++--
arch/x86/kvm/mmu/page_track.c | 22 +++++++----
drivers/s390/crypto/vfio_ap_ops.c | 20 +++++++---
drivers/vfio/device_cdev.c | 2 +-
drivers/vfio/group.c | 13 +++++-
drivers/vfio/vfio.h | 14 +++----
drivers/vfio/vfio_main.c | 57 +++++++++------------------
include/linux/vfio.h | 5 +--
virt/kvm/vfio.c | 13 ++++--
11 files changed, 90 insertions(+), 77 deletions(-)
diff --git a/arch/s390/include/asm/kvm_host_s390.h b/arch/s390/include/asm/kvm_host_s390.h
index 8a7eed5847e1..9519b8028b10 100644
--- a/arch/s390/include/asm/kvm_host_s390.h
+++ b/arch/s390/include/asm/kvm_host_s390.h
@@ -722,7 +722,7 @@ static inline void kvm_arch_vcpu_unblocking(struct kvm_vcpu *vcpu) {}
void kvm_arch_free_vm(struct kvm *kvm);
struct zpci_kvm_hook {
- int (*kvm_register)(void *opaque, struct kvm *kvm);
+ int (*kvm_register)(void *opaque, struct file *kvm_file);
void (*kvm_unregister)(void *opaque);
};
diff --git a/arch/s390/kvm/s390/pci.c b/arch/s390/kvm/s390/pci.c
index 82892e1e03d9..d79bd3bdc68e 100644
--- a/arch/s390/kvm/s390/pci.c
+++ b/arch/s390/kvm/s390/pci.c
@@ -498,17 +498,22 @@ static void kvm_s390_pci_dev_release(struct zpci_dev *zdev)
* available, enable them and let userspace indicate whether or not they will
* be used (specify SHM bit to disable).
*/
-static int kvm_s390_pci_register_kvm(void *opaque, struct kvm *kvm)
+static int kvm_s390_pci_register_kvm(void *opaque, struct file *kvm_file)
{
struct zpci_dev *zdev = opaque;
+ struct kvm *kvm;
int rc;
if (!zdev)
return -EINVAL;
+ kvm = file_to_kvm_s390(kvm_file);
+ if (!kvm)
+ return -ENOENT;
+
mutex_lock(&zdev->kzdev_lock);
- if (zdev->kzdev || zdev->gisa != 0 || !kvm) {
+ if (zdev->kzdev || zdev->gisa != 0) {
mutex_unlock(&zdev->kzdev_lock);
return -EINVAL;
}
diff --git a/arch/x86/include/asm/kvm_page_track.h b/arch/x86/include/asm/kvm_page_track.h
index 3d040741044b..ea885dd5c9af 100644
--- a/arch/x86/include/asm/kvm_page_track.h
+++ b/arch/x86/include/asm/kvm_page_track.h
@@ -44,13 +44,15 @@ struct kvm_page_track_notifier_node {
struct kvm_page_track_notifier_node *node);
};
-int kvm_page_track_register_notifier(struct kvm *kvm,
+struct file;
+
+int kvm_page_track_register_notifier(struct file *file,
struct kvm_page_track_notifier_node *n);
-void kvm_page_track_unregister_notifier(struct kvm *kvm,
+void kvm_page_track_unregister_notifier(struct file *file,
struct kvm_page_track_notifier_node *n);
-int kvm_write_track_add_gfn(struct kvm *kvm, gfn_t gfn);
-int kvm_write_track_remove_gfn(struct kvm *kvm, gfn_t gfn);
+int kvm_write_track_add_gfn(struct file *file, gfn_t gfn);
+int kvm_write_track_remove_gfn(struct file *file, gfn_t gfn);
#else
/*
* Allow defining a node in a structure even if page tracking is disabled, e.g.
diff --git a/arch/x86/kvm/mmu/page_track.c b/arch/x86/kvm/mmu/page_track.c
index 7e8195a311bb..f12558dfcd81 100644
--- a/arch/x86/kvm/mmu/page_track.c
+++ b/arch/x86/kvm/mmu/page_track.c
@@ -16,6 +16,8 @@
#include <linux/kvm_host.h>
#include <linux/rculist.h>
+#include <asm/kvm_page_track.h>
+
#include "mmu.h"
#include "mmu_internal.h"
#include "page_track.h"
@@ -237,10 +239,11 @@ static int kvm_enable_external_write_tracking(struct kvm *kvm)
* register the notifier so that event interception for the tracked guest
* pages can be received.
*/
-int kvm_page_track_register_notifier(struct kvm *kvm,
+int kvm_page_track_register_notifier(struct file *file,
struct kvm_page_track_notifier_node *n)
{
struct kvm_page_track_notifier_head *head;
+ struct kvm *kvm = file_to_kvm_x86(file);
int r;
if (!kvm || kvm->mm != current->mm)
@@ -252,7 +255,7 @@ int kvm_page_track_register_notifier(struct kvm *kvm,
return r;
}
- kvm_get_kvm(kvm);
+ get_file(file);
head = &kvm->arch.track_notifier_head;
@@ -267,10 +270,11 @@ EXPORT_SYMBOL_GPL(kvm_page_track_register_notifier);
* stop receiving the event interception. It is the opposed operation of
* kvm_page_track_register_notifier().
*/
-void kvm_page_track_unregister_notifier(struct kvm *kvm,
+void kvm_page_track_unregister_notifier(struct file *file,
struct kvm_page_track_notifier_node *n)
{
struct kvm_page_track_notifier_head *head;
+ struct kvm *kvm = file_to_kvm_x86(file);
head = &kvm->arch.track_notifier_head;
@@ -279,7 +283,7 @@ void kvm_page_track_unregister_notifier(struct kvm *kvm,
write_unlock(&kvm->mmu_lock);
synchronize_srcu(&head->track_srcu);
- kvm_put_kvm(kvm);
+ fput(file);
}
EXPORT_SYMBOL_GPL(kvm_page_track_unregister_notifier);
@@ -336,11 +340,12 @@ void kvm_page_track_delete_slot(struct kvm *kvm, struct kvm_memory_slot *slot)
* add guest page to the tracking pool so that corresponding access on that
* page will be intercepted.
*
- * @kvm: the guest instance we are interested in.
+ * @file: the VM file of the guest instance we are interested in.
* @gfn: the guest page.
*/
-int kvm_write_track_add_gfn(struct kvm *kvm, gfn_t gfn)
+int kvm_write_track_add_gfn(struct file *file, gfn_t gfn)
{
+ struct kvm *kvm = file_to_kvm_x86(file);
struct kvm_memory_slot *slot;
int idx;
@@ -366,11 +371,12 @@ EXPORT_SYMBOL_GPL(kvm_write_track_add_gfn);
* remove the guest page from the tracking pool which stops the interception
* of corresponding access on that page.
*
- * @kvm: the guest instance we are interested in.
+ * @file: the VM file of the guest instance we are interested in.
* @gfn: the guest page.
*/
-int kvm_write_track_remove_gfn(struct kvm *kvm, gfn_t gfn)
+int kvm_write_track_remove_gfn(struct file *file, gfn_t gfn)
{
+ struct kvm *kvm = file_to_kvm_x86(file);
struct kvm_memory_slot *slot;
int idx;
diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c
index 940c0ff668be..556e643244f2 100644
--- a/drivers/s390/crypto/vfio_ap_ops.c
+++ b/drivers/s390/crypto/vfio_ap_ops.c
@@ -1822,17 +1822,27 @@ static const struct attribute_group *vfio_ap_mdev_attr_groups[] = {
/**
* vfio_ap_mdev_set_kvm - sets all data for @matrix_mdev that are needed
- * to manage AP resources for the guest whose state is represented by @kvm
+ * to manage AP resources for the guest whose state is represented by
+ * @kvm_file
*
* @matrix_mdev: a mediated matrix device
- * @kvm: reference to KVM instance
+ * @kvm_file: the KVM VM file this vfio device is associated with
*
- * Return: 0 if no other mediated matrix device has a reference to @kvm;
+ * Return: 0 if no other mediated matrix device has a reference to the VM;
* otherwise, returns an -EPERM.
*/
static int vfio_ap_mdev_set_kvm(struct ap_matrix_mdev *matrix_mdev,
- struct kvm *kvm)
+ struct file *kvm_file)
{
+ struct kvm *kvm;
+
+ if (!kvm_file)
+ return -ENOENT;
+
+ kvm = file_to_kvm_s390(kvm_file);
+ if (!kvm)
+ return -ENOENT;
+
if (kvm->arch.crypto.crycbd) {
get_update_locks_for_kvm(kvm);
if (kvm->arch.crypto.pqap_hook) {
@@ -1841,7 +1851,6 @@ static int vfio_ap_mdev_set_kvm(struct ap_matrix_mdev *matrix_mdev,
}
kvm->arch.crypto.pqap_hook = &matrix_mdev->pqap_hook;
- kvm_get_kvm(kvm);
matrix_mdev->kvm = kvm;
vfio_ap_mdev_update_guest_apcb(matrix_mdev);
release_update_locks_for_kvm(kvm);
@@ -1894,7 +1903,6 @@ static void vfio_ap_mdev_unset_kvm(struct ap_matrix_mdev *matrix_mdev)
matrix_mdev->kvm = NULL;
release_update_locks_for_kvm(kvm);
- kvm_put_kvm(kvm);
}
}
diff --git a/drivers/vfio/device_cdev.c b/drivers/vfio/device_cdev.c
index 1d9515c967b0..c1c26d7a9aec 100644
--- a/drivers/vfio/device_cdev.c
+++ b/drivers/vfio/device_cdev.c
@@ -65,7 +65,7 @@ int vfio_device_fops_cdev_open(struct inode *inode, struct file *filep)
static void vfio_df_get_kvm_safe(struct vfio_device_file *df)
{
spin_lock(&df->kvm_ref_lock);
- vfio_device_get_kvm_safe(df->device, df->kvm);
+ vfio_device_get_kvm(df->device, df->kvm);
spin_unlock(&df->kvm_ref_lock);
}
diff --git a/drivers/vfio/group.c b/drivers/vfio/group.c
index b2299e5bc6df..185f359f75d3 100644
--- a/drivers/vfio/group.c
+++ b/drivers/vfio/group.c
@@ -163,7 +163,7 @@ static int vfio_group_ioctl_set_container(struct vfio_group *group,
static void vfio_device_group_get_kvm_safe(struct vfio_device *device)
{
spin_lock(&device->group->kvm_ref_lock);
- vfio_device_get_kvm_safe(device, device->group->kvm);
+ vfio_device_get_kvm(device, device->group->kvm);
spin_unlock(&device->group->kvm_ref_lock);
}
@@ -860,11 +860,20 @@ bool vfio_group_enforced_coherent(struct vfio_group *group)
return ret;
}
-void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm)
+void vfio_group_set_kvm(struct vfio_group *group, struct file *kvm)
{
+ struct file *old;
+
+ if (kvm)
+ get_file(kvm);
+
spin_lock(&group->kvm_ref_lock);
+ old = group->kvm;
group->kvm = kvm;
spin_unlock(&group->kvm_ref_lock);
+
+ if (old)
+ fput(old);
}
/**
diff --git a/drivers/vfio/vfio.h b/drivers/vfio/vfio.h
index 7728bc99b63d..2eeb526a8da5 100644
--- a/drivers/vfio/vfio.h
+++ b/drivers/vfio/vfio.h
@@ -23,7 +23,7 @@ struct vfio_device_file {
u8 access_granted;
u32 devid; /* only valid when iommufd is valid */
spinlock_t kvm_ref_lock; /* protect kvm field */
- struct kvm *kvm;
+ struct file *kvm;
struct iommufd_ctx *iommufd; /* protected by struct vfio_device_set::lock */
};
@@ -88,7 +88,7 @@ struct vfio_group {
#endif
enum vfio_group_type type;
struct mutex group_lock;
- struct kvm *kvm;
+ struct file *kvm;
struct file *opened_file;
struct iommufd_ctx *iommufd;
spinlock_t kvm_ref_lock;
@@ -107,7 +107,7 @@ void vfio_device_group_unuse_iommu(struct vfio_device *device);
void vfio_df_group_close(struct vfio_device_file *df);
struct vfio_group *vfio_group_from_file(struct file *file);
bool vfio_group_enforced_coherent(struct vfio_group *group);
-void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm);
+void vfio_group_set_kvm(struct vfio_group *group, struct file *kvm);
bool vfio_device_has_container(struct vfio_device *device);
int __init vfio_group_init(void);
void vfio_group_cleanup(void);
@@ -165,7 +165,7 @@ static inline bool vfio_group_enforced_coherent(struct vfio_group *group)
return true;
}
-static inline void vfio_group_set_kvm(struct vfio_group *group, struct kvm *kvm)
+static inline void vfio_group_set_kvm(struct vfio_group *group, struct file *kvm)
{
}
@@ -429,11 +429,11 @@ static inline void vfio_virqfd_exit(void)
#endif
#if IS_ENABLED(CONFIG_KVM)
-void vfio_device_get_kvm_safe(struct vfio_device *device, struct kvm *kvm);
+void vfio_device_get_kvm(struct vfio_device *device, struct file *kvm);
void vfio_device_put_kvm(struct vfio_device *device);
#else
-static inline void vfio_device_get_kvm_safe(struct vfio_device *device,
- struct kvm *kvm)
+static inline void vfio_device_get_kvm(struct vfio_device *device,
+ struct file *kvm)
{
}
diff --git a/drivers/vfio/vfio_main.c b/drivers/vfio/vfio_main.c
index 423ead48aafe..ea8e6cc13c45 100644
--- a/drivers/vfio/vfio_main.c
+++ b/drivers/vfio/vfio_main.c
@@ -472,36 +472,14 @@ void vfio_unregister_group_dev(struct vfio_device *device)
EXPORT_SYMBOL_GPL(vfio_unregister_group_dev);
#if IS_ENABLED(CONFIG_KVM)
-void vfio_device_get_kvm_safe(struct vfio_device *device, struct kvm *kvm)
+void vfio_device_get_kvm(struct vfio_device *device, struct file *kvm)
{
- void (*pfn)(struct kvm *kvm);
- bool (*fn)(struct kvm *kvm);
- bool ret;
-
lockdep_assert_held(&device->dev_set->lock);
if (!kvm)
return;
- pfn = symbol_get(kvm_put_kvm);
- if (WARN_ON(!pfn))
- return;
-
- fn = symbol_get(kvm_get_kvm_safe);
- if (WARN_ON(!fn)) {
- symbol_put(kvm_put_kvm);
- return;
- }
-
- ret = fn(kvm);
- symbol_put(kvm_get_kvm_safe);
- if (!ret) {
- symbol_put(kvm_put_kvm);
- return;
- }
-
- device->put_kvm = pfn;
- device->kvm = kvm;
+ device->kvm = get_file(kvm);
}
void vfio_device_put_kvm(struct vfio_device *device)
@@ -511,14 +489,7 @@ void vfio_device_put_kvm(struct vfio_device *device)
if (!device->kvm)
return;
- if (WARN_ON(!device->put_kvm))
- goto clear;
-
- device->put_kvm(device->kvm);
- device->put_kvm = NULL;
- symbol_put(kvm_put_kvm);
-
-clear:
+ fput(device->kvm);
device->kvm = NULL;
}
#endif
@@ -1544,9 +1515,13 @@ bool vfio_file_enforced_coherent(struct file *file)
}
EXPORT_SYMBOL_GPL(vfio_file_enforced_coherent);
-static void vfio_device_file_set_kvm(struct file *file, struct kvm *kvm)
+static void vfio_device_file_set_kvm(struct file *file, struct file *kvm)
{
struct vfio_device_file *df = file->private_data;
+ struct file *old;
+
+ if (kvm)
+ get_file(kvm);
/*
* The kvm is first recorded in the vfio_device_file, and will
@@ -1554,28 +1529,32 @@ static void vfio_device_file_set_kvm(struct file *file, struct kvm *kvm)
* iommufd successfully in the vfio device cdev path.
*/
spin_lock(&df->kvm_ref_lock);
+ old = df->kvm;
df->kvm = kvm;
spin_unlock(&df->kvm_ref_lock);
+
+ if (old)
+ fput(old);
}
/**
* vfio_file_set_kvm - Link a kvm with VFIO drivers
- * @file: VFIO group file or VFIO device file
- * @kvm: KVM to link
+ * @vfio_file: VFIO group file or VFIO device file
+ * @kvm: KVM file to link
*
* When a VFIO device is first opened the KVM will be available in
* device->kvm if one was associated with the file.
*/
-void vfio_file_set_kvm(struct file *file, struct kvm *kvm)
+void vfio_file_set_kvm(struct file *vfio_file, struct file *kvm)
{
struct vfio_group *group;
- group = vfio_group_from_file(file);
+ group = vfio_group_from_file(vfio_file);
if (group)
vfio_group_set_kvm(group, kvm);
- if (vfio_device_from_file(file))
- vfio_device_file_set_kvm(file, kvm);
+ if (vfio_device_from_file(vfio_file))
+ vfio_device_file_set_kvm(vfio_file, kvm);
}
EXPORT_SYMBOL_GPL(vfio_file_set_kvm);
diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index 45f08986359e..0cc91c6f96d2 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -54,7 +54,7 @@ struct vfio_device {
struct list_head dev_set_list;
unsigned int migration_flags;
u8 precopy_info_v2;
- struct kvm *kvm;
+ struct file *kvm;
/* Members below here are private, not for driver use */
unsigned int index;
@@ -66,7 +66,6 @@ struct vfio_device {
unsigned int open_count;
struct completion comp;
struct iommufd_access *iommufd_access;
- void (*put_kvm)(struct kvm *kvm);
struct inode *inode;
#if IS_ENABLED(CONFIG_IOMMUFD)
struct iommufd_device *iommufd_device;
@@ -378,7 +377,7 @@ static inline bool vfio_file_has_dev(struct file *file, struct vfio_device *devi
#endif
bool vfio_file_is_valid(struct file *file);
bool vfio_file_enforced_coherent(struct file *file);
-void vfio_file_set_kvm(struct file *file, struct kvm *kvm);
+void vfio_file_set_kvm(struct file *vfio_file, struct file *kvm);
#define VFIO_PIN_PAGES_MAX_ENTRIES (PAGE_SIZE/sizeof(unsigned long))
diff --git a/virt/kvm/vfio.c b/virt/kvm/vfio.c
index 6cdc4e9a333a..19548a430942 100644
--- a/virt/kvm/vfio.c
+++ b/virt/kvm/vfio.c
@@ -35,15 +35,15 @@ struct kvm_vfio {
bool noncoherent;
};
-static void kvm_vfio_file_set_kvm(struct file *file, struct kvm *kvm)
+static void kvm_vfio_file_set_kvm(struct file *vfio_file, struct file *kvm)
{
- void (*fn)(struct file *file, struct kvm *kvm);
+ void (*fn)(struct file *vfio_file, struct file *kvm);
fn = symbol_get(vfio_file_set_kvm);
if (!fn)
return;
- fn(file, kvm);
+ fn(vfio_file, kvm);
symbol_put(vfio_file_set_kvm);
}
@@ -144,6 +144,7 @@ static int kvm_vfio_file_add(struct kvm_device *dev, unsigned int fd)
{
struct kvm_vfio *kv = dev->private;
struct kvm_vfio_file *kvf;
+ struct file *kvm_file __free(fput) = NULL;
struct file *filp __free(fput) = NULL;
filp = fget(fd);
@@ -154,6 +155,10 @@ static int kvm_vfio_file_add(struct kvm_device *dev, unsigned int fd)
if (!kvm_vfio_file_is_valid(filp))
return -EINVAL;
+ kvm_file = get_file_active(&dev->kvm->file);
+ if (!kvm_file)
+ return -ENOENT;
+
guard(mutex)(&kv->lock);
list_for_each_entry(kvf, &kv->file_list, node) {
@@ -168,7 +173,7 @@ static int kvm_vfio_file_add(struct kvm_device *dev, unsigned int fd)
kvf->file = get_file(filp);
list_add_tail(&kvf->node, &kv->file_list);
- kvm_vfio_file_set_kvm(kvf->file, dev->kvm);
+ kvm_vfio_file_set_kvm(kvf->file, kvm_file);
kvm_vfio_update_coherency(dev);
return 0;
--
2.53.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [GIT PULL 5/6] KVM: Restrict kvm_get_kvm/kvm_put_kvm export to internal KVM modules
2026-10-09 14:27 [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
` (3 preceding siblings ...)
2026-10-09 14:27 ` [GIT PULL 4/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
@ 2026-10-09 14:27 ` Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 6/6] KVM: Remove unused file_is_kvm Christian Borntraeger
2026-10-09 16:30 ` [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Paolo Bonzini
6 siblings, 0 replies; 8+ messages in thread
From: Christian Borntraeger @ 2026-10-09 14:27 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, Janosch Frank, Claudio Imbrenda, David Hildenbrand,
linux-s390, Christian Borntraeger, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Eric Farman, Sean Christopherson, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin,
Matthew Rosato, Farhan Ali, Tony Krowiak, Halil Pasic,
Jason Herne, Harald Freudenberger, Holger Dengler,
Alex Williamson, linux-kernel, Steffen Eiden, Jason Gunthorpe
From: Steffen Eiden <seiden@linux.ibm.com>
Switch kvm_get_kvm, kvm_get_kvm_safe, and kvm_put_kvm from
EXPORT_SYMBOL_GPL to EXPORT_SYMBOL_FOR_KVM_INTERNAL. These symbols are
now only used within KVM itself. No external module needs them now that
VFIO uses file-based reference counting. Remove the corresponding
exemptions from the x86 KVM Makefile exports check.
Suggested-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
---
arch/x86/kvm/Makefile | 5 +----
virt/kvm/kvm_main.c | 6 +++---
2 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/arch/x86/kvm/Makefile b/arch/x86/kvm/Makefile
index e6d395ede9e2..c6bf463f5032 100644
--- a/arch/x86/kvm/Makefile
+++ b/arch/x86/kvm/Makefile
@@ -61,10 +61,7 @@ exports_grep_trailer := --include='*.[ch]' -nrw $(srctree)/virt/kvm $(srctree)/a
-e kvm_page_track_unregister_notifier \
-e kvm_write_track_add_gfn \
-e kvm_write_track_remove_gfn \
- -e kvm_file_to_kvm_fn \
- -e kvm_get_kvm \
- -e kvm_get_kvm_safe \
- -e kvm_put_kvm
+ -e kvm_file_to_kvm_fn
# Force grep to emit a goofy group separator that can in turn be replaced with
# the above newline macro (newlines in Make are a nightmare). Note, grep only
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index bab71d398236..891a67cb365a 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1314,7 +1314,7 @@ void kvm_get_kvm(struct kvm *kvm)
{
refcount_inc(&kvm->users_count);
}
-EXPORT_SYMBOL_GPL(kvm_get_kvm);
+EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_get_kvm);
/*
* Make sure the vm is not during destruction, which is a safe version of
@@ -1324,14 +1324,14 @@ bool kvm_get_kvm_safe(struct kvm *kvm)
{
return refcount_inc_not_zero(&kvm->users_count);
}
-EXPORT_SYMBOL_GPL(kvm_get_kvm_safe);
+EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_get_kvm_safe);
void kvm_put_kvm(struct kvm *kvm)
{
if (refcount_dec_and_test(&kvm->users_count))
kvm_destroy_vm(kvm);
}
-EXPORT_SYMBOL_GPL(kvm_put_kvm);
+EXPORT_SYMBOL_FOR_KVM_INTERNAL(kvm_put_kvm);
/*
* Used to put a reference that was taken on behalf of an object associated
--
2.53.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [GIT PULL 6/6] KVM: Remove unused file_is_kvm
2026-10-09 14:27 [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
` (4 preceding siblings ...)
2026-10-09 14:27 ` [GIT PULL 5/6] KVM: Restrict kvm_get_kvm/kvm_put_kvm export to internal KVM modules Christian Borntraeger
@ 2026-10-09 14:27 ` Christian Borntraeger
2026-10-09 16:30 ` [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Paolo Bonzini
6 siblings, 0 replies; 8+ messages in thread
From: Christian Borntraeger @ 2026-10-09 14:27 UTC (permalink / raw)
To: Paolo Bonzini
Cc: KVM, Janosch Frank, Claudio Imbrenda, David Hildenbrand,
linux-s390, Christian Borntraeger, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Eric Farman, Sean Christopherson, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin,
Matthew Rosato, Farhan Ali, Tony Krowiak, Halil Pasic,
Jason Herne, Harald Freudenberger, Holger Dengler,
Alex Williamson, linux-kernel, Steffen Eiden, Jason Gunthorpe
From: Steffen Eiden <seiden@linux.ibm.com>
Remove the now unused file_is_kvm function.
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Acked-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
---
include/linux/kvm_host.h | 1 -
virt/kvm/kvm_main.c | 6 ------
2 files changed, 7 deletions(-)
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index 943b108f01cd..b6a1f4312a73 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -1087,7 +1087,6 @@ void kvm_exit(void);
void kvm_get_kvm(struct kvm *kvm);
bool kvm_get_kvm_safe(struct kvm *kvm);
void kvm_put_kvm(struct kvm *kvm);
-bool file_is_kvm(struct file *file);
/*
* Architectures define kvm_file_to_kvm_arch to <arch>
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 891a67cb365a..563e7b0becc3 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -5492,12 +5492,6 @@ static struct file_operations kvm_vm_fops = {
KVM_COMPAT(kvm_vm_compat_ioctl),
};
-bool file_is_kvm(struct file *file)
-{
- return file && file->f_op == &kvm_vm_fops;
-}
-EXPORT_SYMBOL_FOR_KVM_INTERNAL(file_is_kvm);
-
#ifdef kvm_file_to_kvm_arch
struct kvm *kvm_file_to_kvm_fn(struct file *file)
{
--
2.53.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM
2026-10-09 14:27 [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
` (5 preceding siblings ...)
2026-10-09 14:27 ` [GIT PULL 6/6] KVM: Remove unused file_is_kvm Christian Borntraeger
@ 2026-10-09 16:30 ` Paolo Bonzini
6 siblings, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2026-10-09 16:30 UTC (permalink / raw)
To: Christian Borntraeger
Cc: KVM, Janosch Frank, Claudio Imbrenda, David Hildenbrand,
linux-s390, Heiko Carstens, Vasily Gorbik, Alexander Gordeev,
Sven Schnelle, Christoph Schlameuss, Eric Farman,
Sean Christopherson, Thomas Gleixner, Ingo Molnar,
Borislav Petkov, Dave Hansen, x86, H . Peter Anvin,
Matthew Rosato, Farhan Ali, Tony Krowiak, Halil Pasic,
Jason Herne, Harald Freudenberger, Holger Dengler,
Alex Williamson, linux-kernel, Steffen Eiden, Jason Gunthorpe
On Fri, Oct 9, 2026 at 4:28 PM Christian Borntraeger
<borntraeger@linux.ibm.com> wrote:
>
>
> Paolo,
>
> The following changes since commit df2908090cda368b01ff43709f51890076c56157:
>
> Linux 7.3-rc2 (2026-09-06 15:07:20 -0700)
>
> are available in the Git repository at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git tags/kvm-s390-next-7.4-1
>
> for you to fetch changes up to c22295d0d75f5590fdde5493cb90e2d50d5f508e:
>
> KVM: Remove unused file_is_kvm (2026-10-02 10:40:01 +0200)
Pulled, thanks.
Paolo
>
> The tag points to the vfio_file_reference branch of the kvms390 repo
> https://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git/log/?h=vfio_file_reference
>
>
>
> ----------------------------------------------------------------
> KVM/vfio: Use file-based reference counting for KVM
>
> This series switches the KVM-VFIO interface and external consumers over to
> standard file-based reference counting, eliminating all external KVM symbol
> exports.
>
> 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 Eiden (6):
> 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
> KVM: Remove unused file_is_kvm
>
> 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 | 10 +++---
> 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/device_cdev.c | 2 +-
> drivers/vfio/group.c | 13 ++++++--
> drivers/vfio/vfio.h | 14 ++++-----
> drivers/vfio/vfio_main.c | 57 +++++++++++------------------------
> include/linux/kvm_host.h | 19 +++++++++++-
> include/linux/vfio.h | 5 ++-
> virt/kvm/kvm_main.c | 21 +++++++++----
> virt/kvm/vfio.c | 13 +++++---
> 16 files changed, 132 insertions(+), 91 deletions(-)
>
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-10-09 16:31 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-09 14:27 [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 1/6] KVM: Introduce file_to_kvm_<arch>() infrastructure Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 2/6] KVM: Add file back-pointer to struct kvm Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 3/6] KVM: x86: Use file_to_kvm_x86() in SEV Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 4/6] KVM/vfio: Use file-based reference counting for KVM Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 5/6] KVM: Restrict kvm_get_kvm/kvm_put_kvm export to internal KVM modules Christian Borntraeger
2026-10-09 14:27 ` [GIT PULL 6/6] KVM: Remove unused file_is_kvm Christian Borntraeger
2026-10-09 16:30 ` [GIT PULL 0/6] KVM/vfio: Use file-based reference counting for KVM Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®