Skip to content

Commit 8218c3f

Browse files
danvetairlied
authored andcommitted
drm: Fixup racy refcounting in plane_force_disable
Originally it was impossible to be dropping the last refcount in this function since there was always one around still from the idr. But in commit 83f45fc Author: Daniel Vetter <daniel.vetter@ffwll.ch> Date: Wed Aug 6 09:10:18 2014 +0200 drm: Don't grab an fb reference for the idr we've switched to weak references, broke that assumption but forgot to fix it up. Since we still force-disable planes it's only possible to hit this when racing multiple rmfb with fbdev restoring or similar evil things. As long as userspace is nice it's impossible to hit the BUG_ON. But the BUG_ON would most likely be hit from fbdev code, which usually invovles the console_lock besides all modeset locks. So very likely we'd never get the bug reports if this was hit in the wild, hence better be safe than sorry and backport. Spotted by Matt Roper while reviewing other patches. [airlied: pull this back into 4.0 - the oops happens there] Cc: stable@vger.kernel.org Cc: Matt Roper <matthew.d.roper@intel.com> Reviewed-by: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
1 parent 90a5a89 commit 8218c3f

File tree

1 file changed

+1
-12
lines changed

1 file changed

+1
-12
lines changed

drivers/gpu/drm/drm_crtc.c

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -525,17 +525,6 @@ void drm_framebuffer_reference(struct drm_framebuffer *fb)
525525
}
526526
EXPORT_SYMBOL(drm_framebuffer_reference);
527527

528-
static void drm_framebuffer_free_bug(struct kref *kref)
529-
{
530-
BUG();
531-
}
532-
533-
static void __drm_framebuffer_unreference(struct drm_framebuffer *fb)
534-
{
535-
DRM_DEBUG("%p: FB ID: %d (%d)\n", fb, fb->base.id, atomic_read(&fb->refcount.refcount));
536-
kref_put(&fb->refcount, drm_framebuffer_free_bug);
537-
}
538-
539528
/**
540529
* drm_framebuffer_unregister_private - unregister a private fb from the lookup idr
541530
* @fb: fb to unregister
@@ -1320,7 +1309,7 @@ void drm_plane_force_disable(struct drm_plane *plane)
13201309
return;
13211310
}
13221311
/* disconnect the plane from the fb and crtc: */
1323-
__drm_framebuffer_unreference(plane->old_fb);
1312+
drm_framebuffer_unreference(plane->old_fb);
13241313
plane->old_fb = NULL;
13251314
plane->fb = NULL;
13261315
plane->crtc = NULL;

0 commit comments

Comments
 (0)