clear-pkgs-linux-iot-lts2018/0736-media-intel-ipu4-VIRT-...

117 lines
2.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ong Hock Yu <ong.hock.yu@intel.com>
Date: Thu, 29 Nov 2018 21:36:05 +0000
Subject: [PATCH] media: intel-ipu4: [VIRT] Add mutex to avoid race condition
on pipeline open/close
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
index dc0be874c93b..06572eab985b 100644
--- 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;
}
--
https://clearlinux.org