Skip to content

Commit

Permalink
vfio: Remove vfio_external_group_match_file()
Browse files Browse the repository at this point in the history
vfio_group_fops_open() ensures there is only ever one struct file open for
any struct vfio_group at any time:

	/* Do we need multiple instances of the group open?  Seems not. */
	opened = atomic_cmpxchg(&group->opened, 0, 1);
	if (opened) {
		vfio_group_put(group);
		return -EBUSY;

Therefor the struct file * can be used directly to search the list of VFIO
groups that KVM keeps instead of using the
vfio_external_group_match_file() callback to try to figure out if the
passed in FD matches the list or not.

Delete vfio_external_group_match_file().

Reviewed-by: Kevin Tian <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Reviewed-by: Yi Liu <[email protected]>
Signed-off-by: Jason Gunthorpe <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Alex Williamson <[email protected]>
  • Loading branch information
jgunthorpe authored and awilliam committed May 13, 2022
1 parent 50d63b5 commit c38ff5b
Show file tree
Hide file tree
Showing 3 changed files with 1 addition and 29 deletions.
9 changes: 0 additions & 9 deletions drivers/vfio/vfio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1685,15 +1685,6 @@ void vfio_group_put_external_user(struct vfio_group *group)
}
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);

/**
* vfio_file_iommu_group - Return the struct iommu_group for the vfio group file
* @file: VFIO group file
Expand Down
2 changes: 0 additions & 2 deletions include/linux/vfio.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,8 +138,6 @@ int vfio_mig_get_next_state(struct vfio_device *device,
*/
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 struct iommu_group *vfio_file_iommu_group(struct file *file);
extern long vfio_external_check_extension(struct vfio_group *group,
unsigned long arg);
Expand Down
19 changes: 1 addition & 18 deletions virt/kvm/vfio.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,22 +49,6 @@ static struct vfio_group *kvm_vfio_group_get_external_user(struct file *filep)
return 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 *);
Expand Down Expand Up @@ -239,8 +223,7 @@ static int kvm_vfio_group_del(struct kvm_device *dev, unsigned int fd)
mutex_lock(&kv->lock);

list_for_each_entry(kvg, &kv->group_list, node) {
if (!kvm_vfio_external_group_match_file(kvg->vfio_group,
f.file))
if (kvg->file != f.file)
continue;

list_del(&kvg->node);
Expand Down

0 comments on commit c38ff5b

Please sign in to comment.