[Intel-gfx] [PATCH 35/37] drm/i915: Live testing for context execution
Chris Wilson
chris at chris-wilson.co.uk
Fri Jan 13 18:35:17 UTC 2017
On Fri, Jan 13, 2017 at 04:28:58PM +0200, Joonas Lahtinen wrote:
> On ke, 2017-01-11 at 21:09 +0000, Chris Wilson wrote:
> <SNIP>
>
> For future synchronization purposes, maybe document where the below was
> cloned from?
It is a routine I've written many times.
> > + offset = PAGE_SIZE * first_page + offset_in_page;
> > + offset += vma->node.start;
> > + for (sz = 0; sz < count; sz++) {
> > + if (gen >= 8) {
> > + *cmd++ = MI_STORE_DWORD_IMM_GEN4;
> > + *cmd++ = lower_32_bits(offset);
> > + *cmd++ = upper_32_bits(offset);
> > + *cmd++ = value;
> > + } else if (gen >= 6) {
> > + *cmd++ = MI_STORE_DWORD_IMM_GEN4;
> > + *cmd++ = 0;
> > + *cmd++ = offset;
> > +static int gpu_fill(struct drm_i915_gem_object *obj,
> > + struct i915_gem_context *ctx)
> > +{
> > + struct drm_i915_private *i915 = to_i915(obj->base.dev);
> > + const unsigned long npages = obj->base.size >> PAGE_SHIFT;
> > + struct i915_address_space *vm = ctx->ppgtt ? &ctx->ppgtt->base : &i915->ggtt.base;
>
> vm = &(ctx->ppgtt ?: &i915->ggtt)->base? Or does GCC bork up.
Different types, gcc doesn't like them inside the ternary.
> Long line anyway.
>
> > + struct intel_engine_cs *engine = i915->engine[RCS];
>
> rcs_fill as function name (rcs_fill_pages too)?
Now using all engines. Just let me be lazy, just once?
> > + err = i915_gem_object_set_to_gtt_domain(obj, false);
>
> Isn't the object most definitely going to be written by GPU?
Yes. But, before we begin I want any CPU writes to be flushed to memory
(if not LLC).
> > +
> > + err = i915_vma_pin(vma, 0, 0, PIN_USER);
> > + if (err)
> > + return err;
> > +
> > + GEM_BUG_ON(!IS_ALIGNED(npages, 1024));
>
> Ok, #define time 1024 is a very magicy.
You're going to love the replacement magic. No spoilers I'm afraid.
> > + }
> > +
> > + i915_switch_context(rq);
>
> GEM_BUG_ON(rq->engine != engine) to help readability.
Don't see how that helps readibility. That's a check that should in the
earlier request construction tests.
> This all makes me think how strange our internal API actually is.
Yes.
> > +
> > + ww_mutex_lock(&obj->resv->lock, NULL);
> > + reservation_object_add_excl_fence(obj->resv, &rq->fence);
>
> Wasn't there a patch not to mess with the reservation internals (aka,
> wrap it?)
My bad, I keep thinking that it is still private to my tree.
> > + ww_mutex_unlock(&obj->resv->lock);
> > +
> > + __i915_add_request(rq, true);
> > + }
>
> I imagine this work submission helper might come in handy as a separate
> thing?
Not quite yet. But something like this. Kind of waiting for more users
plus. There are some quirks that need some care to avoid upsetting
random tests.
> > + for (n = 0; !err && n < 1024; n++) {
> > + u32 *map;
> > +
> > + map = kmap_atomic(i915_gem_object_get_page(obj, n));
>
> Does some test check the kmap works?
No, it's documented as "just works". So if it doesn't we have plenty of
explosions every where.
> > +static int igt_ctx_exec(void *arg)
> > +{
>
> <SNIP>
>
> > + mutex_lock(&i915->drm.struct_mutex);
> > + while (!time_after(jiffies, end_time)) {
>
> Time budgeted function?
>
> > + vm = ctx->ppgtt ? &ctx->ppgtt->base : &i915->ggtt.base;
> > + npages = min(vm->total / 2, 1024ull * 1024 * PAGE_SIZE);
> > + npages >>= PAGE_SHIFT + 10;
> > + npages <<= PAGE_SHIFT + 10;
>
> What? Comment please.
Drop the low 22 bits. What, you'd rather have round_down()? Heresy!
> > + count = 0;
> > + list_for_each_entry(obj, &objects, batch_pool_link) {
> > + if (!err)
> > + err = cpu_check(obj, count);
>
> break; count is not used after this point, so why does it matter after?
It was freeing objects until the fake_file trick.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list