diff mbox series

[i-g-t] i915/gem_exec_nop: Keep a copy of the names

Message ID 20200211003742.863630-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [i-g-t] i915/gem_exec_nop: Keep a copy of the names | expand

Commit Message

Chris Wilson Feb. 11, 2020, 12:37 a.m. UTC
The engine names are now stored inside the iterator and not as static
strings. If we wish to use them later, we need to make a copy.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 tests/i915/gem_exec_nop.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Andi Shyti Feb. 11, 2020, 12:42 a.m. UTC | #1
Hi Chris,

On Tue, Feb 11, 2020 at 12:37:42AM +0000, Chris Wilson wrote:
> The engine names are now stored inside the iterator and not as static
> strings. If we wish to use them later, we need to make a copy.

But we are not using them later. Your patch just copies and frees
an array.

Is there a follow-up?

Andi

> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
>  tests/i915/gem_exec_nop.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/tests/i915/gem_exec_nop.c b/tests/i915/gem_exec_nop.c
> index ed9568e5a..fc7f11827 100644
> --- a/tests/i915/gem_exec_nop.c
> +++ b/tests/i915/gem_exec_nop.c
> @@ -436,7 +436,7 @@ static void parallel(int fd, uint32_t handle, int timeout)
>  	struct drm_i915_gem_execbuffer2 execbuf;
>  	struct drm_i915_gem_exec_object2 obj;
>  	unsigned engines[16];
> -	const char *names[16];
> +	char *names[16];
>  	unsigned nengine;
>  	unsigned long count;
>  	double time, sum;
> @@ -445,7 +445,7 @@ static void parallel(int fd, uint32_t handle, int timeout)
>  	nengine = 0;
>  	__for_each_physical_engine(fd, e) {
>  		engines[nengine] = e->flags;
> -		names[nengine++] = e->name;
> +		names[nengine++] = strdup(e->name);
>  
>  		time = nop_on_ring(fd, handle, e, 1, &count) / count;
>  		sum += time;
> @@ -485,10 +485,11 @@ static void parallel(int fd, uint32_t handle, int timeout)
>  		time = elapsed(&start, &now) / count;
>  		igt_info("%s: %ld cycles, %.3fus\n", names[child], count, 1e6*time);
>  	}
> +	while (nengine--)
> +		free(names[nengine]);
>  
>  	igt_waitchildren();
>  	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
> -
>  }
>  
>  static void series(int fd, uint32_t handle, int timeout)
> -- 
> 2.25.0
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
Chris Wilson Feb. 11, 2020, 10:37 a.m. UTC | #2
Quoting Andi Shyti (2020-02-11 00:42:55)
> Hi Chris,
> 
> On Tue, Feb 11, 2020 at 12:37:42AM +0000, Chris Wilson wrote:
> > The engine names are now stored inside the iterator and not as static
> > strings. If we wish to use them later, we need to make a copy.
> 
> But we are not using them later. Your patch just copies and frees
> an array.

They are used inside an igt_info() in the child processes. Output at the
moment is quite strange.
-Chris
Tvrtko Ursulin Feb. 11, 2020, 1 p.m. UTC | #3
On 11/02/2020 10:37, Chris Wilson wrote:
> Quoting Andi Shyti (2020-02-11 00:42:55)
>> Hi Chris,
>>
>> On Tue, Feb 11, 2020 at 12:37:42AM +0000, Chris Wilson wrote:
>>> The engine names are now stored inside the iterator and not as static
>>> strings. If we wish to use them later, we need to make a copy.
>>
>> But we are not using them later. Your patch just copies and frees
>> an array.
> 
> They are used inside an igt_info() in the child processes. Output at the
> moment is quite strange.

I also don't get this - child has a copy of everything how can it not work?

Regards,

Tvrtko
Chris Wilson Feb. 11, 2020, 1:05 p.m. UTC | #4
Quoting Tvrtko Ursulin (2020-02-11 13:00:19)
> 
> On 11/02/2020 10:37, Chris Wilson wrote:
> > Quoting Andi Shyti (2020-02-11 00:42:55)
> >> Hi Chris,
> >>
> >> On Tue, Feb 11, 2020 at 12:37:42AM +0000, Chris Wilson wrote:
> >>> The engine names are now stored inside the iterator and not as static
> >>> strings. If we wish to use them later, we need to make a copy.
> >>
> >> But we are not using them later. Your patch just copies and frees
> >> an array.
> > 
> > They are used inside an igt_info() in the child processes. Output at the
> > moment is quite strange.
> 
> I also don't get this - child has a copy of everything how can it not work?

A copy of what? The intel_engine_data is scoped to the for_each_engine
loop. We're leaking pointers to locations on stack, so they get
clobbered and we print garbage in %s.
-Chris
Tvrtko Ursulin Feb. 11, 2020, 1:21 p.m. UTC | #5
On 11/02/2020 13:05, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2020-02-11 13:00:19)
>>
>> On 11/02/2020 10:37, Chris Wilson wrote:
>>> Quoting Andi Shyti (2020-02-11 00:42:55)
>>>> Hi Chris,
>>>>
>>>> On Tue, Feb 11, 2020 at 12:37:42AM +0000, Chris Wilson wrote:
>>>>> The engine names are now stored inside the iterator and not as static
>>>>> strings. If we wish to use them later, we need to make a copy.
>>>>
>>>> But we are not using them later. Your patch just copies and frees
>>>> an array.
>>>
>>> They are used inside an igt_info() in the child processes. Output at the
>>> moment is quite strange.
>>
>> I also don't get this - child has a copy of everything how can it not work?
> 
> A copy of what? The intel_engine_data is scoped to the for_each_engine
> loop. We're leaking pointers to locations on stack, so they get
> clobbered and we print garbage in %s.

I misread the the patch while glancing it as forking being done inside 
the for_engine_loop.

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
diff mbox series

Patch

diff --git a/tests/i915/gem_exec_nop.c b/tests/i915/gem_exec_nop.c
index ed9568e5a..fc7f11827 100644
--- a/tests/i915/gem_exec_nop.c
+++ b/tests/i915/gem_exec_nop.c
@@ -436,7 +436,7 @@  static void parallel(int fd, uint32_t handle, int timeout)
 	struct drm_i915_gem_execbuffer2 execbuf;
 	struct drm_i915_gem_exec_object2 obj;
 	unsigned engines[16];
-	const char *names[16];
+	char *names[16];
 	unsigned nengine;
 	unsigned long count;
 	double time, sum;
@@ -445,7 +445,7 @@  static void parallel(int fd, uint32_t handle, int timeout)
 	nengine = 0;
 	__for_each_physical_engine(fd, e) {
 		engines[nengine] = e->flags;
-		names[nengine++] = e->name;
+		names[nengine++] = strdup(e->name);
 
 		time = nop_on_ring(fd, handle, e, 1, &count) / count;
 		sum += time;
@@ -485,10 +485,11 @@  static void parallel(int fd, uint32_t handle, int timeout)
 		time = elapsed(&start, &now) / count;
 		igt_info("%s: %ld cycles, %.3fus\n", names[child], count, 1e6*time);
 	}
+	while (nengine--)
+		free(names[nengine]);
 
 	igt_waitchildren();
 	igt_assert_eq(intel_detect_and_clear_missed_interrupts(fd), 0);
-
 }
 
 static void series(int fd, uint32_t handle, int timeout)