Patch "vfio: New external user group/file match" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
vfio: New external user group/file match
to the 4.9-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-new-external-user-group-file-match.patch
and it can be found in the queue-4.9 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
5d6dee80a1e94cc284d03e06d930e60e8d3ecf7dMon Sep 17 00:00:00 2001
From: Alex Williamson <[email protected]>
Date: Wed, 28 Jun 2017 13:50:05 -0600
Subject: vfio: New external user group/file match
From: Alex Williamson <[email protected]>
commit 5d6dee80a1e94cc284d03e06d930e60e8d3ecf7d upstream.
At the point where the kvm-vfio pseudo device wants to release its vfio group reference, we can't always acquire a new reference to make that happen. The group can be in a state where we wouldn't allow a new reference to be added. This new helper function allows a caller to match a file to a group to facilitate this. Given a file and group, report if they match. Thus the caller needs to already have a group reference to match to the file. This allows the deletion of a group without acquiring a new reference.
--- drivers/vfio/vfio.c | 9 +++++++++ include/linux/vfio.h | 2 ++ virt/kvm/vfio.c | 27 +++++++++++++++++++-------- 3 files changed, 30 insertions(+), 8 deletions(-)
drivers/vfio/vfio.c +9 -0
@@ -1751,6 +1751,15 @@ void vfio_group_put_external_user(struct }EXPORT_SYMBOL_GPL (vfio_group_put_external_user); +bool vfio_external_group_match_file (struct vfio_group *test_group, +struct file *filep) +{ +struct vfio_group *group = filep->private_data; + +return (filep->f_op == &vfio_group_fops) && (group == test_group); +} +EXPORT_SYMBOL_GPL (vfio_external_group_match_file); +int vfio_external_user_iommu_id (struct vfio_group *group) {return iommu_group_id (group->iommu_group);
include/linux/vfio.h +2 -0
@@ -88,6 +88,8 @@ extern void vfio_unregister_iommu_driver*/ extern struct vfio_group *vfio_group_get_external_user (struct file *filep);extern void vfio_group_put_external_user (struct vfio_group *group); +extern bool vfio_external_group_match_file (struct vfio_group *group, +struct file *filep);extern int vfio_external_user_iommu_id (struct vfio_group *group);extern long vfio_external_check_extension (struct vfio_group *group,unsigned long arg);
virt/kvm/vfio.c +19 -8
@@ -47,6 +47,22 @@ static struct vfio_group *kvm_vfio_groupreturn vfio_group; } +static bool kvm_vfio_external_group_match_file (struct vfio_group *group, +struct file *filep) +{ +bool ret, (*fn)(struct vfio_group *,struct file *); + + fn =symbol_get (vfio_external_group_match_file); +if (!fn) +return false; + + ret =fn (group, filep); + +symbol_put (vfio_external_group_match_file); + +return ret; +} +static void kvm_vfio_group_put_external_user (struct vfio_group *vfio_group) {void (*fn)(struct vfio_group *);
@@ -171,18 +187,13 @@ static int kvm_vfio_set_group(struct kvmif (!f.file)return -EBADF ; - vfio_group =kvm_vfio_group_get_external_user (f.file); -fdput (f); - -if (IS_ERR (vfio_group)) -return PTR_ERR (vfio_group); - ret = -ENOENT ;mutex_lock (&kv->lock);list_for_each_entry (kvg, &kv->group_list, node) { -if (kvg->vfio_group != vfio_group) +if (!kvm_vfio_external_group_match_file (kvg->vfio_group, + f.file))continue ;list_del (&kvg->node);
@@ -196,7 +207,7 @@ static int kvm_vfio_set_group(struct kvmmutex_unlock (&kv->lock); -kvm_vfio_group_put_external_user (vfio_group); +fdput (f);kvm_vfio_update_coherency (dev);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/vfio-new-external-user-group-file-match.patch queue-4.9/vfio-fix-group-release-deadlock.patch