[igt-dev] [PATCH i-g-t v2 5/5] tests/gem_exec_parallel: Avoid acquiring offset for overlapping handle

Kamil Konieczny kamil.konieczny at linux.intel.com
Tue Dec 6 17:06:21 UTC 2022


Hi Zbigniew,

On 2022-12-05 at 21:27:08 +0100, Zbigniew Kempczyński wrote:
> Subtest @fds incorporates objects created in some context in new context
-------------- ^ -------------------------------------------- ^
Looks a little unclear, maybe:
takes objects and reuse them in new context

Also try to keep in 65 chars per line in commit description.

> created on new (reopened) drm fd. This might lead to clash handles
> (same handle created over different fd,ctx) so acquiring offsets from
> stateful allocator (reloc is from now on stateful for alloc()/free()
> ops) might lead to bind same offset for two different objects. Lets

Maybe these shows some value in having incremental allocator
like old reloc ? Or using here random allocator ? Just curious.

> use some artificial (last max handle + 1) handle for bb to avoid offset
> overlapping.
> 

With that fixed

Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>

Regards,
Kamil

> Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> ---
>  tests/i915/gem_exec_parallel.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/i915/gem_exec_parallel.c b/tests/i915/gem_exec_parallel.c
> index 730fc4a672..429620884b 100644
> --- a/tests/i915/gem_exec_parallel.c
> +++ b/tests/i915/gem_exec_parallel.c
> @@ -75,7 +75,7 @@ static void *thread(void *data)
>  	struct drm_i915_gem_relocation_entry reloc;
>  	struct drm_i915_gem_execbuffer2 execbuf;
>  	const intel_ctx_t *tmp_ctx = NULL;
> -	uint64_t offset;
> +	uint64_t offset, bb_offset;
>  	uint32_t batch[16];
>  	uint16_t used;
>  	int fd, i;
> @@ -136,6 +136,18 @@ static void *thread(void *data)
>  		execbuf.rsvd1 = t->ctx->id;
>  	}
>  
> +	/*
> +	 * For FDS we have new drm fd, what means gem_create() for bb returns
> +	 * handle == 1. As we're using objects from other fd it would overlap,
> +	 * thus we need to acquire offset for bb from last handle + 1.
> +	 * Other cases are within same fd, so obj[1].handle will be distinguish
> +	 * anyway.
> +	 */
> +	if (t->flags & FDS)
> +		bb_offset = get_offset(t->ahnd, t->scratch[NUMOBJ - 1] + 1, 4096, 0);
> +	else
> +		bb_offset = get_offset(t->ahnd, obj[1].handle, 4096, 0);
> +
>  	used = 0;
>  	igt_until_timeout(1) {
>  		unsigned int x = rand() % NUMOBJ;
> @@ -154,7 +166,7 @@ static void *thread(void *data)
>  			obj[0].offset = offset;
>  			obj[0].flags |= EXEC_OBJECT_PINNED | EXEC_OBJECT_WRITE |
>  					EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
> -			obj[1].offset = get_offset(t->ahnd, obj[1].handle, 4096, 0);
> +			obj[1].offset = bb_offset;
>  			obj[1].flags |= EXEC_OBJECT_PINNED | EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
>  			gem_write(fd, obj[1].handle, 0, batch, sizeof(batch));
>  		}
> -- 
> 2.34.1
> 


More information about the igt-dev mailing list