]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: VFIO: deduplicate file release logic
authorCarlos López <clopez@suse.de>
Fri, 13 Mar 2026 12:20:41 +0000 (13:20 +0100)
committerSean Christopherson <seanjc@google.com>
Wed, 13 May 2026 18:12:39 +0000 (11:12 -0700)
There are two callsites which destroy files in kv->file_list: the
function servicing KVM_DEV_VFIO_FILE_DEL, and the relase of the whole
KVM VFIO device. The process involves several steps, so move all those
into a single function, removing duplicate code.

Signed-off-by: Carlos López <clopez@suse.de>
Reviewed-by: Alex Williamson <alex@shazbot.org>
Link: https://patch.msgid.link/20260313122040.1413091-6-clopez@suse.de
Signed-off-by: Sean Christopherson <seanjc@google.com>
virt/kvm/vfio.c

index e0d621567dbf6ee7bc05b7e19d3411561a6e0069..2fee1e82f8f687f2fd5bfd0d2a50c7e3271e45bd 100644 (file)
@@ -174,6 +174,17 @@ static int kvm_vfio_file_add(struct kvm_device *dev, unsigned int fd)
        return 0;
 }
 
+static void kvm_vfio_file_free(struct kvm_device *dev, struct kvm_vfio_file *kvf)
+{
+#ifdef CONFIG_SPAPR_TCE_IOMMU
+       kvm_spapr_tce_release_vfio_group(dev->kvm, kvf);
+#endif
+       kvm_vfio_file_set_kvm(kvf->file, NULL);
+       fput(kvf->file);
+       list_del(&kvf->node);
+       kfree(kvf);
+}
+
 static int kvm_vfio_file_del(struct kvm_device *dev, unsigned int fd)
 {
        struct kvm_vfio *kv = dev->private;
@@ -189,18 +200,11 @@ static int kvm_vfio_file_del(struct kvm_device *dev, unsigned int fd)
        mutex_lock(&kv->lock);
 
        list_for_each_entry(kvf, &kv->file_list, node) {
-               if (kvf->file != fd_file(f))
-                       continue;
-
-               list_del(&kvf->node);
-#ifdef CONFIG_SPAPR_TCE_IOMMU
-               kvm_spapr_tce_release_vfio_group(dev->kvm, kvf);
-#endif
-               kvm_vfio_file_set_kvm(kvf->file, NULL);
-               fput(kvf->file);
-               kfree(kvf);
-               ret = 0;
-               break;
+               if (kvf->file == fd_file(f)) {
+                       kvm_vfio_file_free(dev, kvf);
+                       ret = 0;
+                       break;
+               }
        }
 
        kvm_vfio_update_coherency(dev);
@@ -307,15 +311,8 @@ static void kvm_vfio_release(struct kvm_device *dev)
        struct kvm_vfio *kv = dev->private;
        struct kvm_vfio_file *kvf, *tmp;
 
-       list_for_each_entry_safe(kvf, tmp, &kv->file_list, node) {
-#ifdef CONFIG_SPAPR_TCE_IOMMU
-               kvm_spapr_tce_release_vfio_group(dev->kvm, kvf);
-#endif
-               kvm_vfio_file_set_kvm(kvf->file, NULL);
-               fput(kvf->file);
-               list_del(&kvf->node);
-               kfree(kvf);
-       }
+       list_for_each_entry_safe(kvf, tmp, &kv->file_list, node)
+               kvm_vfio_file_free(dev, kvf);
 
        kvm_vfio_update_coherency(dev);