[Intel-gfx] [PATCH 15/25] drm/i915/selftests: Perform some basic cycle counting of MI ops

Chris Wilson chris at chris-wilson.co.uk
Mon Nov 11 17:16:29 UTC 2019


Quoting Matthew Auld (2019-11-11 17:10:37)
> On Sun, 10 Nov 2019 at 18:58, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> > +static struct i915_vma *create_empty_batch(struct intel_context *ce)
> > +{
> > +       struct drm_i915_gem_object *obj;
> > +       struct i915_vma *vma;
> > +       u32 *cs;
> > +       int err;
> > +
> > +       obj = i915_gem_object_create_internal(ce->engine->i915, PAGE_SIZE);
> > +       if (IS_ERR(obj))
> > +               return ERR_CAST(obj);
> > +
> > +       cs = i915_gem_object_pin_map(obj, I915_MAP_WB);
> > +       if (IS_ERR(cs)) {
> > +               i915_gem_object_put(obj);
> > +               return ERR_CAST(cs);
> > +       }
> > +
> > +       cs[0] = MI_BATCH_BUFFER_END;
> > +
> > +       i915_gem_object_flush_map(obj);
> > +       i915_gem_object_unpin_map(obj);
> > +
> > +       vma = i915_vma_instance(obj, ce->vm, NULL);
> > +       if (IS_ERR(vma)) {
> > +               i915_gem_object_put(obj);
> > +               return vma;
> > +       }
> > +
> > +       err = i915_vma_pin(vma, 0, 0, PIN_USER);
> > +       if (err) {
> > +               i915_gem_object_put(obj);
> > +               return ERR_PTR(err);
> > +       }
> 
> Living dangerously? Object is volatile, below also.

What's a shrinker? :)

> > +               for (i = 0; i < ARRAY_SIZE(cycles); i++) {
> > +                       struct i915_request *rq;
> > +
> > +                       rq = i915_request_create(ce);
> > +                       if (IS_ERR(rq)) {
> > +                               err = PTR_ERR(rq);
> > +                               break;
> > +                       }
> > +
> > +                       err = write_timestamp(rq, 2);
> > +                       if (err)
> > +                               goto out;
> > +
> > +                       err = rq->engine->emit_bb_start(rq,
> > +                                                       base->node.start, 8,
> > +                                                       0);
> > +                       if (err)
> > +                               goto out;
> > +
> > +                       err = write_timestamp(rq, 3);
> > +                       if (err)
> > +                               goto out;
> > +
> > +                       err = rq->engine->emit_bb_start(rq,
> > +                                                       nop->node.start, 4096,
> 
> That should be 64K? Can't we just make these node.size?

Not like the test can run on gen2 anyway :)

> Also why do we measure both empty + nop here?

So the test is standalone; we subtract the overhead of the MI_BB_START
from the measurement, otherwise the overhead would dominate.
-Chris


More information about the Intel-gfx mailing list