Patch "vfio: Fix group release deadlock" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
vfio: Fix group release deadlock
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
vfio-fix-group-release-deadlock.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
811642d8d8a82c0cce8dc2debfdaf23c5a144839Mon Sep 17 00:00:00 2001
From: Alex Williamson <[email protected]>
Date: Mon, 19 Jun 2017 09:10:32 -0600
Subject: vfio: Fix group release deadlock
From: Alex Williamson <[email protected]>
commit 811642d8d8a82c0cce8dc2debfdaf23c5a144839 upstream.
If vfio_iommu_group_notifier() acquires a group reference and that reference becomes the last reference to the group, then vfio_group_put introduces a deadlock code path where we're trying to unregister from the iommu notifier chain from within a callout of that chain. Use a work_struct to release this reference asynchronously.
--- drivers/vfio/vfio.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-)
drivers/vfio/vfio.c +36 -1
@@ -296,6 +296,34 @@ static void vfio_group_put(struct vfio_gkref_put_mutex (&group->kref, vfio_group_release, &vfio.group_lock); } +struct vfio_group_put_work { +struct work_struct work; +struct vfio_group *group; +}; + +static void vfio_group_put_bg (struct work_struct *work) +{ +struct vfio_group_put_work *do_work; + + do_work = container_of(work, struct vfio_group_put_work, work); + +vfio_group_put (do_work->group); +kfree (do_work); +} + +static void vfio_group_schedule_put (struct vfio_group *group) +{ +struct vfio_group_put_work *do_work; + + do_work =kmalloc (sizeof (*do_work),GFP_KERNEL ); +if (WARN_ON (!do_work)) +return ; + +INIT_WORK (&do_work->work, vfio_group_put_bg); + do_work->group = group; +schedule_work (&do_work->work); +} +/* Assume group_lock or group reference is held */ static void vfio_group_get (struct vfio_group *group) {
@@ -620,7 +648,14 @@ static int vfio_iommu_group_notifier(strbreak ; } -vfio_group_put (group); +/* +* If we're the last reference to the group, the group will be +* released, which includes unregistering the iommu group notifier. +* We hold a read-lock on that notifier list, unregistering needs +* a write-lock... deadlock. Release our reference asynchronously +* to avoid that situation. +*/ +vfio_group_schedule_put (group);return NOTIFY_OK ; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/vfio-new-external-user-group-file-match.patch queue-4.4/vfio-fix-group-release-deadlock.patch