From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>, intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH 11/23] drm/i915/gem: Remove the call for no-evict i915_vma_pin
Date: Fri, 3 Jul 2020 09:59:01 +0100 [thread overview]
Message-ID: <a49d63ff-a713-215a-303a-89a92cb9503f@linux.intel.com> (raw)
In-Reply-To: <20200702083225.20044-11-chris@chris-wilson.co.uk>
On 02/07/2020 09:32, Chris Wilson wrote:
> Remove the stub i915_vma_pin() used for incrementally pining objects for
> execbuf (under the severe restriction that they must not wait on a
> resource as we may have already pinned it) and replace it with a
> i915_vma_pin_inplace() that is only allowed to reclaim the currently
> bound location for the vma (and will never wait for a pinned resource).
Hm I thought the point of the previous patch ("drm/i915/gem: Break apart
the early i915_vma_pin from execbuf object lookup") was to move the
pinning into a phase under the ww lock, where it will be allowed. I
misunderstood something?
Regards,
Tvrtko
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> ---
> .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 69 +++++++++++--------
> drivers/gpu/drm/i915/i915_vma.c | 6 +-
> drivers/gpu/drm/i915/i915_vma.h | 2 +
> 3 files changed, 45 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> index 1348cb5ec7e6..18e9325dd98a 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> @@ -452,49 +452,55 @@ static u64 eb_pin_flags(const struct drm_i915_gem_exec_object2 *entry,
> return pin_flags;
> }
>
> +static bool eb_pin_vma_fence_inplace(struct eb_vma *ev)
> +{
> + struct i915_vma *vma = ev->vma;
> + struct i915_fence_reg *reg = vma->fence;
> +
> + if (reg) {
> + if (READ_ONCE(reg->dirty))
> + return false;
> +
> + atomic_inc(®->pin_count);
> + ev->flags |= __EXEC_OBJECT_HAS_FENCE;
> + } else {
> + if (i915_gem_object_is_tiled(vma->obj))
> + return false;
> + }
> +
> + return true;
> +}
> +
> static inline bool
> -eb_pin_vma(struct i915_execbuffer *eb,
> - const struct drm_i915_gem_exec_object2 *entry,
> - struct eb_vma *ev)
> +eb_pin_vma_inplace(struct i915_execbuffer *eb,
> + const struct drm_i915_gem_exec_object2 *entry,
> + struct eb_vma *ev)
> {
> struct i915_vma *vma = ev->vma;
> - u64 pin_flags;
> + unsigned int pin_flags;
>
> - if (vma->node.size)
> - pin_flags = vma->node.start;
> - else
> - pin_flags = entry->offset & PIN_OFFSET_MASK;
> + if (eb_vma_misplaced(entry, vma, ev->flags))
> + return false;
>
> - pin_flags |= PIN_USER | PIN_NOEVICT | PIN_OFFSET_FIXED;
> + pin_flags = PIN_USER;
> if (unlikely(ev->flags & EXEC_OBJECT_NEEDS_GTT))
> pin_flags |= PIN_GLOBAL;
>
> /* Attempt to reuse the current location if available */
> - if (unlikely(i915_vma_pin(vma, 0, 0, pin_flags))) {
> - if (entry->flags & EXEC_OBJECT_PINNED)
> - return false;
> -
> - /* Failing that pick any _free_ space if suitable */
> - if (unlikely(i915_vma_pin(vma,
> - entry->pad_to_size,
> - entry->alignment,
> - eb_pin_flags(entry, ev->flags) |
> - PIN_USER | PIN_NOEVICT)))
> - return false;
> - }
> + if (!i915_vma_pin_inplace(vma, pin_flags))
> + return false;
>
> if (unlikely(ev->flags & EXEC_OBJECT_NEEDS_FENCE)) {
> - if (unlikely(i915_vma_pin_fence(vma))) {
> - i915_vma_unpin(vma);
> + if (!eb_pin_vma_fence_inplace(ev)) {
> + __i915_vma_unpin(vma);
> return false;
> }
> -
> - if (vma->fence)
> - ev->flags |= __EXEC_OBJECT_HAS_FENCE;
> }
>
> + GEM_BUG_ON(eb_vma_misplaced(entry, vma, ev->flags));
> +
> ev->flags |= __EXEC_OBJECT_HAS_PIN;
> - return !eb_vma_misplaced(entry, vma, ev->flags);
> + return true;
> }
>
> static int
> @@ -676,14 +682,17 @@ static int eb_reserve_vm(struct i915_execbuffer *eb)
> struct drm_i915_gem_exec_object2 *entry = ev->exec;
> struct i915_vma *vma = ev->vma;
>
> - if (eb_pin_vma(eb, entry, ev)) {
> + if (eb_pin_vma_inplace(eb, entry, ev)) {
> if (entry->offset != vma->node.start) {
> entry->offset = vma->node.start | UPDATE;
> eb->args->flags |= __EXEC_HAS_RELOC;
> }
> } else {
> - eb_unreserve_vma(ev);
> - list_add_tail(&ev->unbound_link, &unbound);
> + /* Lightly sort user placed objects to the fore */
> + if (ev->flags & EXEC_OBJECT_PINNED)
> + list_add(&ev->unbound_link, &unbound);
> + else
> + list_add_tail(&ev->unbound_link, &unbound);
> }
> }
>
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index fc8a083753bd..a00a026076e4 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -744,11 +744,13 @@ i915_vma_detach(struct i915_vma *vma)
> list_del(&vma->vm_link);
> }
>
> -static bool try_qad_pin(struct i915_vma *vma, unsigned int flags)
> +bool i915_vma_pin_inplace(struct i915_vma *vma, unsigned int flags)
> {
> unsigned int bound;
> bool pinned = true;
>
> + GEM_BUG_ON(flags & ~I915_VMA_BIND_MASK);
> +
> bound = atomic_read(&vma->flags);
> do {
> if (unlikely(flags & ~bound))
> @@ -869,7 +871,7 @@ int i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
> GEM_BUG_ON(!(flags & (PIN_USER | PIN_GLOBAL)));
>
> /* First try and grab the pin without rebinding the vma */
> - if (try_qad_pin(vma, flags & I915_VMA_BIND_MASK))
> + if (i915_vma_pin_inplace(vma, flags & I915_VMA_BIND_MASK))
> return 0;
>
> err = vma_get_pages(vma);
> diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
> index d0d01f909548..03fea54fd573 100644
> --- a/drivers/gpu/drm/i915/i915_vma.h
> +++ b/drivers/gpu/drm/i915/i915_vma.h
> @@ -236,6 +236,8 @@ static inline void i915_vma_unlock(struct i915_vma *vma)
> dma_resv_unlock(vma->resv);
> }
>
> +bool i915_vma_pin_inplace(struct i915_vma *vma, unsigned int flags);
> +
> int __must_check
> i915_vma_pin(struct i915_vma *vma, u64 size, u64 alignment, u64 flags);
> int i915_ggtt_pin(struct i915_vma *vma, u32 align, unsigned int flags);
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2020-07-03 8:59 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-02 8:32 [Intel-gfx] [PATCH 01/23] drm/i915: Drop vm.ref for duplicate vma on construction Chris Wilson
2020-07-02 8:32 ` Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 02/23] drm/i915/gem: Split the context's obj:vma lut into its own mutex Chris Wilson
2020-07-02 22:09 ` Andi Shyti
2020-07-02 22:14 ` Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 03/23] drm/i915/gem: Drop forced struct_mutex from shrinker_taints_mutex Chris Wilson
2020-07-02 22:24 ` Andi Shyti
2020-07-02 8:32 ` [Intel-gfx] [PATCH 04/23] drm/i915/gem: Only revoke mmap handlers if active Chris Wilson
2020-07-02 12:35 ` Tvrtko Ursulin
2020-07-02 12:47 ` Chris Wilson
2020-07-02 12:54 ` Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 05/23] drm/i915: Export ppgtt_bind_vma Chris Wilson
2020-07-03 10:09 ` Andi Shyti
2020-07-02 8:32 ` [Intel-gfx] [PATCH 06/23] drm/i915: Preallocate stashes for vma page-directories Chris Wilson
2020-07-03 16:47 ` Tvrtko Ursulin
2020-07-02 8:32 ` [Intel-gfx] [PATCH 07/23] drm/i915: Switch to object allocations for page directories Chris Wilson
2020-07-03 8:44 ` Tvrtko Ursulin
2020-07-03 9:00 ` Chris Wilson
2020-07-03 9:24 ` Tvrtko Ursulin
2020-07-03 9:49 ` Chris Wilson
2020-07-03 16:34 ` Tvrtko Ursulin
2020-07-03 16:36 ` Tvrtko Ursulin
2020-07-02 8:32 ` [Intel-gfx] [PATCH 08/23] drm/i915/gem: Don't drop the timeline lock during execbuf Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 09/23] drm/i915/gem: Rename execbuf.bind_link to unbound_link Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 10/23] drm/i915/gem: Break apart the early i915_vma_pin from execbuf object lookup Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 11/23] drm/i915/gem: Remove the call for no-evict i915_vma_pin Chris Wilson
2020-07-03 8:59 ` Tvrtko Ursulin [this message]
2020-07-03 9:23 ` Chris Wilson
2020-07-06 14:43 ` Tvrtko Ursulin
2020-07-02 8:32 ` [Intel-gfx] [PATCH 12/23] drm/i915: Add list_for_each_entry_safe_continue_reverse Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 13/23] drm/i915: Always defer fenced work to the worker Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 14/23] drm/i915/gem: Assign context id for async work Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 15/23] drm/i915: Export a preallocate variant of i915_active_acquire() Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 16/23] drm/i915/gem: Separate the ww_mutex walker into its own list Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 17/23] drm/i915/gem: Asynchronous GTT unbinding Chris Wilson
2020-07-05 22:01 ` Andi Shyti
2020-07-05 22:07 ` Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 18/23] drm/i915/gem: Bind the fence async for execbuf Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 19/23] drm/i915/gem: Include cmdparser in common execbuf pinning Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 20/23] drm/i915/gem: Include secure batch " Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 21/23] drm/i915/gem: Reintroduce multiple passes for reloc processing Chris Wilson
2020-07-02 8:32 ` [Intel-gfx] [PATCH 22/23] drm/i915: Add an implementation for i915_gem_ww_ctx locking, v2 Chris Wilson
2020-07-02 22:32 ` kernel test robot
2020-07-02 8:32 ` [Intel-gfx] [PATCH 23/23] drm/i915/gem: Pull execbuf dma resv under a single critical section Chris Wilson
2020-07-02 9:17 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [01/23] drm/i915: Drop vm.ref for duplicate vma on construction Patchwork
2020-07-02 9:18 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2020-07-02 9:40 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-07-02 12:27 ` [Intel-gfx] [PATCH 01/23] " Tvrtko Ursulin
2020-07-02 12:27 ` Tvrtko Ursulin
2020-07-02 13:08 ` [Intel-gfx] ✗ Fi.CI.IGT: failure for series starting with [01/23] " Patchwork
2020-07-02 20:25 ` [Intel-gfx] [PATCH 01/23] " Andi Shyti
2020-07-02 20:25 ` Andi Shyti
2020-07-02 20:38 ` Chris Wilson
2020-07-02 20:38 ` Chris Wilson
2020-07-02 20:56 ` Andi Shyti
2020-07-02 20:56 ` Andi Shyti
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=a49d63ff-a713-215a-303a-89a92cb9503f@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.