diff options
| author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2025-10-16 21:54:04 +0300 |
|---|---|---|
| committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2025-11-07 17:38:02 +0200 |
| commit | 3afef438eee38947ba7e8bb9b23d56d77c25f14b (patch) | |
| tree | 61b081933a2640544bfff2ae15f7e568caa40880 | |
| parent | 65417489541fcef7f14104f3a0292e479f08f72b (diff) | |
drm/i915/frontbuffer: Split fb_tracking.lock into two
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.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patch.msgid.link/20251016185408.22735-7-ville.syrjala@linux.intel.com
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
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 2eb742ab5222..9e53ae599cf0 100644 --- a/drivers/gpu/drm/i915/display/intel_display_core.h +++ b/drivers/gpu/drm/i915/display/intel_display_core.h @@ -142,6 +142,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 eb0727b9a0f6..c7a74b0df25f 100644 --- a/drivers/gpu/drm/i915/display/intel_display_driver.c +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c @@ -186,6 +186,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. */ |