2019-03-29 14:12:17 +08:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2018-12-10 15:51:05 +08:00
|
|
|
From: Ong Hock Yu <ong.hock.yu@intel.com>
|
|
|
|
Date: Thu, 29 Nov 2018 21:36:05 +0000
|
2019-03-29 14:12:17 +08:00
|
|
|
Subject: [PATCH] media: intel-ipu4: [VIRT] Add mutex to avoid race condition
|
|
|
|
on pipeline open/close
|
2018-12-10 15:51:05 +08:00
|
|
|
|
|
|
|
The pipeline close was called multiple times. This create
|
|
|
|
race condition to double close the pipeline node.
|
|
|
|
|
|
|
|
Change-Id: I39d9869af3062875495cf3b942ca3a96b625dc6a
|
|
|
|
Tracked-On: OAM-72129
|
|
|
|
Signed-off-by: Ong Hock Yu <ong.hock.yu@intel.com>
|
|
|
|
Signed-off-by: Bandi, Kushal <kushal.bandi@intel.com>
|
|
|
|
---
|
|
|
|
.../intel/virtio/intel-ipu4-para-virt-drv.c | 43 ++++++++++++++++---
|
|
|
|
1 file changed, 37 insertions(+), 6 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-drv.c b/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-drv.c
|
2020-10-27 02:14:06 +08:00
|
|
|
index dc0be874c93b..06572eab985b 100644
|
2018-12-10 15:51:05 +08:00
|
|
|
--- a/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-drv.c
|
|
|
|
+++ b/drivers/media/pci/intel/virtio/intel-ipu4-para-virt-drv.c
|
|
|
|
@@ -34,6 +34,8 @@ static int virt_stream_devs_registered;
|
|
|
|
static int stream_dev_init;
|
|
|
|
|
|
|
|
static struct ipu4_virtio_ctx *g_fe_priv;
|
|
|
|
+static struct mutex pipeline_fop_mutex;
|
|
|
|
+static bool pipeline_open;
|
|
|
|
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
|
struct timeval32 {
|
|
|
|
@@ -977,9 +979,16 @@ static int virt_pipeline_fop_open(struct inode *inode, struct file *file)
|
|
|
|
|
|
|
|
file->private_data = dev;
|
|
|
|
|
|
|
|
+ mutex_lock(&pipeline_fop_mutex);
|
|
|
|
+
|
|
|
|
+ if(pipeline_open)
|
|
|
|
+ goto exit;
|
|
|
|
+
|
|
|
|
req = ipu4_virtio_fe_req_queue_get();
|
|
|
|
- if (!req)
|
|
|
|
- return -ENOMEM;
|
|
|
|
+ if (!req) {
|
|
|
|
+ rval = -ENOMEM;
|
|
|
|
+ goto exit;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
op[0] = dev->minor;
|
|
|
|
op[1] = 0;
|
|
|
|
@@ -991,9 +1000,16 @@ static int virt_pipeline_fop_open(struct inode *inode, struct file *file)
|
|
|
|
if (rval) {
|
|
|
|
pr_err("Failed to open virtual device\n");
|
|
|
|
ipu4_virtio_fe_req_queue_put(req);
|
|
|
|
- return rval;
|
|
|
|
+ goto exit;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ pipeline_open = true;
|
|
|
|
+
|
|
|
|
ipu4_virtio_fe_req_queue_put(req);
|
|
|
|
+
|
|
|
|
+exit:
|
|
|
|
+ mutex_unlock(&pipeline_fop_mutex);
|
|
|
|
+
|
|
|
|
return rval;
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1008,9 +1024,16 @@ static int virt_pipeline_fop_release(struct inode *inode, struct file *file)
|
|
|
|
|
|
|
|
put_device(&pipe_dev->dev);
|
|
|
|
|
|
|
|
+ mutex_lock(&pipeline_fop_mutex);
|
|
|
|
+
|
|
|
|
+ if(!pipeline_open)
|
|
|
|
+ goto exit;
|
|
|
|
+
|
|
|
|
req = ipu4_virtio_fe_req_queue_get();
|
|
|
|
- if (!req)
|
|
|
|
- return -ENOMEM;
|
|
|
|
+ if (!req) {
|
|
|
|
+ rval = -ENOMEM;
|
|
|
|
+ goto exit;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
op[0] = pipe_dev->minor;
|
|
|
|
op[1] = 0;
|
|
|
|
@@ -1021,10 +1044,16 @@ static int virt_pipeline_fop_release(struct inode *inode, struct file *file)
|
|
|
|
if (rval) {
|
|
|
|
pr_err("Failed to close virtual device\n");
|
|
|
|
ipu4_virtio_fe_req_queue_put(req);
|
|
|
|
- return rval;
|
|
|
|
+ goto exit;
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ pipeline_open = false;
|
|
|
|
+
|
|
|
|
ipu4_virtio_fe_req_queue_put(req);
|
|
|
|
|
|
|
|
+exit:
|
|
|
|
+ mutex_unlock(&pipeline_fop_mutex);
|
|
|
|
+
|
|
|
|
return rval;
|
|
|
|
}
|
|
|
|
|
|
|
|
@@ -1220,6 +1249,8 @@ static int virt_ici_pipeline_init(void)
|
|
|
|
strlcpy(pipeline_dev->name, pipeline_dev->dev.kobj.name, sizeof(pipeline_dev->name));
|
|
|
|
pipeline_dev->minor = MINOR_PIPELINE;
|
|
|
|
mutex_init(&pipeline_dev->mutex);
|
|
|
|
+ mutex_init(&pipeline_fop_mutex);
|
|
|
|
+ pipeline_open = false;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
--
|
2019-04-08 18:08:36 +08:00
|
|
|
https://clearlinux.org
|
2018-12-10 15:51:05 +08:00
|
|
|
|