drm/vmwgfx: Modify the resource validation interface
Allow selecting interruptible or uninterruptible waits to match expectations of callers. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Deepak Rawat <drawat@vmware.com> Reviewed-by: Sinclair Yeh <syeh@vmware.com>
This commit is contained in:
Родитель
038ecc5032
Коммит
84e1bf06bc
|
@ -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_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,
|
||||
bool no_backup);
|
||||
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)
|
|||
struct vmw_resource *res = val->res;
|
||||
struct vmw_buffer_object *backup = res->backup;
|
||||
|
||||
ret = vmw_resource_validate(res);
|
||||
ret = vmw_resource_validate(res, true);
|
||||
if (unlikely(ret != 0)) {
|
||||
if (ret != -ERESTARTSYS)
|
||||
DRM_ERROR("Failed to validate resource.\n");
|
||||
|
|
|
@ -2713,7 +2713,7 @@ int vmw_kms_helper_resource_prepare(struct vmw_resource *res,
|
|||
|
||||
ctx->buf = vmw_bo_reference(res->backup);
|
||||
}
|
||||
ret = vmw_resource_validate(res);
|
||||
ret = vmw_resource_validate(res, interruptible);
|
||||
if (ret)
|
||||
goto out_revert;
|
||||
return 0;
|
||||
|
|
|
@ -587,15 +587,18 @@ out_no_unbind:
|
|||
/**
|
||||
* vmw_resource_validate - Make a resource up-to-date and visible
|
||||
* 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
|
||||
* be reserved and validated.
|
||||
* On hardware resource shortage, this function will repeatedly evict
|
||||
* 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;
|
||||
struct vmw_resource *evict_res;
|
||||
|
@ -633,7 +636,7 @@ int vmw_resource_validate(struct vmw_resource *res)
|
|||
write_unlock(&dev_priv->resource_lock);
|
||||
|
||||
/* 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)) {
|
||||
write_lock(&dev_priv->resource_lock);
|
||||
list_add_tail(&evict_res->lru_head, lru_list);
|
||||
|
@ -914,7 +917,7 @@ int vmw_resource_pin(struct vmw_resource *res, bool interruptible)
|
|||
/* Do we really need to pin the MOB as well? */
|
||||
vmw_bo_pin_reserved(vbo, true);
|
||||
}
|
||||
ret = vmw_resource_validate(res);
|
||||
ret = vmw_resource_validate(res, interruptible);
|
||||
if (vbo)
|
||||
ttm_bo_unreserve(&vbo->base);
|
||||
if (ret)
|
||||
|
|
|
@ -479,7 +479,7 @@ int vmw_validation_res_validate(struct vmw_validation_context *ctx, bool intr)
|
|||
struct vmw_resource *res = val->res;
|
||||
struct vmw_buffer_object *backup = res->backup;
|
||||
|
||||
ret = vmw_resource_validate(res);
|
||||
ret = vmw_resource_validate(res, intr);
|
||||
if (ret) {
|
||||
if (ret != -ERESTARTSYS)
|
||||
DRM_ERROR("Failed to validate resource.\n");
|
||||
|
|
Загрузка…
Ссылка в новой задаче