Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/vmwgfx: Fix a couple of lock dependency violations

Experimental lockdep annotation added to the TTM lock has unveiled a
couple of lock dependency violations in the vmwgfx driver. In both
cases it turns out that the device_private::reservation_sem is not
needed so the offending code is moved out of that lock.

Cc: <stable@vger.kernel.org>
Acked-by: Sinclair Yeh <syeh@vmware.com>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>

+6 -16
+3 -5
drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
··· 2780 2780 NULL, arg->command_size, arg->throttle_us, 2781 2781 (void __user *)(unsigned long)arg->fence_rep, 2782 2782 NULL); 2783 - 2783 + ttm_read_unlock(&dev_priv->reservation_sem); 2784 2784 if (unlikely(ret != 0)) 2785 - goto out_unlock; 2785 + return ret; 2786 2786 2787 2787 vmw_kms_cursor_post_execbuf(dev_priv); 2788 2788 2789 - out_unlock: 2790 - ttm_read_unlock(&dev_priv->reservation_sem); 2791 - return ret; 2789 + return 0; 2792 2790 }
+3 -11
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
··· 2033 2033 int i; 2034 2034 struct drm_mode_config *mode_config = &dev->mode_config; 2035 2035 2036 - ret = ttm_read_lock(&dev_priv->reservation_sem, true); 2037 - if (unlikely(ret != 0)) 2038 - return ret; 2039 - 2040 2036 if (!arg->num_outputs) { 2041 2037 struct drm_vmw_rect def_rect = {0, 0, 800, 600}; 2042 2038 vmw_du_update_layout(dev_priv, 1, &def_rect); 2043 - goto out_unlock; 2039 + return 0; 2044 2040 } 2045 2041 2046 2042 rects_size = arg->num_outputs * sizeof(struct drm_vmw_rect); 2047 2043 rects = kcalloc(arg->num_outputs, sizeof(struct drm_vmw_rect), 2048 2044 GFP_KERNEL); 2049 - if (unlikely(!rects)) { 2050 - ret = -ENOMEM; 2051 - goto out_unlock; 2052 - } 2045 + if (unlikely(!rects)) 2046 + return -ENOMEM; 2053 2047 2054 2048 user_rects = (void __user *)(unsigned long)arg->rects; 2055 2049 ret = copy_from_user(rects, user_rects, rects_size); ··· 2068 2074 2069 2075 out_free: 2070 2076 kfree(rects); 2071 - out_unlock: 2072 - ttm_read_unlock(&dev_priv->reservation_sem); 2073 2077 return ret; 2074 2078 }