From df69a7d3792653252ae935466b2688951bca432c Mon Sep 17 00:00:00 2001 From: Vara Reddy Date: Fri, 22 Jul 2022 12:01:20 -0700 Subject: [PATCH] disp: msm: dp: destroy audio workqueue outside session_lock Change moves destroying dp audio workqueue outside dp session_lock. As part of disconnect, USB driver uses atomic notifier which holds rcu_read_lock and calls into DP disconnect callback which needs session_lock. If another DP threads holds DP session_lock then we block RCU operations. Change-Id: I5d565ca149a3a34ebd5ede4fb662982d87454f16 Signed-off-by: Vara Reddy --- msm/dp/dp_display.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c index cbd74884..365121bc 100644 --- a/msm/dp/dp_display.c +++ b/msm/dp/dp_display.c @@ -3347,6 +3347,7 @@ static int dp_display_mst_connector_uninstall(struct dp_display *dp_display, struct sde_connector *sde_conn; struct dp_panel *dp_panel; struct dp_display_private *dp; + struct dp_audio *audio = NULL; if (!dp_display || !connector) { DP_ERR("invalid input\n"); @@ -3372,13 +3373,17 @@ static int dp_display_mst_connector_uninstall(struct dp_display *dp_display, } dp_panel = sde_conn->drv_panel; - dp_audio_put(dp_panel->audio); + + /* Make a copy of audio structure to call into dp_audio_put later */ + audio = dp_panel->audio; dp_panel_put(dp_panel); DP_MST_DEBUG("dp mst connector uninstalled. conn:%d\n", connector->base.id); mutex_unlock(&dp->session_lock); + + dp_audio_put(audio); SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_EXIT, dp->state); return rc;