Skip to content

Commit

Permalink
drm/vmwgfx: Fix a couple of lock dependency violations
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Thomas Hellstrom committed Mar 11, 2015
1 parent cd961bb commit 5151adb
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 16 deletions.
8 changes: 3 additions & 5 deletions drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
Original file line number Diff line number Diff line change
Expand Up @@ -2780,13 +2780,11 @@ int vmw_execbuf_ioctl(struct drm_device *dev, void *data,
NULL, arg->command_size, arg->throttle_us,
(void __user *)(unsigned long)arg->fence_rep,
NULL);

ttm_read_unlock(&dev_priv->reservation_sem);
if (unlikely(ret != 0))
goto out_unlock;
return ret;

vmw_kms_cursor_post_execbuf(dev_priv);

out_unlock:
ttm_read_unlock(&dev_priv->reservation_sem);
return ret;
return 0;
}
14 changes: 3 additions & 11 deletions drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
Original file line number Diff line number Diff line change
Expand Up @@ -2033,23 +2033,17 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
int i;
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) {
struct drm_vmw_rect def_rect = {0, 0, 800, 600};
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 = kcalloc(arg->num_outputs, sizeof(struct drm_vmw_rect),
GFP_KERNEL);
if (unlikely(!rects)) {
ret = -ENOMEM;
goto out_unlock;
}
if (unlikely(!rects))
return -ENOMEM;

user_rects = (void __user *)(unsigned long)arg->rects;
ret = copy_from_user(rects, user_rects, rects_size);
Expand All @@ -2074,7 +2068,5 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,

out_free:
kfree(rects);
out_unlock:
ttm_read_unlock(&dev_priv->reservation_sem);
return ret;
}

0 comments on commit 5151adb

Please sign in to comment.