[Intel-gfx] [PATCH 2/2] drm/i915: Fix timeout handling in i915_gem_shrinker_vmap
Chris Wilson
chris at chris-wilson.co.uk
Wed Jan 9 14:31:03 UTC 2019
Quoting Tvrtko Ursulin (2019-01-09 14:12:47)
> From: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
>
> The code tries to grab struct mutex for 5ms every time the unlocked GPU
> idle wait succeeds. But the GPU idle wait itself is practically unbound
> which means the 5ms timeout might not be honoured.
>
> Cap the GPU idle wait to 5ms as well to fix this.
>
> v2:
> * Rebase.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
> drivers/gpu/drm/i915/i915_gem_shrinker.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
> index ce539d38461c..4ee393028a93 100644
> --- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
> +++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
> @@ -402,13 +402,12 @@ i915_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
>
> static bool
> shrinker_lock_uninterruptible(struct drm_i915_private *i915, bool *unlock,
> - int timeout_ms)
> + unsigned long timeout)
> {
> - unsigned long timeout = jiffies + msecs_to_jiffies_timeout(timeout_ms);
> + const unsigned long timeout_end = jiffies + timeout;
>
> do {
> - if (i915_gem_wait_for_idle(i915,
> - 0, MAX_SCHEDULE_TIMEOUT) == 0 &&
> + if (i915_gem_wait_for_idle(i915, 0, timeout) == 0 &&
Hmm, I wonder if this code could be hitting i915_request_wait():
#if IS_ENABLED(CONFIG_LOCKDEP)
GEM_BUG_ON(debug_locks &&
!!lockdep_is_held(&rq->i915->drm.struct_mutex) !=
!!(flags & I915_WAIT_LOCKED));
#endif
as i915_gem_shrinker_vmap() could conceivably be called under
struct_mutex, e.g. i915_gem_object_pin_map(), and I'm sure I've seen the
vmap arena used for setting pte bits.
Onwards to removing that restriction!
-Chris
More information about the Intel-gfx
mailing list