From: Diana Craciun <diana.craciun@oss.nxp.com>
To: alex.williamson@redhat.com, kvm@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, laurentiu.tudor@nxp.com,
bharatb.linux@gmail.com, Diana Craciun <diana.craciun@nxp.com>
Subject: [PATCH v2 6/9] vfio/fsl-mc: Added lock support in preparation for interrupt handling
Date: Fri, 8 May 2020 10:20:36 +0300 [thread overview]
Message-ID: <20200508072039.18146-7-diana.craciun@oss.nxp.com> (raw)
In-Reply-To: <20200508072039.18146-1-diana.craciun@oss.nxp.com>
From: Diana Craciun <diana.craciun@nxp.com>
Only the DPRC object allocates interrupts from the MSI
interrupt domain. The interrupts are managed by the DPRC in
a pool of interrupts. The access to this pool of interrupts
has to be protected with a lock.
This patch extends the current lock implementation to have a
lock per DPRC.
Signed-off-by: Diana Craciun <diana.craciun@nxp.com>
---
drivers/vfio/fsl-mc/vfio_fsl_mc.c | 90 +++++++++++++++++++++--
drivers/vfio/fsl-mc/vfio_fsl_mc_private.h | 8 +-
2 files changed, 91 insertions(+), 7 deletions(-)
diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc.c b/drivers/vfio/fsl-mc/vfio_fsl_mc.c
index a92c6c97c29a..3c43f52ca162 100644
--- a/drivers/vfio/fsl-mc/vfio_fsl_mc.c
+++ b/drivers/vfio/fsl-mc/vfio_fsl_mc.c
@@ -17,6 +17,76 @@
static struct fsl_mc_driver vfio_fsl_mc_driver;
+static DEFINE_MUTEX(reflck_lock);
+
+static void vfio_fsl_mc_reflck_get(struct vfio_fsl_mc_reflck *reflck)
+{
+ kref_get(&reflck->kref);
+}
+
+static void vfio_fsl_mc_reflck_release(struct kref *kref)
+{
+ struct vfio_fsl_mc_reflck *reflck = container_of(kref,
+ struct vfio_fsl_mc_reflck,
+ kref);
+
+ kfree(reflck);
+ mutex_unlock(&reflck_lock);
+}
+
+static void vfio_fsl_mc_reflck_put(struct vfio_fsl_mc_reflck *reflck)
+{
+ kref_put_mutex(&reflck->kref, vfio_fsl_mc_reflck_release, &reflck_lock);
+}
+
+static struct vfio_fsl_mc_reflck *vfio_fsl_mc_reflck_alloc(void)
+{
+ struct vfio_fsl_mc_reflck *reflck;
+
+ reflck = kzalloc(sizeof(*reflck), GFP_KERNEL);
+ if (!reflck)
+ return ERR_PTR(-ENOMEM);
+
+ kref_init(&reflck->kref);
+ mutex_init(&reflck->lock);
+
+ return reflck;
+}
+
+static int vfio_fsl_mc_reflck_attach(struct vfio_fsl_mc_device *vdev)
+{
+ int ret = 0;
+
+ mutex_lock(&reflck_lock);
+ if (is_fsl_mc_bus_dprc(vdev->mc_dev)) {
+ vdev->reflck = vfio_fsl_mc_reflck_alloc();
+ } else {
+ struct device *mc_cont_dev = vdev->mc_dev->dev.parent;
+ struct vfio_device *device;
+ struct vfio_fsl_mc_device *cont_vdev;
+
+ device = vfio_device_get_from_dev(mc_cont_dev);
+ if (!device) {
+ ret = -ENODEV;
+ goto unlock;
+ }
+
+ cont_vdev = vfio_device_data(device);
+ if (!cont_vdev->reflck) {
+ vfio_device_put(device);
+ ret = -ENODEV;
+ goto unlock;
+ }
+ vfio_fsl_mc_reflck_get(cont_vdev->reflck);
+ vdev->reflck = cont_vdev->reflck;
+ vfio_device_put(device);
+ }
+
+unlock:
+ mutex_unlock(&reflck_lock);
+ return ret;
+}
+
static int vfio_fsl_mc_regions_init(struct vfio_fsl_mc_device *vdev)
{
struct fsl_mc_device *mc_dev = vdev->mc_dev;
@@ -58,7 +128,7 @@ static int vfio_fsl_mc_open(void *device_data)
if (!try_module_get(THIS_MODULE))
return -ENODEV;
- mutex_lock(&vdev->driver_lock);
+ mutex_lock(&vdev->reflck->lock);
if (!vdev->refcnt) {
ret = vfio_fsl_mc_regions_init(vdev);
if (ret)
@@ -66,12 +136,12 @@ static int vfio_fsl_mc_open(void *device_data)
}
vdev->refcnt++;
- mutex_unlock(&vdev->driver_lock);
+ mutex_unlock(&vdev->reflck->lock);
return 0;
err_reg_init:
- mutex_unlock(&vdev->driver_lock);
+ mutex_unlock(&vdev->reflck->lock);
module_put(THIS_MODULE);
return ret;
}
@@ -80,12 +150,12 @@ static void vfio_fsl_mc_release(void *device_data)
{
struct vfio_fsl_mc_device *vdev = device_data;
- mutex_lock(&vdev->driver_lock);
+ mutex_lock(&vdev->reflck->lock);
if (!(--vdev->refcnt))
vfio_fsl_mc_regions_cleanup(vdev);
- mutex_unlock(&vdev->driver_lock);
+ mutex_unlock(&vdev->reflck->lock);
module_put(THIS_MODULE);
}
@@ -326,12 +396,18 @@ static int vfio_fsl_mc_probe(struct fsl_mc_device *mc_dev)
return ret;
}
+ ret = vfio_fsl_mc_reflck_attach(vdev);
+ if (ret) {
+ vfio_iommu_group_put(group, dev);
+ return ret;
+ }
+
ret = vfio_fsl_mc_init_device(vdev);
if (ret) {
+ vfio_fsl_mc_reflck_put(vdev->reflck);
vfio_iommu_group_put(group, dev);
return ret;
}
- mutex_init(&vdev->driver_lock);
return ret;
}
@@ -375,6 +451,8 @@ static int vfio_fsl_mc_remove(struct fsl_mc_device *mc_dev)
if (vdev->nb.notifier_call)
bus_unregister_notifier(&fsl_mc_bus_type, &vdev->nb);
+ vfio_fsl_mc_reflck_put(vdev->reflck);
+
if (is_fsl_mc_bus_dprc(mc_dev))
vfio_fsl_mc_cleanup_dprc(vdev->mc_dev);
diff --git a/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h b/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h
index 89d2e2a602d8..f34fe8721848 100644
--- a/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h
+++ b/drivers/vfio/fsl-mc/vfio_fsl_mc_private.h
@@ -17,6 +17,11 @@
#define VFIO_DPRC_REGION_CACHEABLE 0x00000001
+struct vfio_fsl_mc_reflck {
+ struct kref kref;
+ struct mutex lock;
+};
+
struct vfio_fsl_mc_region {
u32 flags;
u32 type;
@@ -30,7 +35,8 @@ struct vfio_fsl_mc_device {
int refcnt;
u32 num_regions;
struct vfio_fsl_mc_region *regions;
- struct mutex driver_lock;
+ struct vfio_fsl_mc_reflck *reflck;
+
};
#endif /* VFIO_FSL_MC_PRIVATE_H */
--
2.17.1
next prev parent reply other threads:[~2020-05-08 7:21 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-08 7:20 [PATCH v2 0/9] vfio/fsl-mc: VFIO support for FSL-MC devices Diana Craciun
2020-05-08 7:20 ` [PATCH v2 1/9] vfio/fsl-mc: Add VFIO framework skeleton for fsl-mc devices Diana Craciun
2020-05-08 7:20 ` [PATCH v2 2/9] vfio/fsl-mc: Scan DPRC objects on vfio-fsl-mc driver bind Diana Craciun
2020-05-08 22:49 ` kbuild test robot
2020-05-08 22:49 ` kbuild test robot
2020-06-02 4:12 ` Alex Williamson
2020-05-08 7:20 ` [PATCH v2 3/9] vfio/fsl-mc: Implement VFIO_DEVICE_GET_INFO ioctl Diana Craciun
2020-05-08 7:20 ` [PATCH v2 4/9] vfio/fsl-mc: Implement VFIO_DEVICE_GET_REGION_INFO ioctl call Diana Craciun
2020-06-02 4:12 ` Alex Williamson
2020-06-04 18:37 ` Diana Craciun OSS
2020-05-08 7:20 ` [PATCH v2 5/9] vfio/fsl-mc: Allow userspace to MMAP fsl-mc device MMIO regions Diana Craciun
2020-06-02 4:12 ` Alex Williamson
2020-06-04 18:41 ` Diana Craciun OSS
2020-05-08 7:20 ` Diana Craciun [this message]
2020-05-08 7:20 ` [PATCH v2 7/9] vfio/fsl-mc: Add irq infrastructure for fsl-mc devices Diana Craciun
2020-05-08 7:20 ` [PATCH v2 8/9] vfio/fsl-mc: trigger an interrupt via eventfd Diana Craciun
2020-05-08 23:50 ` kbuild test robot
2020-05-08 23:50 ` kbuild test robot
2020-05-08 7:20 ` [PATCH v2 9/9] vfio/fsl-mc: Add read/write support for fsl-mc devices Diana Craciun
2020-05-09 0:47 ` kbuild test robot
2020-05-09 0:47 ` kbuild test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200508072039.18146-7-diana.craciun@oss.nxp.com \
--to=diana.craciun@oss.nxp.com \
--cc=alex.williamson@redhat.com \
--cc=bharatb.linux@gmail.com \
--cc=diana.craciun@nxp.com \
--cc=kvm@vger.kernel.org \
--cc=laurentiu.tudor@nxp.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.