Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel@ffwll.ch>
To: Chris Wilson <chris@chris-wilson.co.uk>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 1/7] drm/i915: Introduce i915_address_space.mutex
Date: Wed, 11 Jul 2018 11:33:26 +0200	[thread overview]
Message-ID: <20180711093326.GY3008@phenom.ffwll.local> (raw)
In-Reply-To: <20180711073608.20286-2-chris@chris-wilson.co.uk>

On Wed, Jul 11, 2018 at 08:36:02AM +0100, Chris Wilson wrote:
> Add a mutex into struct i915_address_space to be used while operating on
> the vma and their lists for a particular vm. As this may be called from
> the shrinker, we taint the mutex with fs_reclaim so that from the start
> lockdep warns us if we are caught holding the mutex across an
> allocation. (With such small steps we will eventually rid ourselves of
> struct_mutex recursion!)
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

Not sure it exists in a branch of yours already, but here's my thoughts on
extending this to the address_space lrus and the shrinker callback (which
I think would be the next step with good pay-off):

1. make sure pin_count is protected by reservation_obj.
2. grab the vm.mutex when walking LRUs everywhere. This is going to be
tricky for ggtt because of runtime PM. Between lock-dropping, carefully
avoiding rpm when cleaning up objects and just grabbing an rpm wakeref
when walking the ggtt vm this should be possible to work around (since for
the fences we clearly need to be able to nest the vm.mutex within rpm or
we're busted).
3. In the shrinker trylock the reservation_obj and treat a failure to get
the lock as if pin_count is elevated. If we can't shrink enough then grab
a temporary reference to the bo using kref_get_unless_zero, drop the
vm.mutex (since that's what gave us the weak ref) and do a blocking
reservation_obj lock.
4. Audit the obj/vma unbind paths and apply reservation_obj or vm.mutex
locking as needed until we can drop the struct_mutex from the shrinker.
Biggest trouble is probably ggtt mmap (but I think ordering of pte
shootdown takes care of that) and drm_mm ("just" needs to be protected by
vm.mutex too I think).

Plan is probably the underestimation of the decade, at least :-)
-Daniel
> ---
>  drivers/gpu/drm/i915/i915_drv.h          |  2 +-
>  drivers/gpu/drm/i915/i915_gem_gtt.c      | 10 ++++++++++
>  drivers/gpu/drm/i915/i915_gem_gtt.h      |  2 ++
>  drivers/gpu/drm/i915/i915_gem_shrinker.c | 12 ++++++++++++
>  4 files changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index eeb002a47032..01dd29837233 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -3304,7 +3304,7 @@ unsigned long i915_gem_shrink(struct drm_i915_private *i915,
>  unsigned long i915_gem_shrink_all(struct drm_i915_private *i915);
>  void i915_gem_shrinker_register(struct drm_i915_private *i915);
>  void i915_gem_shrinker_unregister(struct drm_i915_private *i915);
> -
> +void i915_gem_shrinker_taints_mutex(struct mutex *mutex);
>  
>  /* i915_gem_tiling.c */
>  static inline bool i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index abd81fb9b0b6..d0acef299b9c 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -531,6 +531,14 @@ static void vm_free_page(struct i915_address_space *vm, struct page *page)
>  static void i915_address_space_init(struct i915_address_space *vm,
>  				    struct drm_i915_private *dev_priv)
>  {
> +	/*
> +	 * The vm->mutex must be reclaim safe (for use in the shrinker).
> +	 * Do a dummy acquire now under fs_reclaim so that any allocation
> +	 * attempt holding the lock is immediately reported by lockdep.
> +	 */
> +	mutex_init(&vm->mutex);
> +	i915_gem_shrinker_taints_mutex(&vm->mutex);
> +
>  	GEM_BUG_ON(!vm->total);
>  	drm_mm_init(&vm->mm, 0, vm->total);
>  	vm->mm.head_node.color = I915_COLOR_UNEVICTABLE;
> @@ -551,6 +559,8 @@ static void i915_address_space_fini(struct i915_address_space *vm)
>  	spin_unlock(&vm->free_pages.lock);
>  
>  	drm_mm_takedown(&vm->mm);
> +
> +	mutex_destroy(&vm->mutex);
>  }
>  
>  static int __setup_page_dma(struct i915_address_space *vm,
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index feda45dfd481..14e62651010b 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -293,6 +293,8 @@ struct i915_address_space {
>  
>  	bool closed;
>  
> +	struct mutex mutex; /* protects vma and our lists */
> +
>  	struct i915_page_dma scratch_page;
>  	struct i915_page_table *scratch_pt;
>  	struct i915_page_directory *scratch_pd;
> diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
> index c61f5b80fee3..ea90d3a0d511 100644
> --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
> +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
> @@ -23,6 +23,7 @@
>   */
>  
>  #include <linux/oom.h>
> +#include <linux/sched/mm.h>
>  #include <linux/shmem_fs.h>
>  #include <linux/slab.h>
>  #include <linux/swap.h>
> @@ -531,3 +532,14 @@ void i915_gem_shrinker_unregister(struct drm_i915_private *i915)
>  	WARN_ON(unregister_oom_notifier(&i915->mm.oom_notifier));
>  	unregister_shrinker(&i915->mm.shrinker);
>  }
> +
> +void i915_gem_shrinker_taints_mutex(struct mutex *mutex)
> +{
> +	if (!IS_ENABLED(CONFIG_LOCKDEP))
> +		return;
> +
> +	fs_reclaim_acquire(GFP_KERNEL);
> +	mutex_lock(mutex);
> +	mutex_unlock(mutex);
> +	fs_reclaim_release(GFP_KERNEL);
> +}
> -- 
> 2.18.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

  parent reply	other threads:[~2018-07-11  9:33 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-11  7:36 Cleanup live_hangcheck flippers Chris Wilson
2018-07-11  7:36 ` [PATCH 1/7] drm/i915: Introduce i915_address_space.mutex Chris Wilson
2018-07-11  8:09   ` Daniel Vetter
2018-07-11  9:33   ` Daniel Vetter [this message]
2018-07-11  9:36     ` Daniel Vetter
2018-07-11  9:49       ` Chris Wilson
2018-07-12  7:01         ` Daniel Vetter
2018-07-11  7:36 ` [PATCH 2/7] drm/i915: Move fence register tracking to GGTT Chris Wilson
2018-07-11  8:19   ` Daniel Vetter
2018-07-11  8:27     ` Chris Wilson
2018-07-11  7:36 ` [PATCH 3/7] drm/i915: Convert fences to use a GGTT lock rather than struct_mutex Chris Wilson
2018-07-11  9:08   ` Daniel Vetter
2018-07-11 10:57     ` Chris Wilson
2018-07-11 11:12       ` Chris Wilson
2018-07-12  7:12         ` Daniel Vetter
2018-07-11  7:36 ` [PATCH 4/7] drm/i915: Move fence-reg interface to i915_gem_fence_reg.h Chris Wilson
2018-07-11  7:36 ` [PATCH 5/7] drm/i915: Dynamically allocate the array of drm_i915_gem_fence_reg Chris Wilson
2018-07-11  9:11   ` Daniel Vetter
2018-07-11  7:36 ` [PATCH 6/7] drm/i915: Pull all the reset functionality together into i915_reset.c Chris Wilson
2018-07-11  9:17   ` Daniel Vetter
2018-07-11  9:28     ` Chris Wilson
2018-07-11  7:36 ` [PATCH 7/7] drm/i915: Remove GPU reset dependence on struct_mutex Chris Wilson
2018-07-11  7:46 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/7] drm/i915: Introduce i915_address_space.mutex Patchwork
2018-07-11  7:50 ` ✗ Fi.CI.SPARSE: " Patchwork
2018-07-11  8:03 ` ✓ Fi.CI.BAT: success " Patchwork
2018-07-11  8:59 ` ✗ Fi.CI.IGT: failure " 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=20180711093326.GY3008@phenom.ffwll.local \
    --to=daniel@ffwll.ch \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox