mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-26 04:25:27 +08:00
drm/radeon/kms: unpin fb in atombios crtc disable
When drm_helper_disable_unused_functions calls disable function of the CRTC, it also sets the crtc->fb pointer to NULL. This can later (when the mode on that CRTC is setup again from user space) cause ***_do_set_base functions to "think" that there is no old buffer and skip the unpinning code. Consequently, the buffer that has been NULL-ified in drm_helper_disable_unused_functions will never be unpinned causing a leak in VRAM. This patch plugs the leak by unpinning the frame buffer in crtc_disable function. Signed-off-by: Ilija Hadzic <ihadzic@research.bell-labs.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
0f57bca922
commit
75b871e2d8
@ -1910,6 +1910,21 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
|
||||
int i;
|
||||
|
||||
atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
|
||||
if (crtc->fb) {
|
||||
int r;
|
||||
struct radeon_framebuffer *radeon_fb;
|
||||
struct radeon_bo *rbo;
|
||||
|
||||
radeon_fb = to_radeon_framebuffer(crtc->fb);
|
||||
rbo = gem_to_radeon_bo(radeon_fb->obj);
|
||||
r = radeon_bo_reserve(rbo, false);
|
||||
if (unlikely(r))
|
||||
DRM_ERROR("failed to reserve rbo before unpin\n");
|
||||
else {
|
||||
radeon_bo_unpin(rbo);
|
||||
radeon_bo_unreserve(rbo);
|
||||
}
|
||||
}
|
||||
/* disable the GRPH */
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
WREG32(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user