From: Luca Ceresoli <luca.ceresoli@bootlin.com>
To: Anusha Srivatsa <asrivats@redhat.com>
Cc: Neil Armstrong <neil.armstrong@linaro.org>,
Jessica Zhang <quic_jesszhan@quicinc.com>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/5] drm/panel: Add refcount support
Date: Wed, 26 Mar 2025 10:23:04 +0100 [thread overview]
Message-ID: <20250326102304.49510630@booty> (raw)
In-Reply-To: <20250325-b4-panel-refcounting-v1-2-4e2bf5d19c5d@redhat.com>
On Tue, 25 Mar 2025 13:24:09 -0400
Anusha Srivatsa <asrivats@redhat.com> wrote:
> Allocate panel via reference counting.
> Add _get() and _put() helper functions
> to ensure panel allocations are refcounted.
> Avoid use after free by ensuring panel is
> valid and can be usable till the last reference
> is put. This avoids use-after-free
"panel is valid and can be usable" is not totally correct. When there
are still references held, you ensure the panel struct is still
_allocated_, not necessarily valid and usable.
Minor nit: you are wrapping at less than 50 columns, which is a bit
tight. I think 75 is the expected value for wrapping.
> Signed-off-by: Anusha Srivatsa <asrivats@redhat.com>
[...]
> +/**
> + * drm_panel_get - Acquire a panel reference
> + * @panel: DRM panel
> + *
> + * This function increments the panel's refcount.
> + *
> + */
Not sure it's mandatory, but documenting the returned value is good
practice , e.g.:
* Returns:
* Pointer to @panel.
> +/**
> + * drm_panel_put - Release a panel reference
> + * @panel: DRM panel
> + *
> + * This function decrements the panel's reference count and frees the
> + * object if the reference count drops to zero.
> + */
> +struct drm_panel *drm_panel_put(struct drm_panel *panel)
> +{
> + if (!panel)
> + return panel;
> +
> + kref_put(&panel->refcount, __drm_panel_free);
> +
> + return panel;
While this is using the same structure as my bridge work, I now realize
the _put() should probably not return the panel (or bridge) pointer, it
should just be a void function. The reason is the pointer might have
been freed when _put() returns (depending on the refcount) so that
pointer value might be dangling and whoever calls _put() must not use
that pointer anymore.
Other get/put APIs do this, e.g. of_node_get/put().
So I'm going to change drm_bridge_put() to return void, unless there
are good reasons to keep it and that I'm missing.
> @@ -280,7 +291,10 @@ void *__devm_drm_panel_alloc(struct device *dev, size_t size, size_t offset,
> * @member: the name of the &drm_panel within @type
> * @funcs: callbacks for this panel
> * @connector_type: connector type of the driver
> - * The returned refcount is initialised to 1
> + *
> + * The returned refcount is initialised to 1. This reference will
> + * be automatically dropped via devm (by calling
> + * drm_bridge_put()) when @dev is removed.
^^^^^^
"panel". Same in a few other places in this patch. Please search in all
this series in case there are more. It's easy to forget about replacing
some of those in the comments. :)
Luca
--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2025-03-26 9:23 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-25 17:24 [PATCH 0/5] drm/panel: Panel Refcounting infrastructure Anusha Srivatsa
2025-03-25 17:24 ` [PATCH 1/5] drm/panel: Add new helpers for refcounted panel allocatons Anusha Srivatsa
2025-03-26 9:22 ` Luca Ceresoli
2025-03-26 15:26 ` Maxime Ripard
2025-03-26 16:57 ` Anusha Srivatsa
2025-03-26 15:25 ` Maxime Ripard
2025-03-25 17:24 ` [PATCH 2/5] drm/panel: Add refcount support Anusha Srivatsa
2025-03-26 1:21 ` kernel test robot
2025-03-26 9:23 ` Luca Ceresoli [this message]
2025-03-26 15:30 ` Maxime Ripard
2025-03-26 15:28 ` Maxime Ripard
2025-03-25 17:24 ` [PATCH 3/5] drm/panel: get/put panel reference in drm_panel_add/remove() Anusha Srivatsa
2025-03-26 0:18 ` kernel test robot
2025-03-26 4:35 ` kernel test robot
2025-03-26 9:23 ` Luca Ceresoli
2025-03-26 15:31 ` Maxime Ripard
2025-03-26 16:56 ` Anusha Srivatsa
2025-03-25 17:24 ` [PATCH 4/5] drm/panel: deprecate old-style panel allocation Anusha Srivatsa
2025-03-26 9:23 ` Luca Ceresoli
2025-03-26 15:32 ` Maxime Ripard
2025-03-26 16:59 ` Anusha Srivatsa
2025-03-25 17:24 ` [PATCH 5/5] drm/panel/panel-simple: Use the new allocation in place of devm_kzalloc() Anusha Srivatsa
2025-03-26 9:23 ` Luca Ceresoli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250326102304.49510630@booty \
--to=luca.ceresoli@bootlin.com \
--cc=airlied@gmail.com \
--cc=asrivats@redhat.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=quic_jesszhan@quicinc.com \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.