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>
This commit is contained in:
parent
cd961bb9ee
commit
5151adb37a
|
@ -2780,13 +2780,11 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
|
||||||
NULL, arg->command_size, arg->throttle_us,
|
NULL, arg->command_size, arg->throttle_us,
|
||||||
(void __user *)(unsigned long)arg->fence_rep,
|
(void __user *)(unsigned long)arg->fence_rep,
|
||||||
NULL);
|
NULL);
|
||||||
|
ttm_read_unlock(&dev_priv->reservation_sem);
|
||||||
if (unlikely(ret != 0))
|
if (unlikely(ret != 0))
|
||||||
goto out_unlock;
|
return ret;
|
||||||
|
|
||||||
vmw_kms_cursor_post_execbuf(dev_priv);
|
vmw_kms_cursor_post_execbuf(dev_priv);
|
||||||
|
|
||||||
out_unlock:
|
return 0;
|
||||||
ttm_read_unlock(&dev_priv->reservation_sem);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2033,23 +2033,17 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
|
||||||
int i;
|
int i;
|
||||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||||
|
|
||||||
ret = ttm_read_lock(&dev_priv->reservation_sem, true);
|
|
||||||
if (unlikely(ret != 0))
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (!arg->num_outputs) {
|
if (!arg->num_outputs) {
|
||||||
struct drm_vmw_rect def_rect = {0, 0, 800, 600};
|
struct drm_vmw_rect def_rect = {0, 0, 800, 600};
|
||||||
vmw_du_update_layout(dev_priv, 1, &def_rect);
|
vmw_du_update_layout(dev_priv, 1, &def_rect);
|
||||||
goto out_unlock;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rects_size = arg->num_outputs * sizeof(struct drm_vmw_rect);
|
rects_size = arg->num_outputs * sizeof(struct drm_vmw_rect);
|
||||||
rects = kcalloc(arg->num_outputs, sizeof(struct drm_vmw_rect),
|
rects = kcalloc(arg->num_outputs, sizeof(struct drm_vmw_rect),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (unlikely(!rects)) {
|
if (unlikely(!rects))
|
||||||
ret = -ENOMEM;
|
return -ENOMEM;
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
user_rects = (void __user *)(unsigned long)arg->rects;
|
user_rects = (void __user *)(unsigned long)arg->rects;
|
||||||
ret = copy_from_user(rects, user_rects, rects_size);
|
ret = copy_from_user(rects, user_rects, rects_size);
|
||||||
|
@ -2074,7 +2068,5 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
kfree(rects);
|
kfree(rects);
|
||||||
out_unlock:
|
|
||||||
ttm_read_unlock(&dev_priv->reservation_sem);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue