diff mbox series

[i-g-t] igt/gem_eio: Preserve batch between reset-stress iterations

Message ID 20180808113137.3747-1-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [i-g-t] igt/gem_eio: Preserve batch between reset-stress iterations | expand

Commit Message

Chris Wilson Aug. 8, 2018, 11:31 a.m. UTC
We can keep the original batch around and avoid recreating it between
reset iterations to focus on the impact of resets.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
---
 tests/gem_eio.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

Comments

Tvrtko Ursulin Aug. 8, 2018, 12:38 p.m. UTC | #1
On 08/08/2018 12:31, Chris Wilson wrote:
> We can keep the original batch around and avoid recreating it between
> reset iterations to focus on the impact of resets.
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
> ---
>   tests/gem_eio.c | 30 +++++++++++++++++-------------
>   1 file changed, 17 insertions(+), 13 deletions(-)
> 
> diff --git a/tests/gem_eio.c b/tests/gem_eio.c
> index de161332d..5250a414c 100644
> --- a/tests/gem_eio.c
> +++ b/tests/gem_eio.c
> @@ -650,35 +650,38 @@ static void reset_stress(int fd,
>   			 uint32_t ctx0, unsigned int engine,
>   			 unsigned int flags)
>   {
> +	const uint32_t bbe = MI_BATCH_BUFFER_END;
> +	struct drm_i915_gem_exec_object2 obj = {
> +		.handle = gem_create(fd, 4096)
> +	};
> +	struct drm_i915_gem_execbuffer2 execbuf = {
> +		.buffers_ptr = to_user_pointer(&obj),
> +		.buffer_count = 1,
> +		.flags = engine,
> +	};
> +	gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
> +
>   	igt_until_timeout(5) {
> -		struct drm_i915_gem_execbuffer2 execbuf = { };
> -		struct drm_i915_gem_exec_object2 obj = { };
> -		uint32_t bbe = MI_BATCH_BUFFER_END;
> +		uint32_t ctx = context_create_safe(fd);

There is still this per loop...

>   		igt_spin_t *hang;
>   		unsigned int i;
> -		uint32_t ctx;
>   
>   		gem_quiescent_gpu(fd);
>   
>   		igt_require(i915_reset_control(flags & TEST_WEDGE ?
>   					       false : true));
>   
> -		ctx = context_create_safe(fd);
> -
>   		/*
>   		 * Start executing a spin batch with some queued batches
>   		 * against a different context after it.
>   		 */
>   		hang = spin_sync(fd, ctx0, engine);

... and a ton of operations in this one, so I wonder why bother with one 
batch?

>   
> -		obj.handle = gem_create(fd, 4096);
> -		gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
> +		execbuf.rsvd1 = ctx;
> +		for (i = 0; i < 10; i++)
> +			gem_execbuf(fd, &execbuf);
>   
> -		execbuf.buffers_ptr = to_user_pointer(&obj);
> -		execbuf.buffer_count = 1;
>   		execbuf.rsvd1 = ctx0;
> -		execbuf.flags = engine;
> -
>   		for (i = 0; i < 10; i++)
>   			gem_execbuf(fd, &execbuf);
>   
> @@ -706,8 +709,9 @@ static void reset_stress(int fd,
>   		gem_sync(fd, obj.handle);
>   		igt_spin_batch_free(fd, hang);
>   		gem_context_destroy(fd, ctx);
> -		gem_close(fd, obj.handle);
>   	}
> +
> +	gem_close(fd, obj.handle);
>   }
>   
>   /*
> 

But anyway - no technical complaints:

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

Regards,

Tvrtko
Chris Wilson Aug. 8, 2018, 12:47 p.m. UTC | #2
Quoting Tvrtko Ursulin (2018-08-08 13:38:53)
> 
> On 08/08/2018 12:31, Chris Wilson wrote:
> > We can keep the original batch around and avoid recreating it between
> > reset iterations to focus on the impact of resets.
> > 
> > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
> > ---
> >   tests/gem_eio.c | 30 +++++++++++++++++-------------
> >   1 file changed, 17 insertions(+), 13 deletions(-)
> > 
> > diff --git a/tests/gem_eio.c b/tests/gem_eio.c
> > index de161332d..5250a414c 100644
> > --- a/tests/gem_eio.c
> > +++ b/tests/gem_eio.c
> > @@ -650,35 +650,38 @@ static void reset_stress(int fd,
> >                        uint32_t ctx0, unsigned int engine,
> >                        unsigned int flags)
> >   {
> > +     const uint32_t bbe = MI_BATCH_BUFFER_END;
> > +     struct drm_i915_gem_exec_object2 obj = {
> > +             .handle = gem_create(fd, 4096)
> > +     };
> > +     struct drm_i915_gem_execbuffer2 execbuf = {
> > +             .buffers_ptr = to_user_pointer(&obj),
> > +             .buffer_count = 1,
> > +             .flags = engine,
> > +     };
> > +     gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
> > +
> >       igt_until_timeout(5) {
> > -             struct drm_i915_gem_execbuffer2 execbuf = { };
> > -             struct drm_i915_gem_exec_object2 obj = { };
> > -             uint32_t bbe = MI_BATCH_BUFFER_END;
> > +             uint32_t ctx = context_create_safe(fd);
> 
> There is still this per loop...

I thought that was intentional :)

It felt like the spirit of the test to try and mix up the contexts as
much as possible; one constant, one fresh.

> >               igt_spin_t *hang;
> >               unsigned int i;
> > -             uint32_t ctx;
> >   
> >               gem_quiescent_gpu(fd);
> >   
> >               igt_require(i915_reset_control(flags & TEST_WEDGE ?
> >                                              false : true));
> >   
> > -             ctx = context_create_safe(fd);
> > -
> >               /*
> >                * Start executing a spin batch with some queued batches
> >                * against a different context after it.
> >                */
> >               hang = spin_sync(fd, ctx0, engine);
> 
> ... and a ton of operations in this one, so I wonder why bother with one 
> batch?

Because I don't have spin_sync() in my pattern recognition matrix yet.
One excuse is that it doesn't have any create verb in its name, so easy
to forget its hidden costs.
-Chris
Tvrtko Ursulin Aug. 8, 2018, 12:57 p.m. UTC | #3
On 08/08/2018 13:47, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2018-08-08 13:38:53)
>>
>> On 08/08/2018 12:31, Chris Wilson wrote:
>>> We can keep the original batch around and avoid recreating it between
>>> reset iterations to focus on the impact of resets.
>>>
>>> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
>>> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
>>> ---
>>>    tests/gem_eio.c | 30 +++++++++++++++++-------------
>>>    1 file changed, 17 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/tests/gem_eio.c b/tests/gem_eio.c
>>> index de161332d..5250a414c 100644
>>> --- a/tests/gem_eio.c
>>> +++ b/tests/gem_eio.c
>>> @@ -650,35 +650,38 @@ static void reset_stress(int fd,
>>>                         uint32_t ctx0, unsigned int engine,
>>>                         unsigned int flags)
>>>    {
>>> +     const uint32_t bbe = MI_BATCH_BUFFER_END;
>>> +     struct drm_i915_gem_exec_object2 obj = {
>>> +             .handle = gem_create(fd, 4096)
>>> +     };
>>> +     struct drm_i915_gem_execbuffer2 execbuf = {
>>> +             .buffers_ptr = to_user_pointer(&obj),
>>> +             .buffer_count = 1,
>>> +             .flags = engine,
>>> +     };
>>> +     gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
>>> +
>>>        igt_until_timeout(5) {
>>> -             struct drm_i915_gem_execbuffer2 execbuf = { };
>>> -             struct drm_i915_gem_exec_object2 obj = { };
>>> -             uint32_t bbe = MI_BATCH_BUFFER_END;
>>> +             uint32_t ctx = context_create_safe(fd);
>>
>> There is still this per loop...
> 
> I thought that was intentional :)
> 
> It felt like the spirit of the test to try and mix up the contexts as
> much as possible; one constant, one fresh.

Yes definitely intentional (required), I was just puzzled why you are 
concerned with removing one gem_create when we have more ioctls in the 
loop anyway.

> 
>>>                igt_spin_t *hang;
>>>                unsigned int i;
>>> -             uint32_t ctx;
>>>    
>>>                gem_quiescent_gpu(fd);
>>>    
>>>                igt_require(i915_reset_control(flags & TEST_WEDGE ?
>>>                                               false : true));
>>>    
>>> -             ctx = context_create_safe(fd);
>>> -
>>>                /*
>>>                 * Start executing a spin batch with some queued batches
>>>                 * against a different context after it.
>>>                 */
>>>                hang = spin_sync(fd, ctx0, engine);
>>
>> ... and a ton of operations in this one, so I wonder why bother with one
>> batch?
> 
> Because I don't have spin_sync() in my pattern recognition matrix yet.
> One excuse is that it doesn't have any create verb in its name, so easy
> to forget its hidden costs.

Okay. :) I blame the poor name on it being local. :)


Regards,

Tvrtko
Chris Wilson Aug. 8, 2018, 2:19 p.m. UTC | #4
Quoting Tvrtko Ursulin (2018-08-08 13:57:56)
> 
> On 08/08/2018 13:47, Chris Wilson wrote:
> > Quoting Tvrtko Ursulin (2018-08-08 13:38:53)
> >>
> >> On 08/08/2018 12:31, Chris Wilson wrote:
> >>>        igt_until_timeout(5) {
> >>> -             struct drm_i915_gem_execbuffer2 execbuf = { };
> >>> -             struct drm_i915_gem_exec_object2 obj = { };
> >>> -             uint32_t bbe = MI_BATCH_BUFFER_END;
> >>> +             uint32_t ctx = context_create_safe(fd);
> >>
> >> There is still this per loop...
> > 
> > I thought that was intentional :)
> > 
> > It felt like the spirit of the test to try and mix up the contexts as
> > much as possible; one constant, one fresh.
> 
> Yes definitely intentional (required), I was just puzzled why you are 
> concerned with removing one gem_create when we have more ioctls in the 
> loop anyway.

Low hanging fruit. Besides, I would cache the context objects if someone
would just turn a blind eye.
-Chris
diff mbox series

Patch

diff --git a/tests/gem_eio.c b/tests/gem_eio.c
index de161332d..5250a414c 100644
--- a/tests/gem_eio.c
+++ b/tests/gem_eio.c
@@ -650,35 +650,38 @@  static void reset_stress(int fd,
 			 uint32_t ctx0, unsigned int engine,
 			 unsigned int flags)
 {
+	const uint32_t bbe = MI_BATCH_BUFFER_END;
+	struct drm_i915_gem_exec_object2 obj = {
+		.handle = gem_create(fd, 4096)
+	};
+	struct drm_i915_gem_execbuffer2 execbuf = {
+		.buffers_ptr = to_user_pointer(&obj),
+		.buffer_count = 1,
+		.flags = engine,
+	};
+	gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
+
 	igt_until_timeout(5) {
-		struct drm_i915_gem_execbuffer2 execbuf = { };
-		struct drm_i915_gem_exec_object2 obj = { };
-		uint32_t bbe = MI_BATCH_BUFFER_END;
+		uint32_t ctx = context_create_safe(fd);
 		igt_spin_t *hang;
 		unsigned int i;
-		uint32_t ctx;
 
 		gem_quiescent_gpu(fd);
 
 		igt_require(i915_reset_control(flags & TEST_WEDGE ?
 					       false : true));
 
-		ctx = context_create_safe(fd);
-
 		/*
 		 * Start executing a spin batch with some queued batches
 		 * against a different context after it.
 		 */
 		hang = spin_sync(fd, ctx0, engine);
 
-		obj.handle = gem_create(fd, 4096);
-		gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
+		execbuf.rsvd1 = ctx;
+		for (i = 0; i < 10; i++)
+			gem_execbuf(fd, &execbuf);
 
-		execbuf.buffers_ptr = to_user_pointer(&obj);
-		execbuf.buffer_count = 1;
 		execbuf.rsvd1 = ctx0;
-		execbuf.flags = engine;
-
 		for (i = 0; i < 10; i++)
 			gem_execbuf(fd, &execbuf);
 
@@ -706,8 +709,9 @@  static void reset_stress(int fd,
 		gem_sync(fd, obj.handle);
 		igt_spin_batch_free(fd, hang);
 		gem_context_destroy(fd, ctx);
-		gem_close(fd, obj.handle);
 	}
+
+	gem_close(fd, obj.handle);
 }
 
 /*