summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}