disp: msm: cancel all delayed_works before triggering msm_lastclose
This patch cancels all the delayed_off_works if scheduled and flushes the display threads for completion during msm_lastclose. The commit from msm_lastclose client modeset to disable any crtcs if enabled is always scheduled on primary crtc_commit thread. In the current issue, delayed_off_work is scheduled on secondary display crtc_commit thread and primary crtc_commit thread is scheduled to turn off active crtcs from msm_lastclose leading to null dereference access of sde_enc's cur_master. This race is avoided by serializing the operations in msm_lastclose. Change-Id: I30cc95b925c8134f0064816ebe2cfdb86a49fb36 Signed-off-by: Jayaprakash Madisetty <quic_jmadiset@quicinc.com>
Este commit está contenido en:

cometido por
Veera Sundaram Sankaran

padre
50420e8d17
commit
182aac6040
@@ -1040,6 +1040,25 @@ mdss_init_fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void msm_atomic_flush_display_threads(struct msm_drm_private *priv)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!priv) {
|
||||
SDE_ERROR("invalid private data\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < priv->num_crtcs; i++) {
|
||||
if (priv->disp_thread[i].thread)
|
||||
kthread_flush_worker(&priv->disp_thread[i].worker);
|
||||
if (priv->event_thread[i].thread)
|
||||
kthread_flush_worker(&priv->event_thread[i].worker);
|
||||
}
|
||||
|
||||
kthread_flush_worker(&priv->pp_event_worker);
|
||||
}
|
||||
|
||||
/*
|
||||
* DRM operations:
|
||||
*/
|
||||
@@ -1165,6 +1184,8 @@ static void msm_lastclose(struct drm_device *dev)
|
||||
DRM_INFO("wait for crtc mask 0x%x failed, commit anyway...\n",
|
||||
priv->pending_crtcs);
|
||||
|
||||
msm_atomic_flush_display_threads(priv);
|
||||
|
||||
if (priv->fbdev) {
|
||||
rc = drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev);
|
||||
if (rc)
|
||||
|
Referencia en una nueva incidencia
Block a user