mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-15 06:00:41 +00:00
drm: don't take modeset locks in getfb ioctl
We only need to push the fb unreference a bit down. While at it, properly pass the return value from ->create_handle back to userspace. Most drivers either return -ENODEV if they don't have a concept of buffer objects (ast, cirrus, ...) or just install a handle for the underlying gem object (which is ok since we hold a reference on that through the framebuffer). v2: Split out the ->create_handle rework in the individual drivers. Reviewed-by: Rob Clark <rob@ti.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
468174f748
commit
58c0dca106
@ -2542,19 +2542,14 @@ int drm_mode_getfb(struct drm_device *dev,
|
||||
{
|
||||
struct drm_mode_fb_cmd *r = data;
|
||||
struct drm_framebuffer *fb;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return -EINVAL;
|
||||
|
||||
drm_modeset_lock_all(dev);
|
||||
fb = drm_framebuffer_lookup(dev, r->fb_id);
|
||||
if (!fb) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
/* fb is protect by the mode_config lock, so drop the ref immediately */
|
||||
drm_framebuffer_unreference(fb);
|
||||
if (!fb)
|
||||
return -EINVAL;
|
||||
|
||||
r->height = fb->height;
|
||||
r->width = fb->width;
|
||||
@ -2566,8 +2561,8 @@ int drm_mode_getfb(struct drm_device *dev,
|
||||
else
|
||||
ret = -ENODEV;
|
||||
|
||||
out:
|
||||
drm_modeset_unlock_all(dev);
|
||||
drm_framebuffer_unreference(fb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user