aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2013-11-15 03:06:47 -0500
committerThomas Hellstrom <thellstrom@vmware.com>2013-11-18 03:40:05 -0500
commitac49251b6bf428b8f4fb1ed8859219f0a72b5db4 (patch)
tree7f1dc32d3caf996ecce1fd6032d955f7f10595dd /drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
parent8d17fb4455eadbf2642e34e5584d0b0de64d33a8 (diff)
drm/vmwgfx: Fix false lockdep warning
A lockdep warning is hit when evicting surfaces and reserving the backup buffer. Since this buffer can only be reserved by the process holding the surface reservation or by the buffer eviction processes that use tryreserve, there is no real deadlock here, but there's no other way to silence lockdep than to use a tryreserve. This means the reservation might fail if the buffer is about to be evicted or swapped out, but we now have code in place to handle that reasonably well. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_resource.c')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_resource.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
index 252501a54def..5aace8081eef 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
@@ -994,7 +994,6 @@ void vmw_resource_unreserve(struct vmw_resource *res,
994 */ 994 */
995static int 995static int
996vmw_resource_check_buffer(struct vmw_resource *res, 996vmw_resource_check_buffer(struct vmw_resource *res,
997 struct ww_acquire_ctx *ticket,
998 bool interruptible, 997 bool interruptible,
999 struct ttm_validate_buffer *val_buf) 998 struct ttm_validate_buffer *val_buf)
1000{ 999{
@@ -1011,7 +1010,7 @@ vmw_resource_check_buffer(struct vmw_resource *res,
1011 INIT_LIST_HEAD(&val_list); 1010 INIT_LIST_HEAD(&val_list);
1012 val_buf->bo = ttm_bo_reference(&res->backup->base); 1011 val_buf->bo = ttm_bo_reference(&res->backup->base);
1013 list_add_tail(&val_buf->head, &val_list); 1012 list_add_tail(&val_buf->head, &val_list);
1014 ret = ttm_eu_reserve_buffers(ticket, &val_list); 1013 ret = ttm_eu_reserve_buffers(NULL, &val_list);
1015 if (unlikely(ret != 0)) 1014 if (unlikely(ret != 0))
1016 goto out_no_reserve; 1015 goto out_no_reserve;
1017 1016
@@ -1029,7 +1028,7 @@ vmw_resource_check_buffer(struct vmw_resource *res,
1029 return 0; 1028 return 0;
1030 1029
1031out_no_validate: 1030out_no_validate:
1032 ttm_eu_backoff_reservation(ticket, &val_list); 1031 ttm_eu_backoff_reservation(NULL, &val_list);
1033out_no_reserve: 1032out_no_reserve:
1034 ttm_bo_unref(&val_buf->bo); 1033 ttm_bo_unref(&val_buf->bo);
1035 if (backup_dirty) 1034 if (backup_dirty)
@@ -1074,8 +1073,7 @@ int vmw_resource_reserve(struct vmw_resource *res, bool no_backup)
1074 * @val_buf: Backup buffer information. 1073 * @val_buf: Backup buffer information.
1075 */ 1074 */
1076static void 1075static void
1077vmw_resource_backoff_reservation(struct ww_acquire_ctx *ticket, 1076vmw_resource_backoff_reservation(struct ttm_validate_buffer *val_buf)
1078 struct ttm_validate_buffer *val_buf)
1079{ 1077{
1080 struct list_head val_list; 1078 struct list_head val_list;
1081 1079
@@ -1084,7 +1082,7 @@ vmw_resource_backoff_reservation(struct ww_acquire_ctx *ticket,
1084 1082
1085 INIT_LIST_HEAD(&val_list); 1083 INIT_LIST_HEAD(&val_list);
1086 list_add_tail(&val_buf->head, &val_list); 1084 list_add_tail(&val_buf->head, &val_list);
1087 ttm_eu_backoff_reservation(ticket, &val_list); 1085 ttm_eu_backoff_reservation(NULL, &val_list);
1088 ttm_bo_unref(&val_buf->bo); 1086 ttm_bo_unref(&val_buf->bo);
1089} 1087}
1090 1088
@@ -1099,14 +1097,12 @@ int vmw_resource_do_evict(struct vmw_resource *res, bool interruptible)
1099{ 1097{
1100 struct ttm_validate_buffer val_buf; 1098 struct ttm_validate_buffer val_buf;
1101 const struct vmw_res_func *func = res->func; 1099 const struct vmw_res_func *func = res->func;
1102 struct ww_acquire_ctx ticket;
1103 int ret; 1100 int ret;
1104 1101
1105 BUG_ON(!func->may_evict); 1102 BUG_ON(!func->may_evict);
1106 1103
1107 val_buf.bo = NULL; 1104 val_buf.bo = NULL;
1108 ret = vmw_resource_check_buffer(res, &ticket, interruptible, 1105 ret = vmw_resource_check_buffer(res, interruptible, &val_buf);
1109 &val_buf);
1110 if (unlikely(ret != 0)) 1106 if (unlikely(ret != 0))
1111 return ret; 1107 return ret;
1112 1108
@@ -1121,7 +1117,7 @@ int vmw_resource_do_evict(struct vmw_resource *res, bool interruptible)
1121 res->backup_dirty = true; 1117 res->backup_dirty = true;
1122 res->res_dirty = false; 1118 res->res_dirty = false;
1123out_no_unbind: 1119out_no_unbind:
1124 vmw_resource_backoff_reservation(&ticket, &val_buf); 1120 vmw_resource_backoff_reservation(&val_buf);
1125 1121
1126 return ret; 1122 return ret;
1127} 1123}