aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_crtc.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-04-15 01:10:38 -0400
committerDave Airlie <airlied@redhat.com>2016-04-21 20:38:24 -0400
commit9cd47424fb410e478e5a97e83ac10263c13ed65c (patch)
tree055d4a9d2a2c0e15f8d44f7e4499458c616f6ded /drivers/gpu/drm/drm_crtc.c
parentcee26ac47dc2c2846ecd0fc80cf857942c1fcd77 (diff)
drm/mode: reduce scope of fb_lock in framebuffer init
We don't need to hold the fb lock around the initialisation, only around the list manipulaton. So do the lock hold only around the register for now. From Daniel: Previously fb refcounting, and especially the weak reference (kref_get_unless_zero) used in fb lookups have been protected by fb_lock. But with the refactoring to share refcounting in the drm_mode_object base class that switched to being protected by idr_mutex, which means fb_lock critical sections can be reduced. Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/drm_crtc.c')
-rw-r--r--drivers/gpu/drm/drm_crtc.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 0e4e25509c3d..b088840582cc 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -458,21 +458,22 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb,
458{ 458{
459 int ret; 459 int ret;
460 460
461 mutex_lock(&dev->mode_config.fb_lock);
462 INIT_LIST_HEAD(&fb->filp_head); 461 INIT_LIST_HEAD(&fb->filp_head);
463 fb->dev = dev; 462 fb->dev = dev;
464 fb->funcs = funcs; 463 fb->funcs = funcs;
465 464
466 ret = drm_mode_object_get_reg(dev, &fb->base, DRM_MODE_OBJECT_FB, 465 ret = drm_mode_object_get_reg(dev, &fb->base, DRM_MODE_OBJECT_FB,
467 true, drm_framebuffer_free); 466 false, drm_framebuffer_free);
468 if (ret) 467 if (ret)
469 goto out; 468 goto out;
470 469
470 mutex_lock(&dev->mode_config.fb_lock);
471 dev->mode_config.num_fb++; 471 dev->mode_config.num_fb++;
472 list_add(&fb->head, &dev->mode_config.fb_list); 472 list_add(&fb->head, &dev->mode_config.fb_list);
473out:
474 mutex_unlock(&dev->mode_config.fb_lock);
475 473
474 drm_mode_object_register(dev, &fb->base);
475 mutex_unlock(&dev->mode_config.fb_lock);
476out:
476 return ret; 477 return ret;
477} 478}
478EXPORT_SYMBOL(drm_framebuffer_init); 479EXPORT_SYMBOL(drm_framebuffer_init);