drm: Don't switch fb when disabling an output
In drm_crtc_helper_set_config, we call drm_crtc_helper_set_mode which may return early and do no operation if the crtc is to be disabled. In this case we merrily swap to the new fb, discarding the old_fb believing that it has been cleaned up. However, due to the early return, the old_fb was not presented to the backend for correct reaping, and nor was the new one - which is about to be reaped via the drm_helper_disable_unused_functions(), leading to incorrect refcounting of the pinned objects. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=27722 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=29857 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=29230 Tested-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Родитель
5d1d0cc87f
Коммит
9334ef755f
|
@ -649,8 +649,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
|
||||||
mode_changed = true;
|
mode_changed = true;
|
||||||
|
|
||||||
if (mode_changed) {
|
if (mode_changed) {
|
||||||
set->crtc->enabled = (set->mode != NULL);
|
set->crtc->enabled = drm_helper_crtc_in_use(set->crtc);
|
||||||
if (set->mode != NULL) {
|
if (set->crtc->enabled) {
|
||||||
DRM_DEBUG_KMS("attempting to set mode from"
|
DRM_DEBUG_KMS("attempting to set mode from"
|
||||||
" userspace\n");
|
" userspace\n");
|
||||||
drm_mode_debug_printmodeline(set->mode);
|
drm_mode_debug_printmodeline(set->mode);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче