Make it (more) abstract From: Alex Williamson --- drivers/vfio/pci/vfio_pci.c | 10 +++++----- drivers/vfio/pci/vfio_pci_common.c | 17 +++++++++++++++-- include/linux/vfio_pci_common.h | 4 +++- samples/vfio-mdev-pci/vfio_mdev_pci.c | 10 +++++----- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index 704766714c11..1e9d6e4e9c81 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c @@ -58,14 +58,14 @@ static void vfio_pci_release(void *device_data) { struct vfio_pci_device *vdev = device_data; - mutex_lock(&vdev->reflck->lock); + vfio_pci_reflck_lock(vdev); if (!(--vdev->refcnt)) { vfio_spapr_pci_eeh_release(vdev->pdev); vfio_pci_disable(vdev); } - mutex_unlock(&vdev->reflck->lock); + vfio_pci_reflck_unlock(vdev); module_put(THIS_MODULE); } @@ -80,7 +80,7 @@ static int vfio_pci_open(void *device_data) vfio_pci_refresh_config(vdev, nointxmask, disable_idle_d3); - mutex_lock(&vdev->reflck->lock); + vfio_pci_reflck_lock(vdev); if (!vdev->refcnt) { ret = vfio_pci_enable(vdev); @@ -91,7 +91,7 @@ static int vfio_pci_open(void *device_data) } vdev->refcnt++; error: - mutex_unlock(&vdev->reflck->lock); + vfio_pci_reflck_unlock(vdev); if (ret) module_put(THIS_MODULE); return ret; @@ -200,7 +200,7 @@ static void vfio_pci_remove(struct pci_dev *pdev) if (!vdev) return; - vfio_pci_reflck_put(vdev->reflck); + vfio_pci_reflck_put(vdev); vfio_iommu_group_put(pdev->dev.iommu_group, &pdev->dev); kfree(vdev->region); diff --git a/drivers/vfio/pci/vfio_pci_common.c b/drivers/vfio/pci/vfio_pci_common.c index edda7e4dc2e7..c0462799fc8d 100644 --- a/drivers/vfio/pci/vfio_pci_common.c +++ b/drivers/vfio/pci/vfio_pci_common.c @@ -1258,6 +1258,18 @@ EXPORT_SYMBOL_GPL(vfio_pci_err_handlers); static DEFINE_MUTEX(reflck_lock); +void vfio_pci_reflck_lock(struct vfio_pci_device *vdev) +{ + mutex_lock(&vdev->reflck->lock); +} +EXPORT_SYMBOL(vfio_pci_reflck_lock); + +void vfio_pci_reflck_unlock(struct vfio_pci_device *vdev) +{ + mutex_unlock(&vdev->reflck->lock); +} +EXPORT_SYMBOL(vfio_pci_reflck_unlock); + static struct vfio_pci_reflck *vfio_pci_reflck_alloc(void) { struct vfio_pci_reflck *reflck; @@ -1333,9 +1345,10 @@ static void vfio_pci_reflck_release(struct kref *kref) mutex_unlock(&reflck_lock); } -void vfio_pci_reflck_put(struct vfio_pci_reflck *reflck) +void vfio_pci_reflck_put(struct vfio_pci_device *vdev) { - kref_put_mutex(&reflck->kref, vfio_pci_reflck_release, &reflck_lock); + kref_put_mutex(&vdev->reflck->kref, + vfio_pci_reflck_release, &reflck_lock); } EXPORT_SYMBOL_GPL(vfio_pci_reflck_put); diff --git a/include/linux/vfio_pci_common.h b/include/linux/vfio_pci_common.h index fa572d388111..8090d5469183 100644 --- a/include/linux/vfio_pci_common.h +++ b/include/linux/vfio_pci_common.h @@ -120,8 +120,10 @@ extern ssize_t vfio_pci_write(void *device_data, const char __user *buf, extern int vfio_pci_mmap(void *device_data, struct vm_area_struct *vma); extern void vfio_pci_request(void *device_data, unsigned int count); extern void vfio_pci_fill_ids(char *ids, struct pci_driver *driver); +extern void vfio_pci_reflck_lock(struct vfio_pci_device *vdev); +extern void vfio_pci_reflck_unlock(struct vfio_pci_device *vdev); extern int vfio_pci_reflck_attach(struct vfio_pci_device *vdev); -extern void vfio_pci_reflck_put(struct vfio_pci_reflck *reflck); +extern void vfio_pci_reflck_put(struct vfio_pci_device *vdev); extern void vfio_pci_probe_power_state(struct vfio_pci_device *vdev); #endif /* VFIO_PCI_COMMON_H */ diff --git a/samples/vfio-mdev-pci/vfio_mdev_pci.c b/samples/vfio-mdev-pci/vfio_mdev_pci.c index b180356bb4ee..c98328cb4e3f 100644 --- a/samples/vfio-mdev-pci/vfio_mdev_pci.c +++ b/samples/vfio-mdev-pci/vfio_mdev_pci.c @@ -164,7 +164,7 @@ static int vfio_mdev_pci_open(struct mdev_device *mdev) vfio_pci_refresh_config(vdev, nointxmask, disable_idle_d3); - mutex_lock(&vdev->reflck->lock); + vfio_pci_reflck_lock(vdev); if (!vdev->refcnt) { ret = vfio_pci_enable(vdev); @@ -175,7 +175,7 @@ static int vfio_mdev_pci_open(struct mdev_device *mdev) } vdev->refcnt++; error: - mutex_unlock(&vdev->reflck->lock); + vfio_pci_reflck_unlock(vdev); if (!ret) pr_info("Succeeded to open mdev: %s on pf: %s\n", dev_name(mdev_dev(mdev)), dev_name(&pmdev->vdev->pdev->dev)); @@ -195,14 +195,14 @@ static void vfio_mdev_pci_release(struct mdev_device *mdev) pr_info("Release mdev: %s on pf: %s\n", dev_name(mdev_dev(mdev)), dev_name(&pmdev->vdev->pdev->dev)); - mutex_lock(&vdev->reflck->lock); + vfio_pci_reflck_lock(vdev); if (!(--vdev->refcnt)) { vfio_spapr_pci_eeh_release(vdev->pdev); vfio_pci_disable(vdev); } - mutex_unlock(&vdev->reflck->lock); + vfio_pci_reflck_unlock(vdev); module_put(THIS_MODULE); } @@ -341,7 +341,7 @@ static void vfio_mdev_pci_driver_remove(struct pci_dev *pdev) if (!vdev) return; - vfio_pci_reflck_put(vdev->reflck); + vfio_pci_reflck_put(vdev); kfree(vdev->region); mutex_destroy(&vdev->ioeventfds_lock);