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 <quic_varar@quicinc.com>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
fd732177c1
commit
df69a7d379
@@ -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;
|
||||
|
Reference in New Issue
Block a user