[Intel-gfx] [PATCH v2] drm/i915/selftests: Exercise context switching in parallel

Chris Wilson chris at chris-wilson.co.uk
Mon Sep 30 13:59:28 UTC 2019


Quoting Tvrtko Ursulin (2019-09-30 14:47:26)
> 
> On 30/09/2019 12:31, Chris Wilson wrote:
> > +static int live_parallel_switch(void *arg)
> > +{
> > +     struct drm_i915_private *i915 = arg;
> > +     static int (* const func[])(void *arg) = {
> > +             __live_parallel_switch1,
> > +             __live_parallel_switchN,
> > +             NULL,
> > +     };
> > +     struct i915_gem_context *ctx[2];
> > +     struct parallel_switch *data;
> > +     int (* const *fn)(void *arg);
> > +     struct drm_file *file;
> > +     int err = 0;
> > +     int n;
> > +
> > +     /*
> > +      * Check we can process switches on all engines simultaneously.
> > +      */
> > +
> > +     if (!DRIVER_CAPS(i915)->has_logical_contexts)
> > +             return 0;
> > +
> > +     file = mock_file(i915);
> > +     if (IS_ERR(file))
> > +             return PTR_ERR(file);
> > +
> > +     data = kcalloc(I915_NUM_ENGINES, sizeof(*data), GFP_KERNEL);
> 
> There is a little bit of mixing up I915_NUM_ENGINES and gem engines 
> (which contains the num_engines field) in this function.
> 
> I think it would be better to limit to one - so maybe get the count from 
> gem engines? It can't change during selftest so don't have to have them 
> locked for the whole time.
> 
> > +     if (!data)
> 
> mock_file_free
> 
> > +             return -ENOMEM;
> > +
> > +     for (n = 0; n < ARRAY_SIZE(ctx); n++) {
> > +             struct i915_gem_engines_iter it;
> > +             struct intel_context *ce;
> > +
> > +             mutex_lock(&i915->drm.struct_mutex);
> > +             ctx[n] = live_context(i915, file);
> > +             if (IS_ERR(ctx[n])) {
> > +                     err = PTR_ERR(ctx[n]);
> > +                     goto out_locked;
> > +             }
> > +
> > +             for_each_gem_engine(ce,
> > +                                 i915_gem_context_lock_engines(ctx[n]), it) {
> > +                     err = intel_context_pin(ce);
> > +                     if (err) {
> > +                             i915_gem_context_unlock_engines(ctx[n]);
> > +                             goto out_locked;
> > +                     }
> > +                     data[ce->engine->legacy_idx].ce[n] = ce;
> 
> IMHO a bit confusing to use legacy_idx - makes it sound like there is 
> some significance to the legacy part so why not just use engine->id?

Default engine list with legacy_idx is nice and linear, with a cap of
I915_NUM_ENGINES.

Ok, I have a weirder plan...
-Chris


More information about the Intel-gfx mailing list