Commit 9cd47424 authored by Dave Airlie's avatar Dave Airlie

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: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent cee26ac4
...@@ -458,21 +458,22 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb, ...@@ -458,21 +458,22 @@ int drm_framebuffer_init(struct drm_device *dev, struct drm_framebuffer *fb,
{ {
int ret; int ret;
mutex_lock(&dev->mode_config.fb_lock);
INIT_LIST_HEAD(&fb->filp_head); INIT_LIST_HEAD(&fb->filp_head);
fb->dev = dev; fb->dev = dev;
fb->funcs = funcs; fb->funcs = funcs;
ret = drm_mode_object_get_reg(dev, &fb->base, DRM_MODE_OBJECT_FB, ret = drm_mode_object_get_reg(dev, &fb->base, DRM_MODE_OBJECT_FB,
true, drm_framebuffer_free); false, drm_framebuffer_free);
if (ret) if (ret)
goto out; goto out;
mutex_lock(&dev->mode_config.fb_lock);
dev->mode_config.num_fb++; dev->mode_config.num_fb++;
list_add(&fb->head, &dev->mode_config.fb_list); list_add(&fb->head, &dev->mode_config.fb_list);
out:
mutex_unlock(&dev->mode_config.fb_lock);
drm_mode_object_register(dev, &fb->base);
mutex_unlock(&dev->mode_config.fb_lock);
out:
return ret; return ret;
} }
EXPORT_SYMBOL(drm_framebuffer_init); EXPORT_SYMBOL(drm_framebuffer_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment