[igt-dev] [PATCH i-g-t 68/77] igt/dummyload: Require an intel_ctx_t for POLL_RUN and !ALL_ENGINES

Jason Ekstrand jason at jlekstrand.net
Wed Jun 16 17:21:52 UTC 2021


On Tue, Jun 15, 2021 at 9:49 PM Dixit, Ashutosh
<ashutosh.dixit at intel.com> wrote:
>
> On Tue, 15 Jun 2021 19:25:01 -0700, Dixit, Ashutosh wrote:
> >
> > On Mon, 14 Jun 2021 09:38:53 -0700, Jason Ekstrand wrote:
> > >
> > > diff --git a/lib/igt_dummyload.c b/lib/igt_dummyload.c
> > > index b0a7b361c..25e49de47 100644
> > > --- a/lib/igt_dummyload.c
> > > +++ b/lib/igt_dummyload.c
> > > @@ -421,22 +421,12 @@ igt_spin_factory(int fd, const struct igt_spin_factory *opts)
> > >  {
> > >     igt_spin_t *spin;
> > >
> > > -   if (opts->engine != ALL_ENGINES) {
> > > -           struct intel_execution_engine2 e;
> > > -           int class;
> > > -
> > > -           if (opts->ctx) {
> > > -                   class = opts->ctx->cfg.engines[opts->engine].engine_class;
> > > -           } else if (!gem_context_lookup_engine(fd, opts->engine,
> > > -                                                 opts->ctx_id, &e)) {
> > > -                   class = e.class;
> > > -           } else {
> > > -                   gem_require_ring(fd, opts->engine);
> > > -                   class = gem_execbuf_flags_to_engine_class(opts->engine);
> > > -           }
> > > +   if ((opts->flags & IGT_SPIN_POLL_RUN) && opts->engine != ALL_ENGINES) {
> > > +           unsigned int class;
> > >
> > > -           if (opts->flags & IGT_SPIN_POLL_RUN)
> > > -                   igt_require(gem_class_can_store_dword(fd, class));
> > > +           igt_assert(opts->ctx);
> > > +           class = intel_ctx_engine_class(opts->ctx, opts->engine);
> > > +           igt_require(gem_class_can_store_dword(fd, class));
> > >     }
> >
> > I am not sure if this is correct. If I straightforwardly enforce opts->ctx
> > and tranform the original logic I get this:
> >
> >         if (opts->engine != ALL_ENGINES) {
> >                 int class;
> >
> >                 igt_assert(opts->ctx);
> >                 class = intel_ctx_engine_class(opts->ctx, opts->engine);
> >                 if (opts->flags & IGT_SPIN_POLL_RUN)
> >                         igt_require(gem_class_can_store_dword(fd, class));
> >         }
> >
> > or even
> >
> >         if (opts->engine != ALL_ENGINES) {
> >                 igt_assert(opts->ctx);
> >                 if (opts->flags & IGT_SPIN_POLL_RUN) {
> >                       int class = intel_ctx_engine_class(opts->ctx, opts->engine);
> >                         igt_require(gem_class_can_store_dword(fd, class));
> >               }
> >         }
> >
> > Importantly, "igt_assert(opts->ctx)" is invoked independent of opts->flags,
> > unlike the code in the patch.

Yes, that's correct.  However, if you look at the original, the only
side-effect of any of the code in the outer `if (opts->engine !=
ALL_ENGINES)` block is the `igt_require(gem_class_can_store_dword()`.
All of the rest of it exists simply to get the class.  My original
intention was to add the `igt_assert(opts->ctx)` as conservatively as
possible.

But, now that I look deeper... we have this in emit_recursive_batch()
which is called unconditionally from igt_spin_factory():

    nengine = 0;
    if (opts->engine == ALL_ENGINES) {
        struct intel_execution_engine2 *engine;

        igt_assert(opts->ctx);
        for_each_ctx_engine(fd, opts->ctx, engine) {
            if (opts->flags & IGT_SPIN_POLL_RUN &&
                !gem_class_can_store_dword(fd, engine->class))
                continue;

            flags[nengine++] = engine->flags;
        }
    } else {
        flags[nengine++] = opts->engine;
    }
    igt_require(nengine);

so I think I was being conservative for no good reason.  I'll
restructure like you suggested.

> I have another related question/observation. If what I am saying above is
> indeed true, is the "ctx_id" field in "struct igt_spin_factory" ever
> really used? If not we should delete it from the struct and we can get rid
> of these asserts.
>
> This is because I am saying above that we have an igt_assert(opts->ctx)
> above in igt_spin_factory() when "opts->engine != ALL_ENGINES" and then we
> have another igt_assert(opts->ctx) in emit_recursive_batch() when
> "opts->engine == ALL_ENGINES". So it appears we must always have
> intel_ctx_t and can never use the "ctx_id" field in "struct
> igt_spin_factory" so it should be removed.

It is gone by the end of the series.

> So appears the spinner interface will always need a intel_ctx_t (meaning
> more code changes).

At the end, it does still work with ctx0 if you use I915_EXEC_RENDER
or similar.  There are a few users of this which just want the GPU
busy for some reason.  However, the vast majority of cases use an
intel_ctx_t.

--Jason


More information about the igt-dev mailing list