From: Usama Arif <usama.arif@linux.dev>
To: Cristian Marussi <cristian.marussi@arm.com>
Cc: Usama Arif <usama.arif@linux.dev>,
linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, arm-scmi@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-doc@vger.kernel.org,
sudeep.holla@kernel.org, james.quinlan@broadcom.com,
f.fainelli@gmail.com, vincent.guittot@linaro.org,
etienne.carriere@st.com, peng.fan@oss.nxp.com,
michal.simek@amd.com, dan.carpenter@linaro.org, d-gole@ti.com,
jonathan.cameron@huawei.com, elif.topuz@arm.com,
lukasz.luba@arm.com, philip.radford@arm.com, brauner@kernel.org,
souvik.chakravarty@arm.com
Subject: Re: [PATCH v3 02/24] firmware: arm_scmi: Reduce the scope of protocols mutex
Date: Fri, 12 Jun 2026 03:15:24 -0700 [thread overview]
Message-ID: <20260612101525.340337-1-usama.arif@linux.dev> (raw)
In-Reply-To: <20260329163337.637393-3-cristian.marussi@arm.com>
On Sun, 29 Mar 2026 17:33:13 +0100 Cristian Marussi <cristian.marussi@arm.com> wrote:
> Currently the mutex dedicated to the protection of the list of registered
> protocols is held during all the protocol initialization phase.
>
> Such a wide locking region is not needed and causes problem when trying to
> initialize notifications from within a protocol initialization routine.
>
> Reduce the scope of the protocol mutex.
I think this changes more than the mutex scope. scmi_get_protocol_instance()
can now drop protocols_mtx after idr_find() while scmi_protocol_release()
can concurrently drop the final reference, remove the IDR entry, and release
the devres group. Does that leaves a use-after-free window around the returned
pi?
>
> Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
> ---
> v1-->v2
> - Fixed improper mixed usage of cleanup and goto constructs
> ---
> drivers/firmware/arm_scmi/driver.c | 50 ++++++++++++++----------------
> 1 file changed, 24 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
> index 3e76a3204ba4..26f192b8d7a9 100644
> --- a/drivers/firmware/arm_scmi/driver.c
> +++ b/drivers/firmware/arm_scmi/driver.c
> @@ -17,6 +17,7 @@
> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>
> #include <linux/bitmap.h>
> +#include <linux/cleanup.h>
> #include <linux/debugfs.h>
> #include <linux/device.h>
> #include <linux/export.h>
> @@ -2190,7 +2191,6 @@ static void scmi_protocol_version_initialize(struct device *dev,
> * all resources management is handled via a dedicated per-protocol devres
> * group.
> *
> - * Context: Assumes to be called with @protocols_mtx already acquired.
> * Return: A reference to a freshly allocated and initialized protocol instance
> * or ERR_PTR on failure. On failure the @proto reference is at first
> * put using @scmi_protocol_put() before releasing all the devres group.
> @@ -2236,8 +2236,10 @@ scmi_alloc_init_protocol_instance(struct scmi_info *info,
> if (ret)
> goto clean;
>
> - ret = idr_alloc(&info->protocols, pi, proto->id, proto->id + 1,
> - GFP_KERNEL);
> + /* Finally register the initialized protocol */
> + mutex_lock(&info->protocols_mtx);
> + ret = idr_alloc(&info->protocols, pi, proto->id, proto->id + 1, GFP_KERNEL);
> + mutex_unlock(&info->protocols_mtx);
> if (ret != proto->id)
> goto clean;
>
> @@ -2284,27 +2286,25 @@ scmi_alloc_init_protocol_instance(struct scmi_info *info,
> static struct scmi_protocol_instance * __must_check
> scmi_get_protocol_instance(const struct scmi_handle *handle, u8 protocol_id)
> {
> - struct scmi_protocol_instance *pi;
> struct scmi_info *info = handle_to_scmi_info(handle);
> + const struct scmi_protocol *proto;
>
> - mutex_lock(&info->protocols_mtx);
> - pi = idr_find(&info->protocols, protocol_id);
> -
> - if (pi) {
> - refcount_inc(&pi->users);
> - } else {
> - const struct scmi_protocol *proto;
> + scoped_guard(mutex, &info->protocols_mtx) {
> + struct scmi_protocol_instance *pi;
>
> - /* Fails if protocol not registered on bus */
> - proto = scmi_protocol_get(protocol_id, &info->version);
> - if (proto)
> - pi = scmi_alloc_init_protocol_instance(info, proto);
> - else
> - pi = ERR_PTR(-EPROBE_DEFER);
> + pi = idr_find(&info->protocols, protocol_id);
> + if (pi) {
> + refcount_inc(&pi->users);
> + return pi;
> + }
> }
> - mutex_unlock(&info->protocols_mtx);
>
> - return pi;
> + /* Fails if protocol not registered on bus */
> + proto = scmi_protocol_get(protocol_id, &info->version);
> + if (!proto)
> + return ERR_PTR(-EPROBE_DEFER);
> +
> + return scmi_alloc_init_protocol_instance(info, proto);
> }
>
> /**
> @@ -2335,10 +2335,11 @@ void scmi_protocol_release(const struct scmi_handle *handle, u8 protocol_id)
> struct scmi_info *info = handle_to_scmi_info(handle);
> struct scmi_protocol_instance *pi;
>
> - mutex_lock(&info->protocols_mtx);
> - pi = idr_find(&info->protocols, protocol_id);
> - if (WARN_ON(!pi))
> - goto out;
> + scoped_guard(mutex, &info->protocols_mtx) {
> + pi = idr_find(&info->protocols, protocol_id);
> + if (WARN_ON(!pi))
> + return;
> + }
>
> if (refcount_dec_and_test(&pi->users)) {
> void *gid = pi->gid;
> @@ -2357,9 +2358,6 @@ void scmi_protocol_release(const struct scmi_handle *handle, u8 protocol_id)
> dev_dbg(handle->dev, "De-Initialized protocol: 0x%X\n",
> protocol_id);
> }
> -
> -out:
> - mutex_unlock(&info->protocols_mtx);
> }
>
> void scmi_setup_protocol_implemented(const struct scmi_protocol_handle *ph,
> --
> 2.53.0
>
>
next prev parent reply other threads:[~2026-06-12 10:15 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-29 16:33 [PATCH v3 00/24] Introduce SCMI Telemetry FS support Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 01/24] firmware: arm_scmi: Add new SCMIv4.0 error codes definitions Cristian Marussi
2026-06-12 10:10 ` Usama Arif
2026-03-29 16:33 ` [PATCH v3 02/24] firmware: arm_scmi: Reduce the scope of protocols mutex Cristian Marussi
2026-06-12 10:15 ` Usama Arif [this message]
2026-03-29 16:33 ` [PATCH v3 03/24] firmware: arm_scmi: Allow registration of unknown-size events/reports Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 04/24] firmware: arm_scmi: Allow protocols to register for notifications Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 05/24] uapi: Add ARM SCMI definitions Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 06/24] dt-bindings: firmware: arm,scmi: Add support for telemetry protocol Cristian Marussi
2026-03-29 17:31 ` Rob Herring (Arm)
2026-03-29 18:00 ` Cristian Marussi
2026-03-30 7:15 ` Krzysztof Kozlowski
2026-03-30 7:11 ` Krzysztof Kozlowski
2026-03-29 16:33 ` [PATCH v3 07/24] include: trace: Add Telemetry trace events Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 08/24] firmware: arm_scmi: Add basic Telemetry support Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 09/24] firmware: arm_scmi: Add support to parse SHMTIs areas Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 10/24] firmware: arm_scmi: Add Telemetry configuration operations Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 11/24] firmware: arm_scmi: Add Telemetry DataEvent read capabilities Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 12/24] firmware: arm_scmi: Add support for Telemetry reset Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 13/24] firmware: arm_scmi: Add Telemetry notification support Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 14/24] firmware: arm_scmi: Add support for boot-on Telemetry Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 15/24] firmware: arm_scmi: Add System Telemetry filesystem driver Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 16/24] fs/stlmfs: Document ARM SCMI Telemetry filesystem Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 17/24] firmware: arm_scmi: Add System Telemetry ioctls support Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 18/24] fs/stlmfs: Document alternative ioctl based binary interface Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 19/24] firmware: arm_scmi: Add Telemetry components view Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 20/24] fs/stlmfs: Document alternative topological view Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 21/24] [RFC] docs: stlmfs: Document ARM SCMI Telemetry FS ABI Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 22/24] firmware: arm_scmi: Add lazy population support to Telemetry FS Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 23/24] fs/stlmfs: Document lazy mode and related mount option Cristian Marussi
2026-03-29 16:33 ` [PATCH v3 24/24] [RFC] tools/scmi: Add SCMI Telemetry testing tool Cristian Marussi
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=20260612101525.340337-1-usama.arif@linux.dev \
--to=usama.arif@linux.dev \
--cc=arm-scmi@vger.kernel.org \
--cc=brauner@kernel.org \
--cc=cristian.marussi@arm.com \
--cc=d-gole@ti.com \
--cc=dan.carpenter@linaro.org \
--cc=elif.topuz@arm.com \
--cc=etienne.carriere@st.com \
--cc=f.fainelli@gmail.com \
--cc=james.quinlan@broadcom.com \
--cc=jonathan.cameron@huawei.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lukasz.luba@arm.com \
--cc=michal.simek@amd.com \
--cc=peng.fan@oss.nxp.com \
--cc=philip.radford@arm.com \
--cc=souvik.chakravarty@arm.com \
--cc=sudeep.holla@kernel.org \
--cc=vincent.guittot@linaro.org \
/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.