diff options
Diffstat (limited to 'kernel/drivers/gpu/drm/mgag200/mgag200_cursor.c')
-rw-r--r-- | kernel/drivers/gpu/drm/mgag200/mgag200_cursor.c | 33 |
1 files changed, 15 insertions, 18 deletions
diff --git a/kernel/drivers/gpu/drm/mgag200/mgag200_cursor.c b/kernel/drivers/gpu/drm/mgag200/mgag200_cursor.c index 9f9780b7d..a7bf6a90e 100644 --- a/kernel/drivers/gpu/drm/mgag200/mgag200_cursor.c +++ b/kernel/drivers/gpu/drm/mgag200/mgag200_cursor.c @@ -70,24 +70,27 @@ int mga_crtc_cursor_set(struct drm_crtc *crtc, BUG_ON(pixels_2 != pixels_current && pixels_2 != pixels_prev); BUG_ON(pixels_current == pixels_prev); + if (!handle || !file_priv) { + mga_hide_cursor(mdev); + return 0; + } + + obj = drm_gem_object_lookup(dev, file_priv, handle); + if (!obj) + return -ENOENT; + ret = mgag200_bo_reserve(pixels_1, true); if (ret) { WREG8(MGA_CURPOSXL, 0); WREG8(MGA_CURPOSXH, 0); - return ret; + goto out_unref; } ret = mgag200_bo_reserve(pixels_2, true); if (ret) { WREG8(MGA_CURPOSXL, 0); WREG8(MGA_CURPOSXH, 0); mgag200_bo_unreserve(pixels_1); - return ret; - } - - if (!handle) { - mga_hide_cursor(mdev); - ret = 0; - goto out1; + goto out_unreserve1; } /* Move cursor buffers into VRAM if they aren't already */ @@ -106,16 +109,6 @@ int mga_crtc_cursor_set(struct drm_crtc *crtc, } } - mutex_lock(&dev->struct_mutex); - obj = drm_gem_object_lookup(dev, file_priv, handle); - if (!obj) { - mutex_unlock(&dev->struct_mutex); - ret = -ENOENT; - goto out1; - } - drm_gem_object_unreference(obj); - mutex_unlock(&dev->struct_mutex); - bo = gem_to_mga_bo(obj); ret = mgag200_bo_reserve(bo, true); if (ret) { @@ -252,7 +245,11 @@ int mga_crtc_cursor_set(struct drm_crtc *crtc, if (ret) mga_hide_cursor(mdev); mgag200_bo_unreserve(pixels_1); +out_unreserve1: mgag200_bo_unreserve(pixels_2); +out_unref: + drm_gem_object_unreference_unlocked(obj); + return ret; } |