From a976c491a1e2234e7e023c8bc9c447e05c395c6c Mon Sep 17 00:00:00 2001 From: Prasad Kumpatla Date: Tue, 6 Sep 2022 11:34:03 +0530 Subject: [PATCH] dsp: increase the spf close all command timeout While graph_open is processing by the SPF, apps receives userspace(agm/pal) crash which will triggers spf_close_all cmd from msm common drivers and immediately calls msm_audio_ion_crash_handler() which will un-maps the memory. But here SPF is still in processing the graph_open, recieved spf_close_all cmd is queued in SPF. Due to un-mapping is done immediately in HLOS will resulting in SMMU fault. To avoid such scenarios, increased the spf_close_all cmd timeout, because the AGM timeout for the graph_open is 4sec, so increase the timeout for spf_close_all cmd response until graph open completes or timed out. Change-Id: I67430cad5a55bd250ea110587c0ead2d97115efc Signed-off-by: Prasad Kumpatla --- dsp/spf-core.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/dsp/spf-core.c b/dsp/spf-core.c index 33c88df8d4..59615021f3 100644 --- a/dsp/spf-core.c +++ b/dsp/spf-core.c @@ -26,6 +26,7 @@ #define APM_STATE_READY_TIMEOUT_MS 10000 #define Q6_READY_TIMEOUT_MS 1000 +#define Q6_CLOSE_ALL_TIMEOUT_MS 5000 #define APM_CMD_GET_SPF_STATE 0x01001021 #define APM_CMD_CLOSE_ALL 0x01001013 #define APM_CMD_RSP_GET_SPF_STATE 0x02001007 @@ -239,8 +240,20 @@ void spf_core_apm_close_all(void) goto done; } + + /* While graph_open is processing by the SPF, apps receives + * userspace(agm/pal) crash which will triggers spf_close_all + * cmd from msm common drivers and immediately calls + * msm_audio_ion_crash_handler() which will un-maps the memory. But + * here SPF is still in processing the graph_open, recieved spf_close_all + * cmd is queued in SPF. Due to un-mapping is done immediately in HLOS + * will resulting in SMMU fault. + * To avoid such scenarios, increased the spf_close_all cmd timeout, + * because the AGM timeout for the graph_open is 4sec, so increase the timeout + * for spf_close_all cmd response until graph open completes or timed out. + */ rc = wait_event_timeout(core->wait, (core->resp_received), - msecs_to_jiffies(Q6_READY_TIMEOUT_MS)); + msecs_to_jiffies(Q6_CLOSE_ALL_TIMEOUT_MS)); dev_info_ratelimited(spf_core_priv->dev, "%s: wait event unblocked \n", __func__); if (rc > 0 && core->resp_received) { if (core->status != 0)