On Thu, 16 Oct 2025, Ville Syrjala <[email protected]> wrote: > From: Ville Syrjälä <[email protected]>
Subject, *frontbuffer > > Our fb_tracking.lock is serving a double duty: > - protects fb_tracking.busy_bits > - provides the write-side protection for obj->frontbuffer > > Split obj->frontbuffer role into a separate lock so that > we can clean up the current mess with the frontbuffer lifetime > management. > > Acked-by: Jani Nikula <[email protected]> Upgrade to Reviewed-by: Jani Nikula <[email protected]> > Signed-off-by: Ville Syrjälä <[email protected]> > --- > drivers/gpu/drm/i915/display/intel_display_core.h | 4 ++++ > drivers/gpu/drm/i915/display/intel_display_driver.c | 1 + > drivers/gpu/drm/i915/display/intel_frontbuffer.c | 10 +++++----- > drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h | 2 +- > 4 files changed, 11 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h > b/drivers/gpu/drm/i915/display/intel_display_core.h > index fa43636b89fa..13576d07c999 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_core.h > +++ b/drivers/gpu/drm/i915/display/intel_display_core.h > @@ -141,6 +141,10 @@ struct intel_dpll_global { > }; > > struct intel_frontbuffer_tracking { > + /* protects obj->frontbuffer (write-side) */ > + spinlock_t frontbuffer_lock; > + > + /* protects busy_bits */ > spinlock_t lock; > > /* > diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c > b/drivers/gpu/drm/i915/display/intel_display_driver.c > index f84a0b26b7a6..ac684f8c5d40 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_driver.c > +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c > @@ -184,6 +184,7 @@ void intel_display_driver_early_probe(struct > intel_display *display) > if (!HAS_DISPLAY(display)) > return; > > + spin_lock_init(&display->fb_tracking.frontbuffer_lock); > spin_lock_init(&display->fb_tracking.lock); > mutex_init(&display->backlight.lock); > mutex_init(&display->audio.mutex); > diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.c > b/drivers/gpu/drm/i915/display/intel_frontbuffer.c > index bdf8bfa7deb9..02b06dfb9fee 100644 > --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.c > +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.c > @@ -210,7 +210,7 @@ static void frontbuffer_retire(struct i915_active *ref) > } > > static void frontbuffer_release(struct kref *ref) > - __releases(&to_intel_display(front->obj->dev)->fb_tracking.lock) > + > __releases(&to_intel_display(front->obj->dev)->fb_tracking.frontbuffer_lock) > { > struct intel_frontbuffer *ret, *front = > container_of(ref, typeof(*front), ref); > @@ -223,7 +223,7 @@ static void frontbuffer_release(struct kref *ref) > > ret = intel_bo_set_frontbuffer(obj, NULL); > drm_WARN_ON(display->drm, ret); > - spin_unlock(&display->fb_tracking.lock); > + spin_unlock(&display->fb_tracking.frontbuffer_lock); > > i915_active_fini(&front->write); > > @@ -256,9 +256,9 @@ intel_frontbuffer_get(struct drm_gem_object *obj) > I915_ACTIVE_RETIRE_SLEEPS); > INIT_WORK(&front->flush_work, intel_frontbuffer_flush_work); > > - spin_lock(&display->fb_tracking.lock); > + spin_lock(&display->fb_tracking.frontbuffer_lock); > cur = intel_bo_set_frontbuffer(obj, front); > - spin_unlock(&display->fb_tracking.lock); > + spin_unlock(&display->fb_tracking.frontbuffer_lock); > > if (cur != front) { > drm_gem_object_put(obj); > @@ -272,7 +272,7 @@ void intel_frontbuffer_put(struct intel_frontbuffer > *front) > { > kref_put_lock(&front->ref, > frontbuffer_release, > - &to_intel_display(front->obj->dev)->fb_tracking.lock); > + > &to_intel_display(front->obj->dev)->fb_tracking.frontbuffer_lock); > } > > /** > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h > b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h > index b682969e3a29..1ec382c43aee 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object_frontbuffer.h > @@ -77,7 +77,7 @@ i915_gem_object_get_frontbuffer(const struct > drm_i915_gem_object *obj) > * Set object's frontbuffer pointer. If frontbuffer is already set for the > * object keep it and return it's pointer to the caller. Please note that RCU > * mechanism is used to handle e.g. ongoing removal of frontbuffer pointer. > This > - * function is protected by i915->display->fb_tracking.lock > + * function is protected by i915->display->fb_tracking.frontbuffer_lock > * > * Return: pointer to frontbuffer which was set. > */ -- Jani Nikula, Intel
