]> Pileus Git - ~andy/linux/blobdiff - drivers/gpu/drm/vmwgfx/vmwgfx_execbuf.c
drm/ttm: make ttm reservation calls behave like reservation calls
[~andy/linux] / drivers / gpu / drm / vmwgfx / vmwgfx_execbuf.c
index 394e6476105b9737a7041c7dce2db069f022ff85..599f6469a1ebb00c10b3d8047c44882aebd779d8 100644 (file)
@@ -1432,6 +1432,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
        struct vmw_fence_obj *fence = NULL;
        struct vmw_resource *error_resource;
        struct list_head resource_list;
+       struct ww_acquire_ctx ticket;
        uint32_t handle;
        void *cmd;
        int ret;
@@ -1488,7 +1489,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
        if (unlikely(ret != 0))
                goto out_err;
 
-       ret = ttm_eu_reserve_buffers(&sw_context->validate_nodes);
+       ret = ttm_eu_reserve_buffers(&ticket, &sw_context->validate_nodes);
        if (unlikely(ret != 0))
                goto out_err;
 
@@ -1537,7 +1538,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
                DRM_ERROR("Fence submission error. Syncing.\n");
 
        vmw_resource_list_unreserve(&sw_context->resource_list, false);
-       ttm_eu_fence_buffer_objects(&sw_context->validate_nodes,
+       ttm_eu_fence_buffer_objects(&ticket, &sw_context->validate_nodes,
                                    (void *) fence);
 
        if (unlikely(dev_priv->pinned_bo != NULL &&
@@ -1570,7 +1571,7 @@ int vmw_execbuf_process(struct drm_file *file_priv,
 out_err:
        vmw_resource_relocations_free(&sw_context->res_relocations);
        vmw_free_relocations(sw_context);
-       ttm_eu_backoff_reservation(&sw_context->validate_nodes);
+       ttm_eu_backoff_reservation(&ticket, &sw_context->validate_nodes);
        vmw_resource_list_unreserve(&sw_context->resource_list, true);
        vmw_clear_validations(sw_context);
        if (unlikely(dev_priv->pinned_bo != NULL &&
@@ -1644,6 +1645,7 @@ void __vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
        struct list_head validate_list;
        struct ttm_validate_buffer pinned_val, query_val;
        struct vmw_fence_obj *lfence = NULL;
+       struct ww_acquire_ctx ticket;
 
        if (dev_priv->pinned_bo == NULL)
                goto out_unlock;
@@ -1657,7 +1659,7 @@ void __vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
        list_add_tail(&query_val.head, &validate_list);
 
        do {
-               ret = ttm_eu_reserve_buffers(&validate_list);
+               ret = ttm_eu_reserve_buffers(&ticket, &validate_list);
        } while (ret == -ERESTARTSYS);
 
        if (unlikely(ret != 0)) {
@@ -1684,7 +1686,7 @@ void __vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
                                                  NULL);
                fence = lfence;
        }
-       ttm_eu_fence_buffer_objects(&validate_list, (void *) fence);
+       ttm_eu_fence_buffer_objects(&ticket, &validate_list, (void *) fence);
        if (lfence != NULL)
                vmw_fence_obj_unreference(&lfence);
 
@@ -1696,7 +1698,7 @@ out_unlock:
        return;
 
 out_no_emit:
-       ttm_eu_backoff_reservation(&validate_list);
+       ttm_eu_backoff_reservation(&ticket, &validate_list);
 out_no_reserve:
        ttm_bo_unref(&query_val.bo);
        ttm_bo_unref(&pinned_val.bo);