From: Daniel Vetter <daniel@ffwll.ch>
To: Chris Wilson <chris@chris-wilson.co.uk>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v4 01/38] drm/i915: Use the MRU stack search after evicting
Date: Tue, 27 Dec 2016 12:30:29 +0100 [thread overview]
Message-ID: <20161227113029.GF19172@dvetter-linux.ger.corp.intel.com> (raw)
In-Reply-To: <20161222083641.2691-2-chris@chris-wilson.co.uk>
On Thu, Dec 22, 2016 at 08:36:04AM +0000, Chris Wilson wrote:
> When we evict from the GTT to make room for an object, the hole we
> create is put onto the MRU stack inside the drm_mm range manager. On the
> next search pass, we can speed up a PIN_HIGH allocation by referencing
> that stack for the new hole.
>
> v2: Pull together the 3 identical implements (ahem, a couple were
> outdated) into a common routine for allocating a node and evicting as
> necessary.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Since it doesn't apply directly to drm-misc I'm leaving this one out for
now. I guess best to merge through drm-intel?
-Daniel
> ---
> drivers/gpu/drm/i915/gvt/aperture_gm.c | 33 +++++-----------
> drivers/gpu/drm/i915/i915_gem_gtt.c | 72 ++++++++++++++++++++++++----------
> drivers/gpu/drm/i915/i915_gem_gtt.h | 5 +++
> drivers/gpu/drm/i915/i915_vma.c | 40 ++-----------------
> 4 files changed, 70 insertions(+), 80 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gvt/aperture_gm.c b/drivers/gpu/drm/i915/gvt/aperture_gm.c
> index 7d33b607bc89..1bb7a5b80d47 100644
> --- a/drivers/gpu/drm/i915/gvt/aperture_gm.c
> +++ b/drivers/gpu/drm/i915/gvt/aperture_gm.c
> @@ -48,47 +48,34 @@ static int alloc_gm(struct intel_vgpu *vgpu, bool high_gm)
> {
> struct intel_gvt *gvt = vgpu->gvt;
> struct drm_i915_private *dev_priv = gvt->dev_priv;
> - u32 alloc_flag, search_flag;
> + unsigned int flags;
> u64 start, end, size;
> struct drm_mm_node *node;
> - int retried = 0;
> int ret;
>
> if (high_gm) {
> - search_flag = DRM_MM_SEARCH_BELOW;
> - alloc_flag = DRM_MM_CREATE_TOP;
> node = &vgpu->gm.high_gm_node;
> size = vgpu_hidden_sz(vgpu);
> start = gvt_hidden_gmadr_base(gvt);
> end = gvt_hidden_gmadr_end(gvt);
> + flags = PIN_HIGH;
> } else {
> - search_flag = DRM_MM_SEARCH_DEFAULT;
> - alloc_flag = DRM_MM_CREATE_DEFAULT;
> node = &vgpu->gm.low_gm_node;
> size = vgpu_aperture_sz(vgpu);
> start = gvt_aperture_gmadr_base(gvt);
> end = gvt_aperture_gmadr_end(gvt);
> + flags = PIN_MAPPABLE;
> }
>
> mutex_lock(&dev_priv->drm.struct_mutex);
> -search_again:
> - ret = drm_mm_insert_node_in_range_generic(&dev_priv->ggtt.base.mm,
> - node, size, 4096,
> - I915_COLOR_UNEVICTABLE,
> - start, end, search_flag,
> - alloc_flag);
> - if (ret) {
> - ret = i915_gem_evict_something(&dev_priv->ggtt.base,
> - size, 4096,
> - I915_COLOR_UNEVICTABLE,
> - start, end, 0);
> - if (ret == 0 && ++retried < 3)
> - goto search_again;
> -
> - gvt_err("fail to alloc %s gm space from host, retried %d\n",
> - high_gm ? "high" : "low", retried);
> - }
> + ret = i915_gem_gtt_insert(&dev_priv->ggtt.base, node,
> + size, 4096, I915_COLOR_UNEVICTABLE,
> + start, end, flags);
> mutex_unlock(&dev_priv->drm.struct_mutex);
> + if (ret)
> + gvt_err("fail to alloc %s gm space from host\n",
> + high_gm ? "high" : "low");
> +
> return ret;
> }
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 6af9311f72f5..c8f1675852a7 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -2044,7 +2044,6 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
> struct i915_address_space *vm = &ppgtt->base;
> struct drm_i915_private *dev_priv = ppgtt->base.i915;
> struct i915_ggtt *ggtt = &dev_priv->ggtt;
> - bool retried = false;
> int ret;
>
> /* PPGTT PDEs reside in the GGTT and consists of 512 entries. The
> @@ -2057,29 +2056,14 @@ static int gen6_ppgtt_allocate_page_directories(struct i915_hw_ppgtt *ppgtt)
> if (ret)
> return ret;
>
> -alloc:
> - ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm, &ppgtt->node,
> - GEN6_PD_SIZE, GEN6_PD_ALIGN,
> - I915_COLOR_UNEVICTABLE,
> - 0, ggtt->base.total,
> - DRM_MM_TOPDOWN);
> - if (ret == -ENOSPC && !retried) {
> - ret = i915_gem_evict_something(&ggtt->base,
> - GEN6_PD_SIZE, GEN6_PD_ALIGN,
> - I915_COLOR_UNEVICTABLE,
> - 0, ggtt->base.total,
> - 0);
> - if (ret)
> - goto err_out;
> -
> - retried = true;
> - goto alloc;
> - }
> -
> + ret = i915_gem_gtt_insert(&ggtt->base, &ppgtt->node,
> + GEN6_PD_SIZE, GEN6_PD_ALIGN,
> + I915_COLOR_UNEVICTABLE,
> + 0, ggtt->base.total,
> + PIN_HIGH);
> if (ret)
> goto err_out;
>
> -
> if (ppgtt->node.start < ggtt->mappable_end)
> DRM_DEBUG("Forced to use aperture for PDEs\n");
>
> @@ -3553,3 +3537,49 @@ i915_get_ggtt_vma_pages(struct i915_vma *vma)
> return ret;
> }
>
> +int i915_gem_gtt_insert(struct i915_address_space *vm,
> + struct drm_mm_node *node,
> + u64 size, u64 alignment, unsigned long color,
> + u64 start, u64 end, unsigned int flags)
> +{
> + u32 search_flag, alloc_flag;
> + int err;
> +
> + lockdep_assert_held(&vm->i915->drm.struct_mutex);
> +
> + if (flags & PIN_HIGH) {
> + search_flag = DRM_MM_SEARCH_BELOW;
> + alloc_flag = DRM_MM_CREATE_TOP;
> + } else {
> + search_flag = DRM_MM_SEARCH_DEFAULT;
> + alloc_flag = DRM_MM_CREATE_DEFAULT;
> + }
> +
> + /* We only allocate in PAGE_SIZE/GTT_PAGE_SIZE (4096) chunks,
> + * so we know that we always have a minimum alignment of 4096.
> + * The drm_mm range manager is optimised to return results
> + * with zero alignment, so where possible use the optimal
> + * path.
> + */
> + GEM_BUG_ON(size & 4095);
> + if (alignment <= 4096)
> + alignment = 0;
> +
> + err = drm_mm_insert_node_in_range_generic(&vm->mm, node,
> + size, alignment, color,
> + start, end,
> + search_flag, alloc_flag);
> + if (err != -ENOSPC)
> + return err;
> +
> + err = i915_gem_evict_something(vm, size, alignment, color,
> + start, end, flags);
> + if (err)
> + return err;
> +
> + search_flag = DRM_MM_SEARCH_DEFAULT;
> + return drm_mm_insert_node_in_range_generic(&vm->mm, node,
> + size, alignment, color,
> + start, end,
> + search_flag, alloc_flag);
> +}
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index 0055b8567a43..4c7bef07e38a 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -528,6 +528,11 @@ int __must_check i915_gem_gtt_prepare_pages(struct drm_i915_gem_object *obj,
> void i915_gem_gtt_finish_pages(struct drm_i915_gem_object *obj,
> struct sg_table *pages);
>
> +int i915_gem_gtt_insert(struct i915_address_space *vm,
> + struct drm_mm_node *node,
> + u64 size, u64 alignment, unsigned long color,
> + u64 start, u64 end, unsigned int flags);
> +
> /* Flags used by pin/bind&friends. */
> #define PIN_NONBLOCK BIT(0)
> #define PIN_MAPPABLE BIT(1)
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index fd75d5704287..608008d2d999 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -415,43 +415,11 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
> goto err_unpin;
> }
> } else {
> - u32 search_flag, alloc_flag;
> -
> - if (flags & PIN_HIGH) {
> - search_flag = DRM_MM_SEARCH_BELOW;
> - alloc_flag = DRM_MM_CREATE_TOP;
> - } else {
> - search_flag = DRM_MM_SEARCH_DEFAULT;
> - alloc_flag = DRM_MM_CREATE_DEFAULT;
> - }
> -
> - /* We only allocate in PAGE_SIZE/GTT_PAGE_SIZE (4096) chunks,
> - * so we know that we always have a minimum alignment of 4096.
> - * The drm_mm range manager is optimised to return results
> - * with zero alignment, so where possible use the optimal
> - * path.
> - */
> - if (alignment <= 4096)
> - alignment = 0;
> -
> -search_free:
> - ret = drm_mm_insert_node_in_range_generic(&vma->vm->mm,
> - &vma->node,
> - size, alignment,
> - obj->cache_level,
> - start, end,
> - search_flag,
> - alloc_flag);
> - if (ret) {
> - ret = i915_gem_evict_something(vma->vm, size, alignment,
> - obj->cache_level,
> - start, end,
> - flags);
> - if (ret == 0)
> - goto search_free;
> -
> + ret = i915_gem_gtt_insert(vma->vm, &vma->node,
> + size, alignment, obj->cache_level,
> + start, end, flags);
> + if (ret)
> goto err_unpin;
> - }
>
> GEM_BUG_ON(vma->node.start < start);
> GEM_BUG_ON(vma->node.start + vma->node.size > end);
> --
> 2.11.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2016-12-27 11:30 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-22 8:36 drm_mm fixes, take 4? Chris Wilson
2016-12-22 8:36 ` [PATCH v4 01/38] drm/i915: Use the MRU stack search after evicting Chris Wilson
2016-12-27 11:30 ` Daniel Vetter [this message]
2016-12-22 8:36 ` [PATCH v4 02/38] drm: Use drm_mm_nodes() as shorthand for the list of nodes under struct drm_mm Chris Wilson
2016-12-22 8:36 ` [PATCH v4 03/38] drm: Compile time enabling for asserts in drm_mm Chris Wilson
2016-12-22 8:36 ` [PATCH v4 04/38] lib: Add a simple prime number generator Chris Wilson
2016-12-22 9:52 ` Joonas Lahtinen
2016-12-22 10:00 ` [Intel-gfx] " Chris Wilson
2016-12-22 14:45 ` [PATCH v10] " Chris Wilson
2016-12-27 11:31 ` Daniel Vetter
2016-12-22 8:36 ` [PATCH v4 05/38] drm: Add a simple generator of random permutations Chris Wilson
2016-12-27 11:33 ` Daniel Vetter
2016-12-22 8:36 ` [PATCH v4 06/38] drm: Add some kselftests for the DRM range manager (struct drm_mm) Chris Wilson
2016-12-27 11:36 ` Daniel Vetter
2016-12-22 8:36 ` [PATCH v4 07/38] drm: kselftest for drm_mm_init() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 08/38] drm: kselftest for drm_mm_debug() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 09/38] drm: kselftest for drm_mm_reserve_node() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 10/38] drm: kselftest for drm_mm_insert_node() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 11/38] drm: kselftest for drm_mm_replace_node() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 12/38] drm: kselftest for drm_mm_insert_node_in_range() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 13/38] drm: kselftest for drm_mm and alignment Chris Wilson
2016-12-22 8:36 ` [PATCH v4 14/38] drm: kselftest for drm_mm and eviction Chris Wilson
2016-12-22 8:36 ` [PATCH v4 15/38] drm: kselftest for drm_mm and range restricted eviction Chris Wilson
2016-12-22 8:36 ` [PATCH v4 16/38] drm: kselftest for drm_mm and top-down allocation Chris Wilson
2016-12-22 8:36 ` [PATCH v4 17/38] drm: kselftest for drm_mm and color adjustment Chris Wilson
2016-12-22 8:36 ` [PATCH v4 18/38] drm: kselftest for drm_mm and color eviction Chris Wilson
2016-12-22 8:36 ` [PATCH v4 19/38] drm: kselftest for drm_mm and restricted " Chris Wilson
2016-12-22 8:36 ` [PATCH v4 20/38] drm/i915: Build DRM range manager selftests for CI Chris Wilson
2016-12-27 13:03 ` Daniel Vetter
2016-12-22 8:36 ` [PATCH v4 21/38] drm: Promote drm_mm alignment to u64 Chris Wilson
2016-12-22 8:36 ` [PATCH v4 22/38] drm: Fix kerneldoc for drm_mm_scan_remove_block() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 23/38] drm: Detect overflow in drm_mm_reserve_node() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 24/38] drm: Simplify drm_mm_clean() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 25/38] drm: Add asserts to catch overflow in drm_mm_init() and drm_mm_init_scan() Chris Wilson
2016-12-27 13:12 ` Daniel Vetter
2016-12-22 8:36 ` [PATCH v4 26/38] drm: Extract struct drm_mm_scan from struct drm_mm Chris Wilson
2016-12-27 15:48 ` Daniel Vetter
2016-12-22 8:36 ` [PATCH v4 27/38] drm: Rename prev_node to hole in drm_mm_scan_add_block() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 28/38] drm: Unconditionally do the range check " Chris Wilson
2016-12-22 8:36 ` [PATCH v4 29/38] drm: Fix application of color vs range restriction when scanning drm_mm Chris Wilson
2016-12-22 8:36 ` [PATCH v4 30/38] drm: Compute tight evictions for drm_mm_scan Chris Wilson
2016-12-28 13:01 ` [Intel-gfx] " Daniel Vetter
2016-12-28 14:36 ` Chris Wilson
2016-12-22 8:36 ` [PATCH v4 31/38] drm: Optimise power-of-two alignments in drm_mm_scan_add_block() Chris Wilson
2016-12-22 8:36 ` [PATCH v4 32/38] drm: Simplify drm_mm scan-list manipulation Chris Wilson
2016-12-22 8:36 ` [PATCH v4 33/38] drm: Apply tight eviction scanning to color_adjust Chris Wilson
2016-12-22 8:36 ` [PATCH v4 34/38] drm: Wrap drm_mm_node.hole_follows Chris Wilson
2016-12-28 13:02 ` Daniel Vetter
2016-12-28 13:31 ` Chris Wilson
2016-12-28 14:31 ` Daniel Vetter
2016-12-28 18:47 ` Chris Wilson
2016-12-22 8:36 ` [PATCH v4 35/38] drm: Apply range restriction after color adjustment when allocation Chris Wilson
2016-12-22 8:36 ` [PATCH v4 36/38] drm: Use drm_mm_insert_node_in_range_generic() for everyone Chris Wilson
2016-12-22 8:36 ` [PATCH v4 37/38] drm: Improve drm_mm search (and fix topdown allocation) with rbtrees Chris Wilson
2016-12-28 11:08 ` Chris Wilson
2016-12-28 13:48 ` Daniel Vetter
2016-12-28 14:34 ` Daniel Vetter
2016-12-22 8:36 ` [PATCH v4 38/38] drm: kselftest for drm_mm and bottom-up allocation Chris Wilson
2016-12-22 9:15 ` ✗ Fi.CI.BAT: warning for series starting with [v4,01/38] drm/i915: Use the MRU stack search after evicting Patchwork
2016-12-22 9:47 ` Imre Deak
2016-12-22 20:53 ` ✓ Fi.CI.BAT: success for series starting with [v4,01/38] drm/i915: Use the MRU stack search after evicting (rev2) Patchwork
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=20161227113029.GF19172@dvetter-linux.ger.corp.intel.com \
--to=daniel@ffwll.ch \
--cc=chris@chris-wilson.co.uk \
--cc=dri-devel@lists.freedesktop.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox