]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
vfio: Remove device debugfs before releasing devres
authorAlex Williamson <alex.williamson@nvidia.com>
Mon, 15 Jun 2026 20:47:00 +0000 (14:47 -0600)
committerAlex Williamson <alex@shazbot.org>
Mon, 29 Jun 2026 20:26:28 +0000 (14:26 -0600)
VFIO device debugfs files created with debugfs_create_devm_seqfile()
store a devres allocated debugfs_devm_entry as inode private data.
vfio_unregister_group_dev() currently calls vfio_device_del() before
vfio_device_debugfs_exit(), but device_del() releases devres.  This can
leave debugfs entries visible with stale inode private data while
unregister waits for userspace references to drain.

Remove the per-device debugfs tree before vfio_device_del().  The debugfs
view is diagnostic only, so losing it at the start of unregister is
preferable to preserving entries whose backing storage may already have
been released.

Complete the teardown by clearing the per-device debugfs root after
removal.  This matches the global debugfs root cleanup and prevents
future users from mistaking a removed dentry for a live debugfs tree
during the remainder of unregister.

Fixes: 2202844e4468 ("vfio/migration: Add debugfs to live migration driver")
Reported-by: Sashiko AI Review <sashiko-bot@kernel.org>
Link: https://lore.kernel.org/r/20260615192725.6A2221F000E9@smtp.kernel.org
Cc: stable@vger.kernel.org
Cc: Longfang Liu <liulongfang@huawei.com>
Assisted-by: OpenAI Codex:gpt-5
Signed-off-by: Alex Williamson <alex.williamson@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/20260615204717.735302-1-alex.williamson@nvidia.com
Signed-off-by: Alex Williamson <alex@shazbot.org>
drivers/vfio/debugfs.c
drivers/vfio/vfio_main.c

index 8b0ca7a09064072b3d489dab8072dbb1a2871d10..8a2f1b0cce3f149b6e769853bb2b58325e1e3975 100644 (file)
@@ -97,6 +97,7 @@ void vfio_device_debugfs_init(struct vfio_device *vdev)
 void vfio_device_debugfs_exit(struct vfio_device *vdev)
 {
        debugfs_remove_recursive(vdev->debug_root);
+       vdev->debug_root = NULL;
 }
 
 void vfio_debugfs_create_root(void)
index 5e0422014523e66626f6c7158319b5d41772459f..ed538aebb0b8e4fccfb169f292cfb805170661d8 100644 (file)
@@ -406,6 +406,13 @@ void vfio_unregister_group_dev(struct vfio_device *device)
         */
        vfio_device_group_unregister(device);
 
+       /*
+        * Remove debugfs before device_del(), which releases devres.  Some
+        * debugfs entries are created with debugfs_create_devm_seqfile() and
+        * therefore rely on devres-managed inode private data.
+        */
+       vfio_device_debugfs_exit(device);
+
        /*
         * Balances vfio_device_add() in register path, also prevents
         * new device opened by userspace in the cdev path.
@@ -435,7 +442,6 @@ void vfio_unregister_group_dev(struct vfio_device *device)
                }
        }
 
-       vfio_device_debugfs_exit(device);
        /* Balances vfio_device_set_group in register path */
        vfio_device_remove_group(device);
 }