msm: adsprpc: Fix race condition in internal_control
Protect add and update qos request with mutex to
avoid race condition when multiple threads try to add
or update request simultaneously.
Change-Id: Id33b81bf85246ec69c72bad59cca068e627bb21d
Acked-by: Deepika Singh <dsi@qti.qualcomm.com>
Signed-off-by: Jeya R <jeyr@codeaurora.org>
diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c
index 6554e71..40abe94 100644
--- a/drivers/char/adsprpc.c
+++ b/drivers/char/adsprpc.c
@@ -416,6 +416,7 @@
struct mutex perf_mutex;
struct pm_qos_request pm_qos_req;
int qos_request;
+ struct mutex pm_qos_mutex;
struct mutex map_mutex;
struct mutex fl_map_mutex;
int refcount;
@@ -3256,6 +3257,7 @@
mutex_destroy(&fl->perf_mutex);
mutex_destroy(&fl->fl_map_mutex);
mutex_destroy(&fl->map_mutex);
+ mutex_destroy(&fl->pm_qos_mutex);
kfree(fl);
return 0;
}
@@ -3757,6 +3759,7 @@
hlist_add_head(&fl->hn, &me->drivers);
spin_unlock(&me->hlock);
mutex_init(&fl->perf_mutex);
+ mutex_init(&fl->pm_qos_mutex);
return 0;
}
@@ -3862,12 +3865,14 @@
VERIFY(err, latency != 0);
if (err)
goto bail;
+ mutex_lock(&fl->pm_qos_mutex);
if (!fl->qos_request) {
pm_qos_add_request(&fl->pm_qos_req,
PM_QOS_CPU_DMA_LATENCY, latency);
fl->qos_request = 1;
} else
pm_qos_update_request(&fl->pm_qos_req, latency);
+ mutex_unlock(&fl->pm_qos_mutex);
break;
case FASTRPC_CONTROL_SMMU:
if (!me->legacy)