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

Chris Wilson chris at chris-wilson.co.uk
Mon Sep 30 14:18:08 UTC 2019


Quoting Chris Wilson (2019-09-30 15:15:22)
> We currently test context switching on each engine as a basic stress
> test (just verifying that nothing explodes if we execute 2 requests from
> different contexts sequentially). What we have not tested is what
> happens if we try and do so on all available engines simultaneously,
> putting our SW and the HW under the maximal stress.
> 
> v2: Clone the set of engines from the first context into the secondary
> contexts.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---

> +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_engines *engines;
> +       struct i915_gem_engines_iter it;
> +       int (* const *fn)(void *arg);
> +       struct parallel_switch *data;
> +       struct i915_gem_context *ctx;
> +       struct intel_context *ce;
> +       struct drm_file *file;
> +       int n, m, count;
> +       int err = 0;
> +
> +       /*
> +        * 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);
> +
> +       mutex_lock(&i915->drm.struct_mutex);
> +
> +       ctx = live_context(i915, file);
> +       if (IS_ERR(ctx)) {
> +               err = PTR_ERR(ctx);
> +               goto out_locked;

This needs data = NULL to be safe.
...

> +       mutex_lock(&i915->drm.struct_mutex);
> +out_locked:
> +       for (n = 0; n < count; n++) {
> +               for (m = 0; m < ARRAY_SIZE(data->ce); m++) {
> +                       if (!data[n].ce[m])
> +                               continue;
> +
> +                       intel_context_unpin(data[n].ce[m]);
> +                       intel_context_put(data[n].ce[m]);
> +               }
> +       }
> +       mutex_unlock(&i915->drm.struct_mutex);
> +       kfree(data);
> +       mock_file_free(i915, file);
> +       return err;
> +}


More information about the Intel-gfx mailing list