mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
drm/ttm: optionally move duplicates to a separate list
This patch adds an optional list_head parameter to ttm_eu_reserve_buffers. If specified duplicates in the execbuf list are no longer reported as errors, but moved to this list instead. Reviewed-by: Thomas Hellstrom <[email protected]> Signed-off-by: Christian König <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
This commit is contained in:
parent
5e5c21cac1
commit
aa35071c59
7 changed files with 26 additions and 8 deletions
|
|
@ -264,7 +264,8 @@ int qxl_release_reserve_list(struct qxl_release *release, bool no_intr)
|
|||
if (list_is_singular(&release->bos))
|
||||
return 0;
|
||||
|
||||
ret = ttm_eu_reserve_buffers(&release->ticket, &release->bos, !no_intr);
|
||||
ret = ttm_eu_reserve_buffers(&release->ticket, &release->bos,
|
||||
!no_intr, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
|
|
|||
|
|
@ -564,7 +564,7 @@ static void radeon_gem_va_update_vm(struct radeon_device *rdev,
|
|||
if (!vm_bos)
|
||||
return;
|
||||
|
||||
r = ttm_eu_reserve_buffers(&ticket, &list, true);
|
||||
r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
|
||||
if (r)
|
||||
goto error_free;
|
||||
|
||||
|
|
|
|||
|
|
@ -508,7 +508,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
|
|||
u64 bytes_moved = 0, initial_bytes_moved;
|
||||
u64 bytes_moved_threshold = radeon_bo_get_threshold_for_moves(rdev);
|
||||
|
||||
r = ttm_eu_reserve_buffers(ticket, head, true);
|
||||
r = ttm_eu_reserve_buffers(ticket, head, true, NULL);
|
||||
if (unlikely(r != 0)) {
|
||||
return r;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,7 +93,8 @@ EXPORT_SYMBOL(ttm_eu_backoff_reservation);
|
|||
*/
|
||||
|
||||
int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
|
||||
struct list_head *list, bool intr)
|
||||
struct list_head *list, bool intr,
|
||||
struct list_head *dups)
|
||||
{
|
||||
struct ttm_bo_global *glob;
|
||||
struct ttm_validate_buffer *entry;
|
||||
|
|
@ -117,6 +118,13 @@ int ttm_eu_reserve_buffers(struct ww_acquire_ctx *ticket,
|
|||
__ttm_bo_unreserve(bo);
|
||||
|
||||
ret = -EBUSY;
|
||||
|
||||
} else if (ret == -EALREADY && dups) {
|
||||
struct ttm_validate_buffer *safe = entry;
|
||||
entry = list_prev_entry(entry, head);
|
||||
list_del(&safe->head);
|
||||
list_add(&safe->head, dups);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
|
|
|
|||
|
|
@ -2487,7 +2487,8 @@ int vmw_execbuf_process(struct drm_file *file_priv,
|
|||
if (unlikely(ret != 0))
|
||||
goto out_err_nores;
|
||||
|
||||
ret = ttm_eu_reserve_buffers(&ticket, &sw_context->validate_nodes, true);
|
||||
ret = ttm_eu_reserve_buffers(&ticket, &sw_context->validate_nodes,
|
||||
true, NULL);
|
||||
if (unlikely(ret != 0))
|
||||
goto out_err;
|
||||
|
||||
|
|
@ -2677,7 +2678,8 @@ void __vmw_execbuf_release_pinned_bo(struct vmw_private *dev_priv,
|
|||
query_val.shared = false;
|
||||
list_add_tail(&query_val.head, &validate_list);
|
||||
|
||||
ret = ttm_eu_reserve_buffers(&ticket, &validate_list, false);
|
||||
ret = ttm_eu_reserve_buffers(&ticket, &validate_list,
|
||||
false, NULL);
|
||||
if (unlikely(ret != 0)) {
|
||||
vmw_execbuf_unpin_panic(dev_priv);
|
||||
goto out_no_reserve;
|
||||
|
|
|
|||
|
|
@ -1222,7 +1222,7 @@ vmw_resource_check_buffer(struct vmw_resource *res,
|
|||
val_buf->bo = ttm_bo_reference(&res->backup->base);
|
||||
val_buf->shared = false;
|
||||
list_add_tail(&val_buf->head, &val_list);
|
||||
ret = ttm_eu_reserve_buffers(NULL, &val_list, interruptible);
|
||||
ret = ttm_eu_reserve_buffers(NULL, &val_list, interruptible, NULL);
|
||||
if (unlikely(ret != 0))
|
||||
goto out_no_reserve;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue