diff --git a/dsp/adsprpc.c b/dsp/adsprpc.c index 1d4a3ee58f..6a264c31c4 100644 --- a/dsp/adsprpc.c +++ b/dsp/adsprpc.c @@ -3500,9 +3500,11 @@ int fastrpc_internal_invoke(struct fastrpc_file *fl, uint32_t mode, trace_fastrpc_msg("context_free: end"); } if (!kernel) { + mutex_lock(&fl->apps->channel[cid].smd_mutex); if (VALID_FASTRPC_CID(cid) && (fl->ssrcount != fl->apps->channel[cid].ssrcount)) err = -ECONNRESET; + mutex_unlock(&fl->apps->channel[cid].smd_mutex); } invoke_end: @@ -6699,8 +6701,8 @@ int fastrpc_get_info(struct fastrpc_file *fl, uint32_t *info) } } fl->cid = cid; - fl->ssrcount = fl->apps->channel[cid].ssrcount; mutex_lock(&fl->apps->channel[cid].smd_mutex); + fl->ssrcount = fl->apps->channel[cid].ssrcount; err = fastrpc_session_alloc_locked(&fl->apps->channel[cid], 0, fl->sharedcb, fl->pd_type, &fl->sctx); mutex_unlock(&fl->apps->channel[cid].smd_mutex); @@ -7894,7 +7896,9 @@ void fastrpc_restart_drivers(int cid) struct fastrpc_apps *me = &gfa; fastrpc_notify_drivers(me, cid); + mutex_lock(&me->channel[cid].smd_mutex); me->channel[cid].ssrcount++; + mutex_unlock(&me->channel[cid].smd_mutex); } static int fastrpc_restart_notifier_cb(struct notifier_block *nb, @@ -7908,9 +7912,14 @@ static int fastrpc_restart_notifier_cb(struct notifier_block *nb, int cid = -1; struct timespec64 startT = {0}; unsigned long irq_flags = 0; + uint64_t ssrcount = 0; ctx = container_of(nb, struct fastrpc_channel_ctx, nb); cid = ctx - &me->channel[0]; + /* ssrcount should be read within a critical section */ + mutex_lock(&me->channel[cid].smd_mutex); + ssrcount = ctx->ssrcount; + mutex_unlock(&me->channel[cid].smd_mutex); switch (code) { case QCOM_SSR_BEFORE_SHUTDOWN: fastrpc_rproc_trace_events(gcinfo[cid].subsys, @@ -7943,13 +7952,11 @@ static int fastrpc_restart_notifier_cb(struct notifier_block *nb, "QCOM_SSR_BEFORE_POWERUP", "fastrpc_restart_notifier-enter"); pr_info("adsprpc: %s: subsystem %s is about to start\n", __func__, gcinfo[cid].subsys); - if (cid == CDSP_DOMAIN_ID && dump_enabled() && - ctx->ssrcount) + if (cid == CDSP_DOMAIN_ID && dump_enabled() && ssrcount) fastrpc_update_ramdump_status(cid); fastrpc_notify_drivers(me, cid); /* Skip ram dump collection in first boot */ - if (cid == CDSP_DOMAIN_ID && dump_enabled() && - ctx->ssrcount) { + if (cid == CDSP_DOMAIN_ID && dump_enabled() && ssrcount) { mutex_lock(&me->channel[cid].smd_mutex); fastrpc_print_debug_data(cid); mutex_unlock(&me->channel[cid].smd_mutex);