Hi Maxime, On Tue, 11 Feb 2025 14:10:50 +0100 Maxime Ripard <mripard@xxxxxxxxxx> wrote: > On Mon, Feb 10, 2025 at 06:12:52PM +0100, Luca Ceresoli wrote: > > Hello Maxime, > > > > On Fri, 7 Feb 2025 12:47:51 +0100 > > Maxime Ripard <mripard@xxxxxxxxxx> wrote: > > > > > > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h > > > > index ad7ba444a13e5ecf16f996de3742e4ac67dc21f1..43cef0f6ccd36034f64ad2babfebea62db1d9e43 100644 > > > > --- a/include/drm/drm_bridge.h > > > > +++ b/include/drm/drm_bridge.h > > > > @@ -31,6 +31,7 @@ > > > > #include <drm/drm_encoder.h> > > > > #include <drm/drm_mode_object.h> > > > > #include <drm/drm_modes.h> > > > > +#include <drm/drm_print.h> > > > > > > > > struct device_node; > > > > > > > > @@ -863,6 +864,22 @@ struct drm_bridge { > > > > const struct drm_bridge_timings *timings; > > > > /** @funcs: control functions */ > > > > const struct drm_bridge_funcs *funcs; > > > > + > > > > + /** > > > > + * @container_offset: Offset of this struct within the container > > > > + * struct embedding it. Used for refcounted bridges to free the > > > > + * embeddeing struct when the refcount drops to zero. Unused on > > > > + * legacy bridges. > > > > + */ > > > > + size_t container_offset; > > > > > > This shouldn't be in there. You can create an intermediate structure and > > > store both pointers for the action to consume. > > > > You mean to store container_offset + refcount + is_refcounted? > > No, I meant for the private structure pointer and the drm_bridge > pointer. refcount should be in drm_bridge, and I think is_refcounted > should be dropped. Storing the container pointer instead of the offset is a good idea, it will allow to get rid of is_refcounted: drm_bridge_is_refcounted() can just return "container != NULL" instead of "bridge->is_refcounted". So far so good. I'm not sure about the intermediate struct you have in mind though. Do you mean: struct drm_bridge_pointers { struct drm_bridge *bridge; void *container; } ? If that's what you mean, should it be embedded in drm_struct or allocated separately? If you mean to embed that struct in drm_bridge, then I the drm_bridge pointer inside the intermediate struct would be useless. If instead you mean to embed it in drm_struct: I'm not sure I see much benefit except maybe not exposing the container pointer to drm_bridge users, but I see a drawbacks: at the last put we need to find the container pointer to free from a struct kref pointer, which can work only if the container pointer is in the same struct as struct kref. Additionally, the consuming action for that struct just needs a drm_bridge pointer: static void drm_bridge_put_void(void *data) { struct drm_bridge *bridge = (struct drm_bridge *)data; drm_bridge_put(bridge); } Can you clarify this? I'd love to have this cleanup in the next iteration. Luca -- Luca Ceresoli, Bootlin Embedded Linux and Kernel engineering https://bootlin.com