On Wed, Jul 27, 2016 at 12:14:42PM +0100, Chris Wilson wrote: > This reimplements the denial-of-service protection against igt from > commit 227f782e4667 ("drm/i915: Retire requests before creating a new > one") and transfers the stall from before each batch into get_pages(). > The issue is that the stall is increasing latency between batches which > is detrimental in some cases (especially coupled with execlists) to > keeping the GPU well fed. Also we have made the observation that retiring > requests can of itself free objects (and requests) and therefore makes > a good first step when shrinking. > > v2: Recycle objects prior to i915_gem_object_get_pages() > v3: Remove the reference to the ring from i915_gem_requests_ring() as it > operates on an intel_engine_cs. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/i915_drv.h | 1 - > drivers/gpu/drm/i915/i915_gem.c | 7 +++++-- > drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 -- > drivers/gpu/drm/i915/i915_gem_request.c | 4 ++-- > 4 files changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index fbda38f25c6b..2de3d16f7b80 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -3169,7 +3169,6 @@ struct drm_i915_gem_request * > i915_gem_find_active_request(struct intel_engine_cs *engine); > > void i915_gem_retire_requests(struct drm_i915_private *dev_priv); > -void i915_gem_retire_requests_ring(struct intel_engine_cs *engine); > > static inline u32 i915_reset_counter(struct i915_gpu_error *error) > { > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index bf652dc88024..68dbe4f7940c 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -2244,7 +2244,6 @@ int > i915_gem_object_get_pages(struct drm_i915_gem_object *obj) > { > struct drm_i915_private *dev_priv = to_i915(obj->base.dev); > - const struct drm_i915_gem_object_ops *ops = obj->ops; > int ret; > > if (obj->pages) > @@ -2257,7 +2256,10 @@ i915_gem_object_get_pages(struct drm_i915_gem_object *obj) > > BUG_ON(obj->pages_pin_count); > > - ret = ops->get_pages(obj); > + /* Recycle as many active objects as possible first */ > + i915_gem_retire_requests(dev_priv); > + > + ret = obj->ops->get_pages(obj); Why exactly do we need this? - shmem objs already call shrink_all if they can't get at the memory - everyone else doesn't care. Even if we need this in some case it looks funny, since it splits the memory cleanup between caller and callee of get_pages. -Daniel > if (ret) > return ret; > > @@ -4437,6 +4439,7 @@ i915_gem_cleanup_engines(struct drm_device *dev) > static void > init_engine_lists(struct intel_engine_cs *engine) > { > + /* Early initialisation so that core GEM works during engine setup */ > INIT_LIST_HEAD(&engine->request_list); > } > > diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c > index 5e3b5054f72d..0593ea3ba211 100644 > --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c > +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c > @@ -781,8 +781,6 @@ i915_gem_execbuffer_reserve(struct intel_engine_cs *engine, > bool has_fenced_gpu_access = INTEL_GEN(engine->i915) < 4; > int retry; > > - i915_gem_retire_requests_ring(engine); > - > vm = list_first_entry(vmas, struct i915_vma, exec_list)->vm; > > INIT_LIST_HEAD(&ordered_vmas); > diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c > index 07f08e546915..3395c955a532 100644 > --- a/drivers/gpu/drm/i915/i915_gem_request.c > +++ b/drivers/gpu/drm/i915/i915_gem_request.c > @@ -717,7 +717,7 @@ complete: > return ret; > } > > -void i915_gem_retire_requests_ring(struct intel_engine_cs *engine) > +static void engine_retire_requests(struct intel_engine_cs *engine) > { > struct drm_i915_gem_request *request, *next; > > @@ -741,7 +741,7 @@ void i915_gem_retire_requests(struct drm_i915_private *dev_priv) > GEM_BUG_ON(!dev_priv->gt.awake); > > for_each_engine(engine, dev_priv) { > - i915_gem_retire_requests_ring(engine); > + engine_retire_requests(engine); > if (list_empty(&engine->request_list)) > dev_priv->gt.active_engines &= ~intel_engine_flag(engine); > } > -- > 2.8.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx