From 37fd13294c9f70f95418e6a88669e7c1a2ece59f Mon Sep 17 00:00:00 2001 From: Edgar Flores Date: Fri, 5 Jun 2020 01:45:56 -0700 Subject: [PATCH] msm: adsprpc: ignoring error messages for duplicate RPC respond packets Ignoring duplicate packets in high concurrency scenarios when using early_wake feature. This will avoid system restart since duplicate packets are causing many error messages to be send to kernel logs. Change-Id: I214d415c6df016268459bb5dad33e73d20dac925 Signed-off-by: Edgar Flores --- drivers/char/adsprpc.c | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index e8918f218293..4e0341848ebf 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -447,6 +447,7 @@ struct fastrpc_apps { struct wakeup_source *wake_source_secure; /* Non-secure subsystem like CDSP will use regular client */ struct wakeup_source *wake_source; + uint32_t duplicate_rsp_err_cnt; }; struct fastrpc_mmap { @@ -4517,7 +4518,7 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data, struct smq_invoke_ctx *ctx = NULL; struct fastrpc_apps *me = &gfa; uint32_t index, rsp_flags = 0, early_wake_time = 0; - int err = 0, cid = -1; + int err = 0, cid = -1, ignore_rpmsg_err = 0; struct fastrpc_channel_ctx *chan = NULL; unsigned long irq_flags = 0; @@ -4550,14 +4551,18 @@ static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data, spin_lock_irqsave(&chan->ctxlock, irq_flags); ctx = chan->ctxtable[index]; - VERIFY(err, !IS_ERR_OR_NULL(ctx)); - if (err) - goto bail_unlock; - - VERIFY(err, ((ctx->ctxid == (rsp->ctx & ~CONTEXT_PD_CHECK)) && - ctx->magic == FASTRPC_CTX_MAGIC)); - if (err) + VERIFY(err, !IS_ERR_OR_NULL(ctx) && + (ctx->ctxid == (rsp->ctx & ~CONTEXT_PD_CHECK)) && + ctx->magic == FASTRPC_CTX_MAGIC); + if (err) { + /* + * Received an anticipatory COMPLETE_SIGNAL from DSP for a + * context after CPU successfully polling on memory and + * completed processing of context. Ignore the message. + */ + ignore_rpmsg_err = (rsp_flags == COMPLETE_SIGNAL) ? 1 : 0; goto bail_unlock; + } if (rspv2) { VERIFY(err, rspv2->version == FASTRPC_RSP_VERSION2); @@ -4569,11 +4574,15 @@ bail_unlock: spin_unlock_irqrestore(&chan->ctxlock, irq_flags); bail: if (err) { - ADSPRPC_ERR( - "invalid response data %pK, len %d from remote subsystem err %d\n", - data, len, err); err = -ENOKEY; + if (!ignore_rpmsg_err) + ADSPRPC_ERR( + "invalid response data %pK, len %d from remote subsystem err %d\n", + data, len, err); + else + me->duplicate_rsp_err_cnt++; } + return err; }