Commit 6e6bc8c0 authored by Ramalingam C's avatar Ramalingam C
Browse files

drm/i915/gt: Optimize the migration and clear loop



Move the static calculations out of the loops for copy and clear.

v2:
  Fix the loss of proper error code on emit_pte

Signed-off-by: default avatarRamalingam C <ramalingam.c@intel.com>
Reviewed-by: default avatarThomas Hellstrom <thomas.hellstrom@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220405150840.29351-4-ramalingam.c@intel.com
parent a0ed9c95
Loading
Loading
Loading
Loading
+17 −17
Original line number Diff line number Diff line
@@ -526,6 +526,7 @@ intel_context_migrate_copy(struct intel_context *ce,
			   struct i915_request **out)
{
	struct sgt_dma it_src = sg_sgt(src), it_dst = sg_sgt(dst);
	u32 src_offset, dst_offset;
	struct i915_request *rq;
	int err;

@@ -535,8 +536,18 @@ intel_context_migrate_copy(struct intel_context *ce,

	GEM_BUG_ON(ce->ring->size < SZ_64K);

	src_offset = 0;
	dst_offset = CHUNK_SZ;
	if (HAS_64K_PAGES(ce->engine->i915)) {
		src_offset = 0;
		dst_offset = 0;
		if (src_is_lmem)
			src_offset = CHUNK_SZ;
		if (dst_is_lmem)
			dst_offset = 2 * CHUNK_SZ;
	}

	do {
		u32 src_offset, dst_offset;
		int len;

		rq = i915_request_create(ce);
@@ -564,17 +575,6 @@ intel_context_migrate_copy(struct intel_context *ce,
		if (err)
			goto out_rq;

		src_offset = 0;
		dst_offset = CHUNK_SZ;
		if (HAS_64K_PAGES(ce->engine->i915)) {
			src_offset = 0;
			dst_offset = 0;
			if (src_is_lmem)
				src_offset = CHUNK_SZ;
			if (dst_is_lmem)
				dst_offset = 2 * CHUNK_SZ;
		}

		len = emit_pte(rq, &it_src, src_cache_level, src_is_lmem,
			       src_offset, CHUNK_SZ);
		if (len <= 0) {
@@ -690,6 +690,7 @@ intel_context_migrate_clear(struct intel_context *ce,
{
	struct sgt_dma it = sg_sgt(sg);
	struct i915_request *rq;
	u32 offset;
	int err;

	GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
@@ -697,8 +698,11 @@ intel_context_migrate_clear(struct intel_context *ce,

	GEM_BUG_ON(ce->ring->size < SZ_64K);

	offset = 0;
	if (HAS_64K_PAGES(ce->engine->i915) && is_lmem)
		offset = CHUNK_SZ;

	do {
		u32 offset;
		int len;

		rq = i915_request_create(ce);
@@ -726,10 +730,6 @@ intel_context_migrate_clear(struct intel_context *ce,
		if (err)
			goto out_rq;

		offset = 0;
		if (HAS_64K_PAGES(ce->engine->i915) && is_lmem)
			offset = CHUNK_SZ;

		len = emit_pte(rq, &it, cache_level, is_lmem, offset, CHUNK_SZ);
		if (len <= 0) {
			err = len;