]> git.ipfire.org Git - thirdparty/linux.git/commit
drm/bridge: add drm_for_each_bridge_in_chain_scoped()
authorLuca Ceresoli <luca.ceresoli@bootlin.com>
Fri, 8 Aug 2025 14:49:10 +0000 (16:49 +0200)
committerLuca Ceresoli <luca.ceresoli@bootlin.com>
Tue, 16 Sep 2025 13:02:13 +0000 (15:02 +0200)
commite46efc6a7d288830c4aeaf3c65c7e913a8ca35d7
tree0cdc5351bb57f0ee5f44882fa531721ddb411a4e
parentc92f59bac078465425f1223b29a8d63c89027eba
drm/bridge: add drm_for_each_bridge_in_chain_scoped()

drm_for_each_bridge_in_chain() iterates ofer the bridges in an encoder
chain without protecting the lifetime of the bridges using
drm_bridge_get/put(). This creates a risk window where the bridge could be
freed while iterating on it. Users of drm_for_each_bridge_in_chain() cannot
solve this reliably.

Add variant of drm_for_each_bridge_in_chain() that gets/puts the bridge
reference at the beginning/end of each iteration, and puts it if breaking
ot of the loop.

Note that this requires adding a new drm_bridge_get_next_bridge_and_put()
function because, unlike similar functions as __of_get_next_child(),
drm_bridge_get_next_bridge() gets the "next" pointer but does not put the
"prev" pointer. Unfortunately drm_bridge_get_next_bridge() cannot be
modified to put the "prev" pointer because some of its users rely on
this, such as drm_atomic_bridge_propagate_bus_flags().

Also deprecate drm_for_each_bridge_in_chain(), in preparation for removing
it after converting all users to the scoped version.

Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20250808-drm-bridge-alloc-getput-for_each_bridge-v2-3-edb6ee81edf1@bootlin.com
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
.clang-format
include/drm/drm_bridge.h