[Intel-gfx] [PATCH 04/11] drm/i915: Generalise GPU activity tracking
Chris Wilson
chris at chris-wilson.co.uk
Wed Jan 30 12:14:11 UTC 2019
Quoting Tvrtko Ursulin (2019-01-30 12:02:02)
>
> On 30/01/2019 02:18, Chris Wilson wrote:
> > +struct active_node {
> > + struct i915_gem_active base;
> > + struct i915_active *ref;
> > + struct rb_node node;
> > + u64 timeline;
> > +};
> > +
> > +static void
> > +__active_retire(struct i915_active *ref)
> > +{
>
> You wouldn't consider naming this variable 'active' throughout? Ref
> reminds me so much of a kref eg. fence->refcount. Although 'active' has
> been used for gem_active so far. Not a blocker though, I'll get used to it.
Similarity to kref wasn't a coincidence, because we also use the concept
of active reference for this as well.
I'm not sold on the name yet. I liked active_tracker but thought that
was slightly too long for something I expect to be fairly ubiquitous.
struct reservation_object, I don't like because reservation is a phase
before building the request.
i915_shared_fence and i915_exclusive_fence; maybe? But fences tend to
be the single-shot, aka i915_request.
i915_hedgerow. I'm being silly now.
If only I can come up with as catchy a name as rcu.
rgu? Read-gpu-update. grf; gpu-read-reference.
> > +int i915_active_ref(struct i915_active *ref,
> > + u64 timeline,
> > + struct i915_request *rq)
> > +{
> > + struct i915_gem_active *active;
> > +
> > + active = active_instance(ref, timeline);
> > + if (IS_ERR(active))
> > + return PTR_ERR(active);
> > +
> > + if (!i915_gem_active_isset(active))
> > + ref->count++;
>
> Could stick a super-paranoid overflow GEM_BUG_ON here.
Yeah. Wouldn't it be nice if refcount_t wasn't quite so tied to
refcount_t. Just a plain old count_t and atomic_count_t.
> > - if (!i915_gem_active_isset(active) && !vma->active_count++)
> > + if (!vma->active.count)
> > obj->active_count++;
> > - i915_gem_active_set(active, rq);
> > +
> > + if (unlikely(i915_active_ref(&vma->active, rq->fence.context, rq))) {
> > + if (!vma->active.count)
> > + obj->active_count--;
> > + return -ENOMEM;
> > + }
>
> Optionally you could make i915_active_ref return the old ref count or
> error. Then this could become simpler:
>
> ret = i915_active_ref(..);
> if (unlikely(ret < 0))
> return -ENOMEM;
> else if (ret == 0)
> obj->active_count++;
Heh, didn't immediately strike me as simpler, but I did also consider
it.
I think for the atomic variant, we may just pass an init_func(). So
watch this space.
> Body looks good. I left selftests for after I get a further in the series.
They weren't very exciting I'm afraid, just aiming to have minimal
walking through the api points.
-Chris
More information about the Intel-gfx
mailing list