mirror of
https://github.com/Divested-Mobile/DivestOS-Build.git
synced 2024-10-01 01:35:54 -04:00
249 lines
8.3 KiB
Diff
249 lines
8.3 KiB
Diff
From 95e72ae9281b77abc3ed0cc6a33c17b989241efa Mon Sep 17 00:00:00 2001
|
|
From: kunleiz <kunleiz@codeaurora.org>
|
|
Date: Sun, 26 Mar 2017 20:07:43 +0800
|
|
Subject: ASoC: msm: qdspv2: add mutex to prevent access same memory
|
|
simultaneously
|
|
|
|
Add mutex protection to avoid simultaneous access the
|
|
same memory by multiple threads.
|
|
|
|
CRs-Fixed: 2013494
|
|
Change-Id: I440ea633ceb7312637c9a3b29d22236166d21a39
|
|
Signed-off-by: kunleiz <kunleiz@codeaurora.org>
|
|
---
|
|
drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c | 34 +++++++++++++++++++++++++
|
|
1 file changed, 34 insertions(+)
|
|
|
|
diff --git a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c
|
|
index 089a827..e7c28a6 100644
|
|
--- a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c
|
|
+++ b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c
|
|
@@ -148,6 +148,8 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
case AUDIO_START: {
|
|
pr_debug("%s: AUDIO_START\n", __func__);
|
|
|
|
+ mutex_lock(&effects->lock);
|
|
+
|
|
rc = q6asm_open_read_write_v2(effects->ac,
|
|
FORMAT_LINEAR_PCM,
|
|
FORMAT_MULTI_CHANNEL_LINEAR_PCM,
|
|
@@ -159,6 +161,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
pr_err("%s: Open failed for hw accelerated effects:rc=%d\n",
|
|
__func__, rc);
|
|
rc = -EINVAL;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto ioctl_fail;
|
|
}
|
|
effects->opened = 1;
|
|
@@ -175,6 +178,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
pr_err("%s: Write buffer Allocation failed rc = %d\n",
|
|
__func__, rc);
|
|
rc = -ENOMEM;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto ioctl_fail;
|
|
}
|
|
atomic_set(&effects->in_count, effects->config.input.num_buf);
|
|
@@ -185,6 +189,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
pr_err("%s: Read buffer Allocation failed rc = %d\n",
|
|
__func__, rc);
|
|
rc = -ENOMEM;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto readbuf_fail;
|
|
}
|
|
atomic_set(&effects->out_count, effects->config.output.num_buf);
|
|
@@ -199,6 +204,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
if (rc < 0) {
|
|
pr_err("%s: pcm read block config failed\n", __func__);
|
|
rc = -EINVAL;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto cfg_fail;
|
|
}
|
|
pr_debug("%s: dec: sample_rate: %d, num_channels: %d, bit_width: %d\n",
|
|
@@ -213,6 +219,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
pr_err("%s: pcm write format block config failed\n",
|
|
__func__);
|
|
rc = -EINVAL;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto cfg_fail;
|
|
}
|
|
|
|
@@ -225,6 +232,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
effects->started = 0;
|
|
pr_err("%s: ASM run state failed\n", __func__);
|
|
}
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
case AUDIO_EFFECTS_WRITE: {
|
|
@@ -286,8 +294,11 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
uint32_t idx = 0;
|
|
uint32_t size = 0;
|
|
|
|
+ mutex_lock(&effects->lock);
|
|
+
|
|
if (!effects->started) {
|
|
rc = -EFAULT;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto ioctl_fail;
|
|
}
|
|
|
|
@@ -304,11 +315,13 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
if (!rc) {
|
|
pr_err("%s: read wait_event_timeout\n", __func__);
|
|
rc = -EFAULT;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto ioctl_fail;
|
|
}
|
|
if (!atomic_read(&effects->in_count)) {
|
|
pr_err("%s: pcm stopped in_count 0\n", __func__);
|
|
rc = -EFAULT;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto ioctl_fail;
|
|
}
|
|
|
|
@@ -316,15 +329,18 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd,
|
|
if (bufptr) {
|
|
if (!((void *)arg)) {
|
|
rc = -EFAULT;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto ioctl_fail;
|
|
}
|
|
if ((effects->config.buf_cfg.input_len > size) ||
|
|
copy_to_user((void *)arg, bufptr,
|
|
effects->config.buf_cfg.input_len)) {
|
|
rc = -EFAULT;
|
|
+ mutex_unlock(&effects->lock);
|
|
goto ioctl_fail;
|
|
}
|
|
}
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
default:
|
|
@@ -456,6 +472,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd,
|
|
switch (cmd) {
|
|
case AUDIO_SET_EFFECTS_CONFIG: {
|
|
pr_debug("%s: AUDIO_SET_EFFECTS_CONFIG\n", __func__);
|
|
+ mutex_lock(&effects->lock);
|
|
memset(&effects->config, 0, sizeof(effects->config));
|
|
if (copy_from_user(&effects->config, (void *)arg,
|
|
sizeof(effects->config))) {
|
|
@@ -473,6 +490,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd,
|
|
effects->config.input.num_buf,
|
|
effects->config.input.sample_rate,
|
|
effects->config.input.num_channels);
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
case AUDIO_EFFECTS_SET_BUF_LEN: {
|
|
@@ -494,6 +512,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd,
|
|
|
|
buf_avail.input_num_avail = atomic_read(&effects->in_count);
|
|
buf_avail.output_num_avail = atomic_read(&effects->out_count);
|
|
+ mutex_lock(&effects->lock);
|
|
pr_debug("%s: write buf avail: %d, read buf avail: %d\n",
|
|
__func__, buf_avail.output_num_avail,
|
|
buf_avail.input_num_avail);
|
|
@@ -503,16 +522,20 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd,
|
|
__func__);
|
|
rc = -EFAULT;
|
|
}
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
case AUDIO_EFFECTS_SET_PP_PARAMS: {
|
|
+ mutex_lock(&effects->lock);
|
|
if (copy_from_user(argvalues, (void *)arg,
|
|
MAX_PP_PARAMS_SZ*sizeof(long))) {
|
|
pr_err("%s: copy from user for pp params failed\n",
|
|
__func__);
|
|
+ mutex_unlock(&effects->lock);
|
|
return -EFAULT;
|
|
}
|
|
rc = audio_effects_set_pp_param(effects, argvalues);
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
default:
|
|
@@ -578,12 +601,14 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd,
|
|
case AUDIO_SET_EFFECTS_CONFIG32: {
|
|
struct msm_hwacc_effects_config32 config32;
|
|
struct msm_hwacc_effects_config *config = &effects->config;
|
|
+ mutex_lock(&effects->lock);
|
|
memset(&effects->config, 0, sizeof(effects->config));
|
|
if (copy_from_user(&config32, (void *)arg,
|
|
sizeof(config32))) {
|
|
pr_err("%s: copy to user for AUDIO_SET_EFFECTS_CONFIG failed\n",
|
|
__func__);
|
|
rc = -EFAULT;
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
config->input.buf_size = config32.input.buf_size;
|
|
@@ -620,16 +645,19 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd,
|
|
effects->config.input.num_buf,
|
|
effects->config.input.sample_rate,
|
|
effects->config.input.num_channels);
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
case AUDIO_EFFECTS_SET_BUF_LEN32: {
|
|
struct msm_hwacc_buf_cfg32 buf_cfg32;
|
|
struct msm_hwacc_effects_config *config = &effects->config;
|
|
+ mutex_lock(&effects->lock);
|
|
if (copy_from_user(&buf_cfg32, (void *)arg,
|
|
sizeof(buf_cfg32))) {
|
|
pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n",
|
|
__func__);
|
|
rc = -EFAULT;
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
config->buf_cfg.input_len = buf_cfg32.input_len;
|
|
@@ -637,6 +665,7 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd,
|
|
pr_debug("%s: write buf len: %d, read buf len: %d\n",
|
|
__func__, effects->config.buf_cfg.output_len,
|
|
effects->config.buf_cfg.input_len);
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
case AUDIO_EFFECTS_GET_BUF_AVAIL32: {
|
|
@@ -644,6 +673,7 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd,
|
|
|
|
memset(&buf_avail, 0, sizeof(buf_avail));
|
|
|
|
+ mutex_lock(&effects->lock);
|
|
buf_avail.input_num_avail = atomic_read(&effects->in_count);
|
|
buf_avail.output_num_avail = atomic_read(&effects->out_count);
|
|
pr_debug("%s: write buf avail: %d, read buf avail: %d\n",
|
|
@@ -655,22 +685,26 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd,
|
|
__func__);
|
|
rc = -EFAULT;
|
|
}
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
case AUDIO_EFFECTS_SET_PP_PARAMS32: {
|
|
long argvalues[MAX_PP_PARAMS_SZ] = {0};
|
|
int argvalues32[MAX_PP_PARAMS_SZ] = {0};
|
|
|
|
+ mutex_lock(&effects->lock);
|
|
if (copy_from_user(argvalues32, (void *)arg,
|
|
MAX_PP_PARAMS_SZ*sizeof(int))) {
|
|
pr_err("%s: copy from user failed for pp params\n",
|
|
__func__);
|
|
+ mutex_unlock(&effects->lock);
|
|
return -EFAULT;
|
|
}
|
|
for (i = 0; i < MAX_PP_PARAMS_SZ; i++)
|
|
argvalues[i] = argvalues32[i];
|
|
|
|
rc = audio_effects_set_pp_param(effects, argvalues);
|
|
+ mutex_unlock(&effects->lock);
|
|
break;
|
|
}
|
|
case AUDIO_START32: {
|
|
--
|
|
cgit v1.1
|
|
|