[PATCH v6 3/4] firmware: arm_scmi: Fix scmi_protocol_device_unrequest() race

From: Hans de Goede

Date: Fri Sep 11 2026 - 11:31:47 EST


scmi_protocol_device_unrequest() unlocks scmi_requested_devices_mtx during
the notifier call. During this window phead might have been deleted by
another racing scmi_protocol_device_unrequest().

Re-acquire phead before cleaning it up to avoid this potential double
free problem.

Fixes: d3cd7c525fd2 ("firmware: arm_scmi: Refactor protocol device creation")
Signed-off-by: Hans de Goede <johannes.goede@xxxxxxxxxxxxxxxx>
---
Changes in v6:
- New patch in v6 of this series (Suggested by local Shashiko run on v5)
---
drivers/firmware/arm_scmi/bus.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
index 6f667e4ffeed..651d4ba06574 100644
--- a/drivers/firmware/arm_scmi/bus.c
+++ b/drivers/firmware/arm_scmi/bus.c
@@ -173,7 +173,13 @@ static void scmi_protocol_device_unrequest(const struct scmi_device_id *id_table
}
}

- if (list_empty(phead)) {
+ /*
+ * Since scmi_requested_devices_mtx is unlocked during
+ * the notifier call phead might have been deleted by another
+ * racing scmi_protocol_device_unrequest(), re-acquire it here.
+ */
+ phead = idr_find(&scmi_requested_devices, id_table->protocol_id);
+ if (phead && list_empty(phead)) {
idr_remove(&scmi_requested_devices,
id_table->protocol_id);
kfree(phead);
--
2.55.0