All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 3/6] drm/i915: Only track live rings for retiring
Date: Mon, 23 Apr 2018 11:50:26 +0100	[thread overview]
Message-ID: <cb427931-a61d-d3c2-2005-761edddd1791@linux.intel.com> (raw)
In-Reply-To: <152447980056.5735.14671963443531499597@mail.alporthouse.com>


On 23/04/2018 11:36, Chris Wilson wrote:
> Quoting Tvrtko Ursulin (2018-04-23 11:25:54)
>>
>> On 23/04/2018 11:13, Chris Wilson wrote:
>>> We don't need to track every ring for its lifetime as they are managed
>>> by the contexts/engines. What we do want to track are the live rings so
>>> that we can sporadically clean up requests if userspace falls behind. We
>>> can simply restrict the gt->rings list to being only gt->live_rings.
>>>
>>> Suggested-by: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
>>> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
>>> Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
>>> ---
>>>    drivers/gpu/drm/i915/i915_drv.h                  | 2 +-
>>>    drivers/gpu/drm/i915/i915_gem.c                  | 3 ++-
>>>    drivers/gpu/drm/i915/i915_request.c              | 6 +++++-
>>>    drivers/gpu/drm/i915/i915_utils.h                | 6 ++++++
>>>    drivers/gpu/drm/i915/intel_ringbuffer.c          | 4 ----
>>>    drivers/gpu/drm/i915/intel_ringbuffer.h          | 2 +-
>>>    drivers/gpu/drm/i915/selftests/mock_engine.c     | 4 ----
>>>    drivers/gpu/drm/i915/selftests/mock_gem_device.c | 2 +-
>>>    8 files changed, 16 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
>>> index 73936be90aed..a7787c2cb53c 100644
>>> --- a/drivers/gpu/drm/i915/i915_drv.h
>>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>>> @@ -2060,7 +2060,7 @@ struct drm_i915_private {
>>>    
>>>                struct i915_gem_timeline global_timeline;
>>>                struct list_head timelines;
>>> -             struct list_head rings;
>>> +             struct list_head live_rings;
>>>                u32 active_requests;
>>>    
>>>                /**
>>> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
>>> index 906e2395c245..0097a77fae8d 100644
>>> --- a/drivers/gpu/drm/i915/i915_gem.c
>>> +++ b/drivers/gpu/drm/i915/i915_gem.c
>>> @@ -141,6 +141,7 @@ static u32 __i915_gem_park(struct drm_i915_private *i915)
>>>    {
>>>        lockdep_assert_held(&i915->drm.struct_mutex);
>>>        GEM_BUG_ON(i915->gt.active_requests);
>>> +     GEM_BUG_ON(!list_empty(&i915->gt.live_rings));
>>>    
>>>        if (!i915->gt.awake)
>>>                return I915_EPOCH_INVALID;
>>> @@ -5600,7 +5601,7 @@ int i915_gem_init_early(struct drm_i915_private *dev_priv)
>>>                goto err_dependencies;
>>>    
>>>        mutex_lock(&dev_priv->drm.struct_mutex);
>>> -     INIT_LIST_HEAD(&dev_priv->gt.rings);
>>> +     INIT_LIST_HEAD(&dev_priv->gt.live_rings);
>>>        INIT_LIST_HEAD(&dev_priv->gt.timelines);
>>>        err = i915_gem_timeline_init__global(dev_priv);
>>>        mutex_unlock(&dev_priv->drm.struct_mutex);
>>> diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c
>>> index 0bf949ec9f1a..534b8d684cef 100644
>>> --- a/drivers/gpu/drm/i915/i915_request.c
>>> +++ b/drivers/gpu/drm/i915/i915_request.c
>>> @@ -316,6 +316,7 @@ static void advance_ring(struct i915_request *request)
>>>                 * noops - they are safe to be replayed on a reset.
>>>                 */
>>>                tail = READ_ONCE(request->tail);
>>> +             list_del(&ring->live);
>>>        } else {
>>>                tail = request->postfix;
>>>        }
>>> @@ -1046,6 +1047,8 @@ void __i915_request_add(struct i915_request *request, bool flush_caches)
>>>        i915_gem_active_set(&timeline->last_request, request);
>>>    
>>>        list_add_tail(&request->ring_link, &ring->request_list);
>>> +     if (list_is_first(&request->ring_link, &ring->request_list))
>>> +             list_add(&ring->live, &request->i915->gt.live_rings);
>>
>> If you re-order the two list adds you could use list_empty and wouldn't
>> have to add list_is_first.
> 
> list_is_first tallies nicely with the list_is_last used before the
> corresponding list_del.

Yes but to me that's minor, basically immaterial as argument whether or 
not to add our own list helper.

>>
>>>        request->emitted_jiffies = jiffies;
>>>    
>>>        /*
>>> @@ -1375,7 +1378,8 @@ void i915_retire_requests(struct drm_i915_private *i915)
>>>        if (!i915->gt.active_requests)
>>>                return;
>>>    
>>> -     list_for_each_entry_safe(ring, next, &i915->gt.rings, link)
>>> +     GEM_BUG_ON(list_empty(&i915->gt.live_rings));
>>
>> Maybe blank line here since the assert is not logically associated with
>> the list but with the !i915.active_requests?
> 
> I was thinking list when I wrote it. It's small enough we can argue both
> and both be right.

Hm obviosuly it is not an error to call i915_retire_requests with 
nothing active (early return). So I even briefly wanted to suggest to 
make it 100% explicit and have the assert at the top of the function as:

GEM_BUG_ON(!!i915->gt.active_requests ^ !!list_empty(..));

Unless I messed it up, the idea is to check those two are always in the 
same state.

> 
>>
>>> +     list_for_each_entry_safe(ring, next, &i915->gt.live_rings, live)
>>>                ring_retire_requests(ring);
>>>    }
>>>    
>>> diff --git a/drivers/gpu/drm/i915/i915_utils.h b/drivers/gpu/drm/i915/i915_utils.h
>>> index 0695717522ea..00165ad55fb3 100644
>>> --- a/drivers/gpu/drm/i915/i915_utils.h
>>> +++ b/drivers/gpu/drm/i915/i915_utils.h
>>> @@ -120,6 +120,12 @@ static inline u64 ptr_to_u64(const void *ptr)
>>>    
>>>    #include <linux/list.h>
>>>    
>>> +static inline int list_is_first(const struct list_head *list,
>>> +                             const struct list_head *head)
>>
>> Return bool if you decide you prefer to keep list_is_first?
> 
> Copy'n'paste from list_is_last().
> 
>>
>>> +{
>>> +     return head->next == list;
>>> +}
>>> +
>>>    static inline void __list_del_many(struct list_head *head,
>>>                                   struct list_head *first)
>>>    {
>>> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
>>> index 792a2ca95872..3453e7426f6b 100644
>>> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
>>> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
>>> @@ -1150,8 +1150,6 @@ intel_engine_create_ring(struct intel_engine_cs *engine, int size)
>>>        }
>>>        ring->vma = vma;
>>>    
>>> -     list_add(&ring->link, &engine->i915->gt.rings);
>>> -
>>>        return ring;
>>>    }
>>>    
>>> @@ -1163,8 +1161,6 @@ intel_ring_free(struct intel_ring *ring)
>>>        i915_vma_close(ring->vma);
>>>        __i915_gem_object_release_unless_active(obj);
>>>    
>>> -     list_del(&ring->link);
>>> -
>>>        kfree(ring);
>>>    }
>>>    
>>> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
>>> index d816f8dea245..fd5a6363ab1d 100644
>>> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
>>> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
>>> @@ -129,7 +129,7 @@ struct intel_ring {
>>>        void *vaddr;
>>>    
>>>        struct list_head request_list;
>>> -     struct list_head link;
>>> +     struct list_head live;
>>
>> live_link?
> 
> live or active.
> 
> active_rings ties in with active_requests, so active_link here.

Fine by me.

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2018-04-23 10:50 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-23 10:13 [PATCH 1/6] drm/i915: Stop tracking timeline->inflight_seqnos Chris Wilson
2018-04-23 10:13 ` [PATCH 2/6] drm/i915: Retire requests along rings Chris Wilson
2018-04-23 10:18   ` Tvrtko Ursulin
2018-04-23 10:13 ` [PATCH 3/6] drm/i915: Only track live rings for retiring Chris Wilson
2018-04-23 10:25   ` Tvrtko Ursulin
2018-04-23 10:36     ` Chris Wilson
2018-04-23 10:50       ` Tvrtko Ursulin [this message]
2018-04-23 10:13 ` [PATCH 4/6] drm/i915: Move timeline from GTT to ring Chris Wilson
2018-04-23 10:44   ` Tvrtko Ursulin
2018-04-23 12:51     ` Chris Wilson
2018-04-23 10:13 ` [PATCH 5/6] drm/i915: Split i915_gem_timeline into individual timelines Chris Wilson
2018-04-23 12:33   ` Tvrtko Ursulin
2018-04-23 12:55     ` Chris Wilson
2018-04-23 10:14 ` [PATCH 6/6] drm/i915: Lazily unbind vma on close Chris Wilson
2018-04-23 13:08   ` Tvrtko Ursulin
2018-04-23 13:24 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/6] drm/i915: Stop tracking timeline->inflight_seqnos Patchwork
2018-04-23 13:27 ` ✗ Fi.CI.SPARSE: " Patchwork
2018-04-23 13:40 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-04-23 13:49   ` Chris Wilson
2018-04-24 13:14 [PATCH 1/6] " Chris Wilson
2018-04-24 13:14 ` [PATCH 3/6] drm/i915: Only track live rings for retiring Chris Wilson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cb427931-a61d-d3c2-2005-761edddd1791@linux.intel.com \
    --to=tvrtko.ursulin@linux.intel.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.