[Intel-gfx] [PATCH i-g-t 2/2] tests/perf_pmu: Exercise busy stats and lite-restore

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Wed Jan 10 10:37:51 UTC 2018


On 09/01/2018 21:39, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2018-01-09 16:16:21)
>> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>>
>> While developing a fix for an accounting hole in busy stats we realized
>> lite-restore is a potential edge case which would be interesting to check
>> is properly handled.
>>
>> It is unfortnately quite timing sensitive to hit lite-restore in the
>> fashion test needs, so downside of this test is that it sufferes from a
>> high rate of false negatives.
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>> ---
>>   tests/perf_pmu.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 85 insertions(+)
>>
>> diff --git a/tests/perf_pmu.c b/tests/perf_pmu.c
>> index e1f449d48808..7db5059d202e 100644
>> --- a/tests/perf_pmu.c
>> +++ b/tests/perf_pmu.c
>> @@ -192,6 +192,84 @@ busy_start(int gem_fd, const struct intel_execution_engine2 *e)
>>          gem_quiescent_gpu(gem_fd);
>>   }
>>   
>> +/*
>> + * This test has a potentially low rate of catching the issue it is trying to
>> + * catch. Or in other words, quite high rate of false negative successes. We
>> + * will depend on the CI systems running it a lot to detect issues.
>> + */
>> +static void
>> +busy_double_start(int gem_fd, const struct intel_execution_engine2 *e)
>> +{
>> +       unsigned long slept;
>> +       igt_spin_t *spin[2];
>> +       uint64_t val, val2;
>> +       bool execlists;
>> +       uint32_t ctx;
>> +       int fd;
>> +
>> +       ctx = gem_context_create(gem_fd);
>> +
>> +       if (gem_has_execlists(gem_fd)) {
>> +               /*
>> +                * Defeat the busy stats delayed disable, we need to guarantee
>> +                * we are the first user.
>> +                */
>> +               execlists = true;
>> +               sleep(2);
>> +       } else {
>> +               execlists = false;
>> +       }
>> +
>> +       /*
>> +        * Submit two contexts, with a pause in between targeting the ELSP
>> +        * re-submission in execlists mode. Make sure busyness is correctly
>> +        * reported with the engine busy, and after the engine went idle.
>> +        */
>> +       spin[0] = __igt_spin_batch_new(gem_fd, 0, e2ring(gem_fd, e), 0);
>> +       usleep(500000);
>> +       spin[1] = __igt_spin_batch_new(gem_fd, ctx, e2ring(gem_fd, e), 0);
> 
> If you want to avoid the second spinner, you can resubmit the first with
> a second context.

I know you like that but I prefer the pedestrian way. :)

>> +       /*
>> +        * Open PMU as fast as possible after the second spin batch in attempt
>> +        * to be faster than the driver handling lite-restore.
>> +        */
>> +       fd = open_pmu(I915_PMU_ENGINE_BUSY(e->class, e->instance));
>> +
>> +       slept = measured_usleep(batch_duration_ns / 1000);
>> +       val = pmu_read_single(fd);
>> +
>> +       igt_spin_batch_end(spin[0]);
>> +       igt_spin_batch_end(spin[1]);
>> +
>> +       gem_sync(gem_fd, spin[0]->handle);
>> +       gem_sync(gem_fd, spin[1]->handle);
>> +
>> +       /* Wait for context complete to avoid accounting residual busyness. */
>> +       if (execlists)
>> +               usleep(100000);
> 
> Then you want a gem_quiescent_gpu() instead of the gem_sync()? Though
> I'm scratching my head here as to what you mean. If there's an issue
> here, won't we see it in our other measurements as well?

Primarily because we want to measure idle after busy here and not in 
other tests, *and*, with execlists time between user interrupt and 
context save counts as busyness. So without this delay it is possible to 
observe a few micro-second of engine busyness in the below check.

>> +       val2 = pmu_read_single(fd);
>> +       usleep(batch_duration_ns / 1000);
>> +       val2 = pmu_read_single(fd) - val2;
> 
> But the engine is idle at this point? Why sleep for execlists and not
> legacy? Isn't the execlists case where we know that just by waiting for
> idle (gem_quiescent_gpu() not an arbitrary usleep) then the pmu counter
> is idle. It's legacy where we would have to wait for an sample interval
> following gpu idle to be sure the pmu is idle.

Hm legacy and sampling.. I think we don't have to wait since there is no 
context save there is the idleness comes straight with the user 
interrupt, or no?

> I think I half understand what you want to assert (an idle gpu after
> being busy, reports idle?) but I'm not entirely sure. :)

Yep!

Regards,

Tvrtko


More information about the Intel-gfx mailing list