On Wed, Dec 07, 2016 at 05:56:47PM +0000, Chris Wilson wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > The i915_gem_active stuff doesn't like a NULL ->retire hook, but > the overlay code can set it to NULL. That obviously ends up oopsing. > Fix it by introducing a new helper to assign the retirement callback > that will switch out the NULL function pointer with > i915_gem_retire_noop. > > Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > Fixes: 0d9bdd886f29 ("drm/i915: Convert intel_overlay to request tracking") > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> lgtm, feel free to put yourself as the author is you want. BTW I don't think we ever call the init_foo() thing on last_flip. Should be do that in overlay_init() or some such place? > --- > drivers/gpu/drm/i915/i915_gem_request.h | 19 +++++++++++++++++++ > drivers/gpu/drm/i915/intel_overlay.c | 3 ++- > 2 files changed, 21 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_request.h b/drivers/gpu/drm/i915/i915_gem_request.h > index 2fc6b8b3f580..b0d50aa81acb 100644 > --- a/drivers/gpu/drm/i915/i915_gem_request.h > +++ b/drivers/gpu/drm/i915/i915_gem_request.h > @@ -440,6 +440,25 @@ i915_gem_active_set(struct i915_gem_active *active, > rcu_assign_pointer(active->request, request); > } > > +/** > + * i915_gem_active_set_retire_fn - updates the retirement callback > + * @active - the active tracker > + * @fn - the routine called when the request is retired > + * @mutex - struct_mutex used to guard retirements > + * > + * i915_gem_active_set_retire_fn() updates the function pointer that > + * is called when the final request associated with the @active tracker > + * is retired. > + */ > +static inline void > +i915_gem_active_set_retire_fn(struct i915_gem_active *active, > + i915_gem_retire_fn fn, > + struct mutex *mutex) > +{ > + lockdep_assert_held(mutex); > + active->retire = fn ?: i915_gem_retire_noop; > +} > + > static inline struct drm_i915_gem_request * > __i915_gem_active_peek(const struct i915_gem_active *active) > { > diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c > index 354f8cec96bb..29509f3055c8 100644 > --- a/drivers/gpu/drm/i915/intel_overlay.c > +++ b/drivers/gpu/drm/i915/intel_overlay.c > @@ -216,7 +216,8 @@ static void intel_overlay_submit_request(struct intel_overlay *overlay, > { > GEM_BUG_ON(i915_gem_active_peek(&overlay->last_flip, > &overlay->i915->drm.struct_mutex)); > - overlay->last_flip.retire = retire; > + i915_gem_active_set_retire_fn(&overlay->last_flip, retire, > + &overlay->i915->drm.struct_mutex); > i915_gem_active_set(&overlay->last_flip, req); > i915_add_request(req); > } > -- > 2.11.0 -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx