summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDhoat Harpal <hdhoat@codeaurora.org>2016-06-07 19:42:34 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2016-07-13 03:39:02 -0700
commit898efa1fa20397db604667577834bcd79d747589 (patch)
treef52694fa8b947ce13470732cffe1c8664a725162
parent400520a6e2f06cc7c45e386e769a85d4aded565b (diff)
soc: qcom: glink_smd_xprt: Fix ssr sync during intent request
Synchronization is absent between SSR and intent request, which result in dead lock scenerio. ssr_sync rcu lock is used to synchronize intent request and SSR. CRs-Fixed: 1025593 Change-Id: I1ac06aace8d79ad92d2b48cfb51e1394ef68906c Signed-off-by: Dhoat Harpal <hdhoat@codeaurora.org>
-rw-r--r--drivers/soc/qcom/glink_smd_xprt.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/soc/qcom/glink_smd_xprt.c b/drivers/soc/qcom/glink_smd_xprt.c
index 52eedb507709..cb5bf94b8e67 100644
--- a/drivers/soc/qcom/glink_smd_xprt.c
+++ b/drivers/soc/qcom/glink_smd_xprt.c
@@ -1854,8 +1854,14 @@ static int tx_cmd_rx_intent_req(struct glink_transport_if *if_ptr,
struct edge_info *einfo;
struct channel *ch;
unsigned long flags;
+ int rcu_id;
einfo = container_of(if_ptr, struct edge_info, xprt_if);
+ rcu_id = srcu_read_lock(&einfo->ssr_sync);
+ if (einfo->in_ssr) {
+ srcu_read_unlock(&einfo->ssr_sync, rcu_id);
+ return -EFAULT;
+ }
spin_lock_irqsave(&einfo->channels_lock, flags);
list_for_each_entry(ch, &einfo->channels, node) {
if (lcid == ch->lcid)
@@ -1871,6 +1877,7 @@ static int tx_cmd_rx_intent_req(struct glink_transport_if *if_ptr,
ch->rcid,
ch->next_intent_id++,
size);
+ srcu_read_unlock(&einfo->ssr_sync, rcu_id);
return 0;
}