Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa35071c authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

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: default avatarThomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 5e5c21ca
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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;

+1 −1
Original line number Diff line number Diff line
@@ -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;

+1 −1
Original line number Diff line number Diff line
@@ -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;
	}
+9 −1
Original line number Diff line number Diff line
@@ -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) {
+4 −2
Original line number Diff line number Diff line
@@ -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;
Loading