Commit 84e1bf06 authored by Thomas Hellstrom's avatar Thomas Hellstrom

drm/vmwgfx: Modify the resource validation interface

Allow selecting interruptible or uninterruptible waits to match
expectations of callers.
Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarDeepak Rawat <drawat@vmware.com>
Reviewed-by: default avatarSinclair Yeh <syeh@vmware.com>
parent 038ecc50
...@@ -628,7 +628,7 @@ extern void vmw_resource_unreference(struct vmw_resource **p_res); ...@@ -628,7 +628,7 @@ extern void vmw_resource_unreference(struct vmw_resource **p_res);
extern struct vmw_resource *vmw_resource_reference(struct vmw_resource *res); extern struct vmw_resource *vmw_resource_reference(struct vmw_resource *res);
extern struct vmw_resource * extern struct vmw_resource *
vmw_resource_reference_unless_doomed(struct vmw_resource *res); vmw_resource_reference_unless_doomed(struct vmw_resource *res);
extern int vmw_resource_validate(struct vmw_resource *res); extern int vmw_resource_validate(struct vmw_resource *res, bool intr);
extern int vmw_resource_reserve(struct vmw_resource *res, bool interruptible, extern int vmw_resource_reserve(struct vmw_resource *res, bool interruptible,
bool no_backup); bool no_backup);
extern bool vmw_resource_needs_backup(const struct vmw_resource *res); extern bool vmw_resource_needs_backup(const struct vmw_resource *res);
......
...@@ -659,7 +659,7 @@ static int vmw_resources_validate(struct vmw_sw_context *sw_context) ...@@ -659,7 +659,7 @@ static int vmw_resources_validate(struct vmw_sw_context *sw_context)
struct vmw_resource *res = val->res; struct vmw_resource *res = val->res;
struct vmw_buffer_object *backup = res->backup; struct vmw_buffer_object *backup = res->backup;
ret = vmw_resource_validate(res); ret = vmw_resource_validate(res, true);
if (unlikely(ret != 0)) { if (unlikely(ret != 0)) {
if (ret != -ERESTARTSYS) if (ret != -ERESTARTSYS)
DRM_ERROR("Failed to validate resource.\n"); DRM_ERROR("Failed to validate resource.\n");
......
...@@ -2713,7 +2713,7 @@ int vmw_kms_helper_resource_prepare(struct vmw_resource *res, ...@@ -2713,7 +2713,7 @@ int vmw_kms_helper_resource_prepare(struct vmw_resource *res,
ctx->buf = vmw_bo_reference(res->backup); ctx->buf = vmw_bo_reference(res->backup);
} }
ret = vmw_resource_validate(res); ret = vmw_resource_validate(res, interruptible);
if (ret) if (ret)
goto out_revert; goto out_revert;
return 0; return 0;
......
...@@ -587,15 +587,18 @@ static int vmw_resource_do_evict(struct ww_acquire_ctx *ticket, ...@@ -587,15 +587,18 @@ static int vmw_resource_do_evict(struct ww_acquire_ctx *ticket,
/** /**
* vmw_resource_validate - Make a resource up-to-date and visible * vmw_resource_validate - Make a resource up-to-date and visible
* to the device. * to the device.
* * @res: The resource to make visible to the device.
* @res: The resource to make visible to the device. * @intr: Perform waits interruptible if possible.
* *
* On succesful return, any backup DMA buffer pointed to by @res->backup will * On succesful return, any backup DMA buffer pointed to by @res->backup will
* be reserved and validated. * be reserved and validated.
* On hardware resource shortage, this function will repeatedly evict * On hardware resource shortage, this function will repeatedly evict
* resources of the same type until the validation succeeds. * resources of the same type until the validation succeeds.
*
* Return: Zero on success, -ERESTARTSYS if interrupted, negative error code
* on failure.
*/ */
int vmw_resource_validate(struct vmw_resource *res) int vmw_resource_validate(struct vmw_resource *res, bool intr)
{ {
int ret; int ret;
struct vmw_resource *evict_res; struct vmw_resource *evict_res;
...@@ -633,7 +636,7 @@ int vmw_resource_validate(struct vmw_resource *res) ...@@ -633,7 +636,7 @@ int vmw_resource_validate(struct vmw_resource *res)
write_unlock(&dev_priv->resource_lock); write_unlock(&dev_priv->resource_lock);
/* Trylock backup buffers with a NULL ticket. */ /* Trylock backup buffers with a NULL ticket. */
ret = vmw_resource_do_evict(NULL, evict_res, true); ret = vmw_resource_do_evict(NULL, evict_res, intr);
if (unlikely(ret != 0)) { if (unlikely(ret != 0)) {
write_lock(&dev_priv->resource_lock); write_lock(&dev_priv->resource_lock);
list_add_tail(&evict_res->lru_head, lru_list); list_add_tail(&evict_res->lru_head, lru_list);
...@@ -914,7 +917,7 @@ int vmw_resource_pin(struct vmw_resource *res, bool interruptible) ...@@ -914,7 +917,7 @@ int vmw_resource_pin(struct vmw_resource *res, bool interruptible)
/* Do we really need to pin the MOB as well? */ /* Do we really need to pin the MOB as well? */
vmw_bo_pin_reserved(vbo, true); vmw_bo_pin_reserved(vbo, true);
} }
ret = vmw_resource_validate(res); ret = vmw_resource_validate(res, interruptible);
if (vbo) if (vbo)
ttm_bo_unreserve(&vbo->base); ttm_bo_unreserve(&vbo->base);
if (ret) if (ret)
......
...@@ -479,7 +479,7 @@ int vmw_validation_res_validate(struct vmw_validation_context *ctx, bool intr) ...@@ -479,7 +479,7 @@ int vmw_validation_res_validate(struct vmw_validation_context *ctx, bool intr)
struct vmw_resource *res = val->res; struct vmw_resource *res = val->res;
struct vmw_buffer_object *backup = res->backup; struct vmw_buffer_object *backup = res->backup;
ret = vmw_resource_validate(res); ret = vmw_resource_validate(res, intr);
if (ret) { if (ret) {
if (ret != -ERESTARTSYS) if (ret != -ERESTARTSYS)
DRM_ERROR("Failed to validate resource.\n"); DRM_ERROR("Failed to validate resource.\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment