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 sde_connector *sde_conn;
|
||||||
struct dp_panel *dp_panel;
|
struct dp_panel *dp_panel;
|
||||||
struct dp_display_private *dp;
|
struct dp_display_private *dp;
|
||||||
|
struct dp_audio *audio = NULL;
|
||||||
|
|
||||||
if (!dp_display || !connector) {
|
if (!dp_display || !connector) {
|
||||||
DP_ERR("invalid input\n");
|
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_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_panel_put(dp_panel);
|
||||||
|
|
||||||
DP_MST_DEBUG("dp mst connector uninstalled. conn:%d\n",
|
DP_MST_DEBUG("dp mst connector uninstalled. conn:%d\n",
|
||||||
connector->base.id);
|
connector->base.id);
|
||||||
|
|
||||||
mutex_unlock(&dp->session_lock);
|
mutex_unlock(&dp->session_lock);
|
||||||
|
|
||||||
|
dp_audio_put(audio);
|
||||||
SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_EXIT, dp->state);
|
SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_EXIT, dp->state);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
Reference in New Issue
Block a user