Message ID | 20180703101829.7360-1-chris@chris-wilson.co.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 03/07/2018 11:18, Chris Wilson wrote: > live_gtt is a very slow test to run, simply because it tries to allocate > and use as much as the 48b address space as possibly can and in the > process will try to own all of the system memory. This leads to resource > exhaustion and CPU starvation; the latter impacts us when the NMI > watchdog declares a task hung due to a mutex contention with ourselves. > This we can prevent by releasing the struct_mutex and forcing our > i915/rcu workers to run, and in particular flushing the freed object > worker that is the cause for concern. > > References: https://bugs.freedesktop.org/show_bug.cgi?id=107094 > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> > --- > drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 23 +++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c > index fff26bd05f71..eefcf7b84054 100644 > --- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c > +++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c > @@ -32,6 +32,20 @@ > #include "mock_drm.h" > #include "mock_gem_device.h" > > +static void cleanup_freed_objects(struct drm_i915_private *i915) > +{ > + /* > + * As we may hold onto the struct_mutex for inordinate lengths of > + * time, the NMI khungtaskd detector may fire for the free objects > + * worker. > + */ > + mutex_unlock(&i915->drm.struct_mutex); > + > + i915_gem_drain_freed_objects(i915); > + > + mutex_lock(&i915->drm.struct_mutex); > +} > + > static void fake_free_pages(struct drm_i915_gem_object *obj, > struct sg_table *pages) > { > @@ -290,6 +304,8 @@ static int lowlevel_hole(struct drm_i915_private *i915, > i915_gem_object_put(obj); > > kfree(order); > + > + cleanup_freed_objects(i915); > } > > return 0; > @@ -518,6 +534,7 @@ static int fill_hole(struct drm_i915_private *i915, > } > > close_object_list(&objects, vm); > + cleanup_freed_objects(i915); > } > > return 0; > @@ -604,6 +621,8 @@ static int walk_hole(struct drm_i915_private *i915, > i915_gem_object_put(obj); > if (err) > return err; > + > + cleanup_freed_objects(i915); > } > > return 0; > @@ -788,6 +807,8 @@ static int drunk_hole(struct drm_i915_private *i915, > kfree(order); > if (err) > return err; > + > + cleanup_freed_objects(i915); > } > > return 0; > @@ -856,6 +877,7 @@ static int __shrink_hole(struct drm_i915_private *i915, > } > > close_object_list(&objects, vm); > + cleanup_freed_objects(i915); > return err; > } > > @@ -948,6 +970,7 @@ static int shrink_boom(struct drm_i915_private *i915, > i915_gem_object_put(explode); > > memset(&vm->fault_attr, 0, sizeof(vm->fault_attr)); > + cleanup_freed_objects(i915); > } > > return 0; > Okay this is nicer. Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Regards, Tvrtko
diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c index fff26bd05f71..eefcf7b84054 100644 --- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c @@ -32,6 +32,20 @@ #include "mock_drm.h" #include "mock_gem_device.h" +static void cleanup_freed_objects(struct drm_i915_private *i915) +{ + /* + * As we may hold onto the struct_mutex for inordinate lengths of + * time, the NMI khungtaskd detector may fire for the free objects + * worker. + */ + mutex_unlock(&i915->drm.struct_mutex); + + i915_gem_drain_freed_objects(i915); + + mutex_lock(&i915->drm.struct_mutex); +} + static void fake_free_pages(struct drm_i915_gem_object *obj, struct sg_table *pages) { @@ -290,6 +304,8 @@ static int lowlevel_hole(struct drm_i915_private *i915, i915_gem_object_put(obj); kfree(order); + + cleanup_freed_objects(i915); } return 0; @@ -518,6 +534,7 @@ static int fill_hole(struct drm_i915_private *i915, } close_object_list(&objects, vm); + cleanup_freed_objects(i915); } return 0; @@ -604,6 +621,8 @@ static int walk_hole(struct drm_i915_private *i915, i915_gem_object_put(obj); if (err) return err; + + cleanup_freed_objects(i915); } return 0; @@ -788,6 +807,8 @@ static int drunk_hole(struct drm_i915_private *i915, kfree(order); if (err) return err; + + cleanup_freed_objects(i915); } return 0; @@ -856,6 +877,7 @@ static int __shrink_hole(struct drm_i915_private *i915, } close_object_list(&objects, vm); + cleanup_freed_objects(i915); return err; } @@ -948,6 +970,7 @@ static int shrink_boom(struct drm_i915_private *i915, i915_gem_object_put(explode); memset(&vm->fault_attr, 0, sizeof(vm->fault_attr)); + cleanup_freed_objects(i915); } return 0;
live_gtt is a very slow test to run, simply because it tries to allocate and use as much as the 48b address space as possibly can and in the process will try to own all of the system memory. This leads to resource exhaustion and CPU starvation; the latter impacts us when the NMI watchdog declares a task hung due to a mutex contention with ourselves. This we can prevent by releasing the struct_mutex and forcing our i915/rcu workers to run, and in particular flushing the freed object worker that is the cause for concern. References: https://bugs.freedesktop.org/show_bug.cgi?id=107094 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> --- drivers/gpu/drm/i915/selftests/i915_gem_gtt.c | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+)