disp: msm: check if kms is instantiated
This defensive check is now required since the allocation of driver private data has moved from bind to probe phase. There is a chance that device shutdown can be called before bind phase and this can cause invalid memory access. Change-Id: I2d471a4aff93ae03291e19f6f902f1e5c28dc50f Signed-off-by: Abhijit Kulkarni <kabhijit@codeaurora.org>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
e2f98dc79b
commit
c789d0fb8a
@@ -970,7 +970,10 @@ static void msm_postclose(struct drm_device *dev, struct drm_file *file)
|
|||||||
struct msm_file_private *ctx = file->driver_priv;
|
struct msm_file_private *ctx = file->driver_priv;
|
||||||
struct msm_kms *kms = priv->kms;
|
struct msm_kms *kms = priv->kms;
|
||||||
|
|
||||||
if (kms && kms->funcs && kms->funcs->postclose)
|
if (!kms)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (kms->funcs && kms->funcs->postclose)
|
||||||
kms->funcs->postclose(kms, file);
|
kms->funcs->postclose(kms, file);
|
||||||
|
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
@@ -994,11 +997,14 @@ static void msm_lastclose(struct drm_device *dev)
|
|||||||
struct msm_kms *kms = priv->kms;
|
struct msm_kms *kms = priv->kms;
|
||||||
int i, rc;
|
int i, rc;
|
||||||
|
|
||||||
|
if (!kms)
|
||||||
|
return;
|
||||||
|
|
||||||
/* check for splash status before triggering cleanup
|
/* check for splash status before triggering cleanup
|
||||||
* if we end up here with splash status ON i.e before first
|
* if we end up here with splash status ON i.e before first
|
||||||
* commit then ignore the last close call
|
* commit then ignore the last close call
|
||||||
*/
|
*/
|
||||||
if (kms && kms->funcs && kms->funcs->check_for_splash
|
if (kms->funcs && kms->funcs->check_for_splash
|
||||||
&& kms->funcs->check_for_splash(kms))
|
&& kms->funcs->check_for_splash(kms))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1026,7 +1032,7 @@ static void msm_lastclose(struct drm_device *dev)
|
|||||||
DRM_ERROR("client modeset commit failed: %d\n", rc);
|
DRM_ERROR("client modeset commit failed: %d\n", rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kms && kms->funcs && kms->funcs->lastclose)
|
if (kms->funcs && kms->funcs->lastclose)
|
||||||
kms->funcs->lastclose(kms);
|
kms->funcs->lastclose(kms);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user