From nobody Mon Feb 9 07:19:21 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 65C3036073D; Mon, 2 Feb 2026 23:52:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076344; cv=none; b=bWjFXgJ7HIKvTIjJdSCB93NUHxNguioRuag1IL5V6LnfbIZmwh4mtkVaHmZ5jXCQH+xcIHhAkFCba+3qmUhMNo4jakJuTNvjFJshfg1pxrQXSlXi0RwXmRhd7ipcHknqpe5rcKmAUZtaEg6mULZo0+Ux80k0ct1IcAqgWgz6pVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076344; c=relaxed/simple; bh=3qAGt3di1e2bar6yPpvHKQ//pI4RJnwYRhbAoAEPvLg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BpR0LvKW/4WRkiEJzbjl8VnEYD4B8gI5sXxZgQnX+smI8DFliVQPGt9PFW86xh5fqCVOuwavvMkDa4ERzAlzYZTXPEs6496W2hqT4PoY74ZdouqqE/LzZuV1mbzdaKFgn0wG+GET0kMlf/BC4Lh9gyc5L5nyzdb3ezK0ALLtVTw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ANWhiFDT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ANWhiFDT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id A2059C19421; Mon, 2 Feb 2026 23:52:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770076344; bh=3qAGt3di1e2bar6yPpvHKQ//pI4RJnwYRhbAoAEPvLg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ANWhiFDTRIqJPpKzeY8GY55GldisGXoAsdDO5RY2shMkDjtw96jQS30KRhnw7OjY9 yG+Ch7/9sEEvD0oWdRPOmhncM3O/ehQ1I9pXFNsHI0oAllzyZsOu55AxewNgUQOrfe cffHgCokq7gc232nZI08JEVkghvUGPQiD6Uu0RMGhtPtGZV21JGxqxyYVRb/OUttwW 5Wh51TpHbhkI+hB1LrA64ne7dkbvMtkXLzwW+wt68U4dq99Ip6KdTqirG8qJe31pYH el9EeJ2W5MZfNAbe38iPU8ELOGglvXWqnbBKrA5o8NHrPJLNGky8WcNIWSBVF2Sysv 51CeuHlk6qOYw== From: Danilo Krummrich To: gregkh@linuxfoundation.org, rafael@kernel.org Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, Danilo Krummrich Subject: [PATCH 1/7] devres: fix missing node debug info in devm_krealloc() Date: Tue, 3 Feb 2026 00:48:14 +0100 Message-ID: <20260202235210.55176-2-dakr@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260202235210.55176-1-dakr@kernel.org> References: <20260202235210.55176-1-dakr@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Fix missing call to set_node_dbginfo() for new devres nodes created by devm_krealloc(). Fixes: f82485722e5d ("devres: provide devm_krealloc()") Signed-off-by: Danilo Krummrich --- drivers/base/devres.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/base/devres.c b/drivers/base/devres.c index f54db6d138ab..1a972f47916e 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -940,6 +940,8 @@ void *devm_krealloc(struct device *dev, void *ptr, size= _t new_size, gfp_t gfp) if (!new_dr) return NULL; =20 + set_node_dbginfo(&new_dr->node, "devm_krealloc_release", new_size); + /* * The spinlock protects the linked list against concurrent * modifications but not the resource itself. --=20 2.52.0 From nobody Mon Feb 9 07:19:21 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D21AD361650; Mon, 2 Feb 2026 23:52:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076345; cv=none; b=ClT6jrFHecDpRSat718AqJZ+fe+dXiHoEPr3Zk+9kgup+d2HJE6NV2ryEh+3nfPurwHDfMwAL6KNK4Bhj0hf+aVzJnE28JfLI807oLiHrU7HmFoDsQ2MiQl5WW2R0Cp/mChokUGSR0HKF46OVsJ+3y/3s+wvHO9ucim45CyNHMo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076345; c=relaxed/simple; bh=Ks6rrunQRP0qbtAVunnS+WmB4noM4QsRlKAiMCdyh40=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eFbe04dQbJcyFL5/MzGSSYHc3q/lJfea5NPNhWNLmYgycGCkX7fb+KrSIt+RU0UCENK6HCWrFyUEUX2edTmi29fMrdejo5eYQIo64n7kKrhs4DYXQI0Tw/TwmVXFqVd3kM0BDqLTSkCz1DGMzZMG/lByeDyJm5bjPpdJn8kV9xY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=G4PyTXr1; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="G4PyTXr1" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7A6B5C19425; Mon, 2 Feb 2026 23:52:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770076345; bh=Ks6rrunQRP0qbtAVunnS+WmB4noM4QsRlKAiMCdyh40=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=G4PyTXr1y3fe66pzD+sY1tVWPRYHB3uik6pdmg97OqrhE0zktIMIV0xl/2qMeH32x kcr3iRjEj0HujRKFszFF0pKCx2kJBfiFiApz3Nz5i4DVMIeMQJE672bi3akQHccoAg PEN+5e4PI6j2uidrJ8wHqKuywVAQBrwTiLrzihEf3yE/CIfog5YY3xjYi8Cbz2OIBu GKIiUe5G1YLGG9fofJ411Ioivl/T28oos0VEJd2PqZRWyHtXfc+aCfnwvlccITdq2P 5NmlkBgA/UhNerFYKpsDuMiNspx9waiUxjMG1b/0tSYY5RxSLZZpLugKQtC2R0CY2O Lmd6buiZVwCsw== From: Danilo Krummrich To: gregkh@linuxfoundation.org, rafael@kernel.org Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, Danilo Krummrich Subject: [PATCH 2/7] devres: add devres_node_add() Date: Tue, 3 Feb 2026 00:48:15 +0100 Message-ID: <20260202235210.55176-3-dakr@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260202235210.55176-1-dakr@kernel.org> References: <20260202235210.55176-1-dakr@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Both devres_add() and devres_open_group() acquire the devres_lock and call add_dr(). Add a helper, devres_node_add(), for this pattern. Use guard(spinlock_irqsave) to avoid the explicit unlock call and local flag variables. Signed-off-by: Danilo Krummrich --- drivers/base/devres.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 1a972f47916e..0061c6564469 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -231,6 +231,13 @@ void devres_free(void *res) } EXPORT_SYMBOL_GPL(devres_free); =20 +static void devres_node_add(struct device *dev, struct devres_node *node) +{ + guard(spinlock_irqsave)(&dev->devres_lock); + + add_dr(dev, node); +} + /** * devres_add - Register device resource * @dev: Device to add resource to @@ -243,11 +250,8 @@ EXPORT_SYMBOL_GPL(devres_free); void devres_add(struct device *dev, void *res) { struct devres *dr =3D container_of(res, struct devres, data); - unsigned long flags; =20 - spin_lock_irqsave(&dev->devres_lock, flags); - add_dr(dev, &dr->node); - spin_unlock_irqrestore(&dev->devres_lock, flags); + devres_node_add(dev, &dr->node); } EXPORT_SYMBOL_GPL(devres_add); =20 @@ -552,7 +556,6 @@ int devres_release_all(struct device *dev) void *devres_open_group(struct device *dev, void *id, gfp_t gfp) { struct devres_group *grp; - unsigned long flags; =20 grp =3D kmalloc(sizeof(*grp), gfp); if (unlikely(!grp)) @@ -569,9 +572,7 @@ void *devres_open_group(struct device *dev, void *id, g= fp_t gfp) grp->id =3D id; grp->color =3D 0; =20 - spin_lock_irqsave(&dev->devres_lock, flags); - add_dr(dev, &grp->node[0]); - spin_unlock_irqrestore(&dev->devres_lock, flags); + devres_node_add(dev, &grp->node[0]); return grp->id; } EXPORT_SYMBOL_GPL(devres_open_group); --=20 2.52.0 From nobody Mon Feb 9 07:19:21 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 90893361642; Mon, 2 Feb 2026 23:52:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076347; cv=none; b=SITft9ZqofUp9BCLDGUk1qeoWeQKHcsIwRcYhxdTtjpTpEmCWG5ogPH3WENEJlkA3hWdgRctRUzpyAdc/dXTOlXaU6RGEnA5YfPWd8vAMdmlwXBEtrdiFVGZTgb2NIhvEAUFgp0m8pfiDTwftnl0Gdr/mPkwg3lVhK7dGX9z4lA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076347; c=relaxed/simple; bh=kEX3eqkgzlCrubTYxKOB2dvvY21lQFf1NjRpb/cL21E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qx+N59JI+76S7nPffnFV6EjSQJ0aK/aWIEOF7S10BRDPUc4x0mK/tSfJtaT255s82Y578pfi0b/Fa00UahpoSzYafo6Z0nAwvCVk3Q2KpNLw4Yh8iFxXaItCuN1ZuvhrwTlBM1TEJChKAmmEGhDMvwXQIG9EGJPHRNVyBR06R24= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=cqN1xnMd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cqN1xnMd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 35BC9C116C6; Mon, 2 Feb 2026 23:52:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770076347; bh=kEX3eqkgzlCrubTYxKOB2dvvY21lQFf1NjRpb/cL21E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cqN1xnMdcXrcTCoajXm146vlGn4R2w/Aj9HNJMc4zMAgKgfM66uJcpvYowbZJVs2f Qa3bbrxMDrc29fpJ7T0znKI21FspuKUPxRvEENkn9izaqPe+q9MrN5uPc7VsWA7gkv 6PIxotpzFuCYsobCtGiKZw/LNiri/i5Df6HLqdlkXfRzKvmAYOPX4hw/N78/QSSIc1 Lnhs7p4lmGCC/gyPq876Gn7+5uwBM70VwSNAFNw2CsZvUIh6H9P+9RAuR72quxHUE7 F1jos2TnMMJj+C90hu/WqMrLTIoM7LOLMpQ+3bj8awxRhbeK8QqQKK8pE4FvbRc+8F mQhe8oxmA+65Q== From: Danilo Krummrich To: gregkh@linuxfoundation.org, rafael@kernel.org Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, Danilo Krummrich Subject: [PATCH 3/7] devres: add devres_node_init() Date: Tue, 3 Feb 2026 00:48:16 +0100 Message-ID: <20260202235210.55176-4-dakr@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260202235210.55176-1-dakr@kernel.org> References: <20260202235210.55176-1-dakr@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Both alloc_dr() and devres_open_group() initialize devres_node.entry and set devres_node.release. Add a helper, devres_node_init(), for this pattern. Signed-off-by: Danilo Krummrich --- drivers/base/devres.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 0061c6564469..7cc46aeae792 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -42,6 +42,12 @@ struct devres_group { /* -- 8 pointers */ }; =20 +static void devres_node_init(struct devres_node *node, dr_release_t releas= e) +{ + INIT_LIST_HEAD(&node->entry); + node->release =3D release; +} + static void set_node_dbginfo(struct devres_node *node, const char *name, size_t size) { @@ -124,8 +130,7 @@ static __always_inline struct devres *alloc_dr(dr_relea= se_t release, if (!(gfp & __GFP_ZERO)) memset(dr, 0, offsetof(struct devres, data)); =20 - INIT_LIST_HEAD(&dr->node.entry); - dr->node.release =3D release; + devres_node_init(&dr->node, release); return dr; } =20 @@ -561,10 +566,8 @@ void *devres_open_group(struct device *dev, void *id, = gfp_t gfp) if (unlikely(!grp)) return NULL; =20 - grp->node[0].release =3D &group_open_release; - grp->node[1].release =3D &group_close_release; - INIT_LIST_HEAD(&grp->node[0].entry); - INIT_LIST_HEAD(&grp->node[1].entry); + devres_node_init(&grp->node[0], &group_open_release); + devres_node_init(&grp->node[1], &group_close_release); set_node_dbginfo(&grp->node[0], "grp<", 0); set_node_dbginfo(&grp->node[1], "grp>", 0); grp->id =3D grp; --=20 2.52.0 From nobody Mon Feb 9 07:19:21 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E73C35E544; Mon, 2 Feb 2026 23:52:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076349; cv=none; b=FDhIjvdYAARiI9zxVtsCbSfeyhR+G8gmLFdGD7fF3uLip+S1J5OCUD0M0KvJitqLJ4IP51FziGNGmuFgYpK7dAYl3nj9TfoYRhBhMOFDt2tJruxOz9I0kvbtX0rx5GeSQsM7fQ0ebE1qakqI7RqQZyyPeg4YpQnBKeIyFQ/DHJs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076349; c=relaxed/simple; bh=Fxomvmj+N/kLOprt3owdSgn1glSM+8SyIrcusS///KM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lDkjUlfHeSc3/Sj9xxHKWV6VUbjcmUmkLFIxV1Z4W2LFGZmnfpiGZfoeh4q9yAtz9LdIhPkpnUprEp1gP83ubDlgVQjvkGu7rC4yuJUTWIJ/vnyQaWoitfEUb2Y24vg1OuR8I8b7Rhn2JoKzIDnpCd5puRVNWxuw0O+DB3tu+6w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=qR8Xju/R; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="qR8Xju/R" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EB6E3C19421; Mon, 2 Feb 2026 23:52:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770076349; bh=Fxomvmj+N/kLOprt3owdSgn1glSM+8SyIrcusS///KM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qR8Xju/RGTmClw8Pf3o9CH4wf8LbP4rM0toHGZOoxHQyTuN6aL9xs4JTT5p/z5TCr +4Bssi9T5fWb1pO98i3XPy9OlA/muP7Tp6K2zUWI394nMZGFRq43gK7m8JMvG0mJMw HyiMoo9Mha1OeaZA+vOQx3CdcBzTg6ulEMcxFkn8K+K252ACUnNgFLUuOMx6UJtfxy t999H95bxtWAM3u5fTIoYnEDIo06gXERmj+AiaQUt6zIR7DezgBvjG1OOkNDdCigNM vRpMQr71kOievADE4kaAVHWfn1Xw/fmJVVjjvU+hRjs4myFR8prujOfPi/xO46AXqw 7dZpKq3DH5dUQ== From: Danilo Krummrich To: gregkh@linuxfoundation.org, rafael@kernel.org Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, Danilo Krummrich Subject: [PATCH 4/7] devres: don't require ARCH_DMA_MINALIGN for devres actions Date: Tue, 3 Feb 2026 00:48:17 +0100 Message-ID: <20260202235210.55176-5-dakr@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260202235210.55176-1-dakr@kernel.org> References: <20260202235210.55176-1-dakr@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, devres actions are allocated with devres_alloc(), which allocates a struct devres with a flexible array member for the actual data of the resource. The flexible array member is aligned to ARCH_DMA_MINALIGN, which is wasteful for devres actions that only need to store a struct action_devres. Introduce struct devres_action to handle devres actions separately from struct devres, analogous to what we do for struct devres_group. Speaking of which, without this patch struct devres_group is treated as struct devres in release_nodes(). While this is not an actual bug, as release callbacks for devres nodes in struct devres_group are empty functions anyways, it is a bit messy and can be confusing. (Note that besides devres actions, the Rust devres code will also make use of this. The Rust compiler can figure out the correct alignment of T in Devres itself, i.e. no need to force a minimum alignment.) Signed-off-by: Danilo Krummrich --- drivers/base/devres.c | 147 +++++++++++++++++++++++++++++------------- 1 file changed, 102 insertions(+), 45 deletions(-) diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 7cc46aeae792..df015ef155e0 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -16,15 +16,19 @@ #include "base.h" #include "trace.h" =20 +struct devres_node; +typedef void (*dr_node_release_t)(struct device *dev, struct devres_node *= node); + struct devres_node { struct list_head entry; - dr_release_t release; + dr_node_release_t release; const char *name; size_t size; }; =20 struct devres { struct devres_node node; + dr_release_t release; /* * Some archs want to perform DMA into kmalloc caches * and need a guaranteed alignment larger than @@ -42,7 +46,7 @@ struct devres_group { /* -- 8 pointers */ }; =20 -static void devres_node_init(struct devres_node *node, dr_release_t releas= e) +static void devres_node_init(struct devres_node *node, dr_node_release_t r= elease) { INIT_LIST_HEAD(&node->entry); node->release =3D release; @@ -81,12 +85,12 @@ static void devres_log(struct device *dev, struct devre= s_node *node, * Release functions for devres group. These callbacks are used only * for identification. */ -static void group_open_release(struct device *dev, void *res) +static void group_open_release(struct device *dev, struct devres_node *nod= e) { /* noop */ } =20 -static void group_close_release(struct device *dev, void *res) +static void group_close_release(struct device *dev, struct devres_node *no= de) { /* noop */ } @@ -113,6 +117,13 @@ static bool check_dr_size(size_t size, size_t *tot_siz= e) return true; } =20 +static void dr_node_release(struct device *dev, struct devres_node *node) +{ + struct devres *dr =3D container_of(node, struct devres, node); + + dr->release(dev, dr->data); +} + static __always_inline struct devres *alloc_dr(dr_release_t release, size_t size, gfp_t gfp, int nid) { @@ -130,7 +141,8 @@ static __always_inline struct devres *alloc_dr(dr_relea= se_t release, if (!(gfp & __GFP_ZERO)) memset(dr, 0, offsetof(struct devres, data)); =20 - devres_node_init(&dr->node, release); + devres_node_init(&dr->node, dr_node_release); + dr->release =3D release; return dr; } =20 @@ -209,7 +221,7 @@ void devres_for_each_res(struct device *dev, dr_release= _t release, &dev->devres_head, entry) { struct devres *dr =3D container_of(node, struct devres, node); =20 - if (node->release !=3D release) + if (dr->release !=3D release) continue; if (match && !match(dev, dr->data, match_data)) continue; @@ -268,7 +280,7 @@ static struct devres *find_dr(struct device *dev, dr_re= lease_t release, list_for_each_entry_reverse(node, &dev->devres_head, entry) { struct devres *dr =3D container_of(node, struct devres, node); =20 - if (node->release !=3D release) + if (dr->release !=3D release) continue; if (match && !match(dev, dr->data, match_data)) continue; @@ -330,7 +342,7 @@ void *devres_get(struct device *dev, void *new_res, unsigned long flags; =20 spin_lock_irqsave(&dev->devres_lock, flags); - dr =3D find_dr(dev, new_dr->node.release, match, match_data); + dr =3D find_dr(dev, new_dr->release, match, match_data); if (!dr) { add_dr(dev, &new_dr->node); dr =3D new_dr; @@ -504,15 +516,15 @@ static int remove_nodes(struct device *dev, =20 static void release_nodes(struct device *dev, struct list_head *todo) { - struct devres *dr, *tmp; + struct devres_node *node, *tmp; =20 - /* Release. Note that both devres and devres_group are - * handled as devres in the following loop. This is safe. + /* Release. Note that devres, devres_action and devres_group are + * handled as devres_node in the following loop. This is safe. */ - list_for_each_entry_safe_reverse(dr, tmp, todo, node.entry) { - devres_log(dev, &dr->node, "REL"); - dr->node.release(dev, dr->data); - kfree(dr); + list_for_each_entry_safe_reverse(node, tmp, todo, entry) { + devres_log(dev, node, "REL"); + node->release(dev, node); + kfree(node); } } =20 @@ -720,20 +732,22 @@ struct action_devres { void (*action)(void *); }; =20 -static int devm_action_match(struct device *dev, void *res, void *p) -{ - struct action_devres *devres =3D res; - struct action_devres *target =3D p; +struct devres_action { + struct devres_node node; + struct action_devres action; +}; =20 - return devres->action =3D=3D target->action && - devres->data =3D=3D target->data; +static int devm_action_match(struct devres_action *devres, struct action_d= evres *target) +{ + return devres->action.action =3D=3D target->action && + devres->action.data =3D=3D target->data; } =20 -static void devm_action_release(struct device *dev, void *res) +static void devm_action_release(struct device *dev, struct devres_node *no= de) { - struct action_devres *devres =3D res; + struct devres_action *devres =3D container_of(node, struct devres_action,= node); =20 - devres->action(devres->data); + devres->action.action(devres->action.data); } =20 /** @@ -748,32 +762,71 @@ static void devm_action_release(struct device *dev, v= oid *res) */ int __devm_add_action(struct device *dev, void (*action)(void *), void *da= ta, const char *name) { - struct action_devres *devres; + struct devres_action *devres; =20 - devres =3D __devres_alloc_node(devm_action_release, sizeof(struct action_= devres), - GFP_KERNEL, NUMA_NO_NODE, name); + devres =3D kzalloc(sizeof(*devres), GFP_KERNEL); if (!devres) return -ENOMEM; =20 - devres->data =3D data; - devres->action =3D action; + devres_node_init(&devres->node, devm_action_release); + set_node_dbginfo(&devres->node, name, sizeof(*devres)); =20 - devres_add(dev, devres); + devres->action.data =3D data; + devres->action.action =3D action; + + devres_node_add(dev, &devres->node); return 0; } EXPORT_SYMBOL_GPL(__devm_add_action); =20 -bool devm_is_action_added(struct device *dev, void (*action)(void *), void= *data) +static struct devres_action *devres_action_find(struct device *dev, + void (*action)(void *), + void *data) { - struct action_devres devres =3D { + struct devres_node *node; + struct action_devres target =3D { .data =3D data, .action =3D action, }; =20 - return devres_find(dev, devm_action_release, devm_action_match, &devres); + list_for_each_entry_reverse(node, &dev->devres_head, entry) { + struct devres_action *dr =3D container_of(node, struct devres_action, no= de); + + if (node->release !=3D devm_action_release) + continue; + if (devm_action_match(dr, &target)) + return dr; + } + + return NULL; +} + +bool devm_is_action_added(struct device *dev, void (*action)(void *), void= *data) +{ + guard(spinlock_irqsave)(&dev->devres_lock); + + return !!devres_action_find(dev, action, data); } EXPORT_SYMBOL_GPL(devm_is_action_added); =20 +static struct devres_action *remove_action(struct device *dev, + void (*action)(void *), + void *data) +{ + struct devres_action *dr; + + guard(spinlock_irqsave)(&dev->devres_lock); + + dr =3D devres_action_find(dev, action, data); + if (!dr) + return ERR_PTR(-ENOENT); + + list_del_init(&dr->node.entry); + devres_log(dev, &dr->node, "REM"); + + return dr; +} + /** * devm_remove_action_nowarn() - removes previously added custom action * @dev: Device that owns the action @@ -798,13 +851,15 @@ int devm_remove_action_nowarn(struct device *dev, void (*action)(void *), void *data) { - struct action_devres devres =3D { - .data =3D data, - .action =3D action, - }; + struct devres_action *dr; + + dr =3D remove_action(dev, action, data); + if (IS_ERR(dr)) + return PTR_ERR(dr); =20 - return devres_destroy(dev, devm_action_release, devm_action_match, - &devres); + kfree(dr); + + return 0; } EXPORT_SYMBOL_GPL(devm_remove_action_nowarn); =20 @@ -820,14 +875,16 @@ EXPORT_SYMBOL_GPL(devm_remove_action_nowarn); */ void devm_release_action(struct device *dev, void (*action)(void *), void = *data) { - struct action_devres devres =3D { - .data =3D data, - .action =3D action, - }; =20 - WARN_ON(devres_release(dev, devm_action_release, devm_action_match, - &devres)); + struct devres_action *dr; + + dr =3D remove_action(dev, action, data); + if (WARN_ON(IS_ERR(dr))) + return; + + dr->action.action(dr->action.data); =20 + kfree(dr); } EXPORT_SYMBOL_GPL(devm_release_action); =20 --=20 2.52.0 From nobody Mon Feb 9 07:19:21 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 60DF8361DB1; Mon, 2 Feb 2026 23:52:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076351; cv=none; b=qxmH/MkBULL1/NLLYtenMX75nzSF9uPj1upMQwHYdDmYkrSy/zkWuSN16PTy28zgSS7lB96LXcEsKmFE0d64yXnRndXhkQ+UHUGhH4qcThSyjjTYJw8r0BdlnTUpDyl220Ia4tKBFJtV0jMbKde/ZTCWb0JSL8ZSgbPvlSbw39M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076351; c=relaxed/simple; bh=lMGf0GNzmrgT+ma56cUd7lv7R6Miwyn/31/UTBxrMu0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nKsl3niOkOAKE9Di0YOM1TJ9ZqqhlPoZxqhnCaZ5BLJLGyJ7Buau5DB6PEL8uY8cZfMitXeXFYJ0i1qoJIlQDxx9Q30dMP2BWf5IyfYQ1GnCpMumI+kUsw8J5N2Ba/UtQXrUlHx0rjj/M/xv/T7AvUtbemJKI3Hqp4D2FVAEYso= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=n7jT/EJg; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="n7jT/EJg" Received: by smtp.kernel.org (Postfix) with ESMTPSA id AACEAC19421; Mon, 2 Feb 2026 23:52:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770076350; bh=lMGf0GNzmrgT+ma56cUd7lv7R6Miwyn/31/UTBxrMu0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n7jT/EJgFLnJIzI67HwPf6ca/bVg2pabJYIypB5zrT+S2vwer8Tk1I9loESJGCxyG RwxIZC++aRU/t19eL2DgdGYLzWPNLYGe4rwj4vtywqWqOjbWT+my8dVsu3njGgToQU 0pn8nK3GLC5yh4qE+uynQEVTSUOp5ogYgxFMKok5M5wMaI9Q5qK6oYN6v4/B44us/I A9Hr54jq5NalFH+Z/8yu76dWkZKd7ONlye3h5NpwUCqHKyP+48701xaC9pjTgvGMrl MCmYzqt8PodGYLk9ujRwqx54O8w/aeg0OM/o7L27V32T+AdgifO7cPXtXi8nkhChnW Sl02PGKKJVHzg== From: Danilo Krummrich To: gregkh@linuxfoundation.org, rafael@kernel.org Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, Danilo Krummrich Subject: [PATCH 5/7] devres: add free_node callback to struct devres_node Date: Tue, 3 Feb 2026 00:48:18 +0100 Message-ID: <20260202235210.55176-6-dakr@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260202235210.55176-1-dakr@kernel.org> References: <20260202235210.55176-1-dakr@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, there are three "subclasses" of struct devres_node, which are struct devres, struct devres_group, struct devres_action. release_nodes(), which only knows about the base struct devres_node, assumes that for all "subclasses" struct devres_node is the first member in the structure and calls kfree() on struct devres_node. While this technically works, we can still improve semantical correctness and type safety with a corresponding free_node() callback. Additionally, we will need this callback soon in the Rust Devres code, to allocate and free the required memory on the Rust side. Signed-off-by: Danilo Krummrich --- drivers/base/devres.c | 57 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/drivers/base/devres.c b/drivers/base/devres.c index df015ef155e0..2006fe411b49 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -18,10 +18,12 @@ =20 struct devres_node; typedef void (*dr_node_release_t)(struct device *dev, struct devres_node *= node); +typedef void (*dr_node_free_t)(struct devres_node *node); =20 struct devres_node { struct list_head entry; dr_node_release_t release; + dr_node_free_t free_node; const char *name; size_t size; }; @@ -46,10 +48,18 @@ struct devres_group { /* -- 8 pointers */ }; =20 -static void devres_node_init(struct devres_node *node, dr_node_release_t r= elease) +static void devres_node_init(struct devres_node *node, + dr_node_release_t release, + dr_node_free_t free_node) { INIT_LIST_HEAD(&node->entry); node->release =3D release; + node->free_node =3D free_node; +} + +static inline void free_node(struct devres_node *node) +{ + node->free_node(node); } =20 static void set_node_dbginfo(struct devres_node *node, const char *name, @@ -124,6 +134,13 @@ static void dr_node_release(struct device *dev, struct= devres_node *node) dr->release(dev, dr->data); } =20 +static void dr_node_free(struct devres_node *node) +{ + struct devres *dr =3D container_of(node, struct devres, node); + + kfree(dr); +} + static __always_inline struct devres *alloc_dr(dr_release_t release, size_t size, gfp_t gfp, int nid) { @@ -141,7 +158,7 @@ static __always_inline struct devres *alloc_dr(dr_relea= se_t release, if (!(gfp & __GFP_ZERO)) memset(dr, 0, offsetof(struct devres, data)); =20 - devres_node_init(&dr->node, dr_node_release); + devres_node_init(&dr->node, dr_node_release, dr_node_free); dr->release =3D release; return dr; } @@ -231,6 +248,11 @@ void devres_for_each_res(struct device *dev, dr_releas= e_t release, } EXPORT_SYMBOL_GPL(devres_for_each_res); =20 +static inline void free_dr(struct devres *dr) +{ + free_node(&dr->node); +} + /** * devres_free - Free device resource data * @res: Pointer to devres data to free @@ -243,7 +265,7 @@ void devres_free(void *res) struct devres *dr =3D container_of(res, struct devres, data); =20 BUG_ON(!list_empty(&dr->node.entry)); - kfree(dr); + free_dr(dr); } } EXPORT_SYMBOL_GPL(devres_free); @@ -518,13 +540,10 @@ static void release_nodes(struct device *dev, struct = list_head *todo) { struct devres_node *node, *tmp; =20 - /* Release. Note that devres, devres_action and devres_group are - * handled as devres_node in the following loop. This is safe. - */ list_for_each_entry_safe_reverse(node, tmp, todo, entry) { devres_log(dev, node, "REL"); node->release(dev, node); - kfree(node); + free_node(node); } } =20 @@ -557,6 +576,13 @@ int devres_release_all(struct device *dev) return cnt; } =20 +static void devres_group_free(struct devres_node *node) +{ + struct devres_group *grp =3D container_of(node, struct devres_group, node= [0]); + + kfree(grp); +} + /** * devres_open_group - Open a new devres group * @dev: Device to open devres group for @@ -578,8 +604,8 @@ void *devres_open_group(struct device *dev, void *id, g= fp_t gfp) if (unlikely(!grp)) return NULL; =20 - devres_node_init(&grp->node[0], &group_open_release); - devres_node_init(&grp->node[1], &group_close_release); + devres_node_init(&grp->node[0], &group_open_release, devres_group_free); + devres_node_init(&grp->node[1], &group_close_release, NULL); set_node_dbginfo(&grp->node[0], "grp<", 0); set_node_dbginfo(&grp->node[1], "grp>", 0); grp->id =3D grp; @@ -750,6 +776,13 @@ static void devm_action_release(struct device *dev, st= ruct devres_node *node) devres->action.action(devres->action.data); } =20 +static void devm_action_free(struct devres_node *node) +{ + struct devres_action *action =3D container_of(node, struct devres_action,= node); + + kfree(action); +} + /** * __devm_add_action() - add a custom action to list of managed resources * @dev: Device that owns the action @@ -768,7 +801,7 @@ int __devm_add_action(struct device *dev, void (*action= )(void *), void *data, co if (!devres) return -ENOMEM; =20 - devres_node_init(&devres->node, devm_action_release); + devres_node_init(&devres->node, devm_action_release, devm_action_free); set_node_dbginfo(&devres->node, name, sizeof(*devres)); =20 devres->action.data =3D data; @@ -1012,7 +1045,7 @@ void *devm_krealloc(struct device *dev, void *ptr, si= ze_t new_size, gfp_t gfp) old_dr =3D find_dr(dev, devm_kmalloc_release, devm_kmalloc_match, ptr); if (!old_dr) { spin_unlock_irqrestore(&dev->devres_lock, flags); - kfree(new_dr); + free_dr(new_dr); WARN(1, "Memory chunk not managed or managed by a different device."); return NULL; } @@ -1032,7 +1065,7 @@ void *devm_krealloc(struct device *dev, void *ptr, si= ze_t new_size, gfp_t gfp) * list. This is also the reason why we must not use devm_kfree() - the * links are no longer valid. */ - kfree(old_dr); + free_dr(old_dr); =20 return new_dr->data; } --=20 2.52.0 From nobody Mon Feb 9 07:19:21 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C9EDA389E18; Mon, 2 Feb 2026 23:52:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076354; cv=none; b=f3dF6vuBEpOrUP/G7mES3J7SJQhuGgIMD4TePj/AOrDuIKZ2qagQL/HaAS9dV3j8UtDvMIass0qEPMztpPdCQr6tmBZx+7iCoEzn56gCBmMpkIqLXJ0ussGZw45kh7pFE4vFouiDZAPyUp51fngC8IxbEVGUGtIgT4oZW2vWKZo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076354; c=relaxed/simple; bh=3DzsxhwxxqvpiWXDrCXOlzBaztYaNn12ahMZeYHKzFA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sC7a/HBpsSjyTYK1qm7KHOEGcIcHVf57cJyFH+z9ZFamyFzHt2FINACCxpNcFJMzDSStWeXhx4uuxj/m/Eq6aDvLnp1YoqW0ttzLMw7IssTmGKT9dbgLLWem7UBE6tKeeOqscCKa23V8P3mvzQLiFPjCwdSQsvcnjizMbO/GRJg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mFUT8Kai; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mFUT8Kai" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6C1A8C4AF09; Mon, 2 Feb 2026 23:52:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770076352; bh=3DzsxhwxxqvpiWXDrCXOlzBaztYaNn12ahMZeYHKzFA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mFUT8Kai53Dm2Sre98suEuAD7Of84x3eKNf3aotScnKW6JihNrUEnwe7LjbrLTclj dMcAIPBfGMkpax5HmK5AcSbSOr1QuBnendeLuSNIeT8B0yrdzJSufIkS8ttj1qEwVp O/oXRkDnv601Gu1+xqyGbRI1nVmC2f5wtWiv4lyF8eeZisYHWaGdUQ/CxEyjiE2YqQ zTr2hRVx/AU/oyG0XGWsragOLJ/NsvOnUs/nCy5quYaroZCZ55ooRfKHiDrUn3hzhr 7rSV3MfcsJQ/8LfUe5CmAd0/ya3pewuy3Cg4cwpE+9Vbm6YRLDsJEk3J8KmwgAdplN rDTrW3pHfiwgg== From: Danilo Krummrich To: gregkh@linuxfoundation.org, rafael@kernel.org Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, Danilo Krummrich Subject: [PATCH 6/7] devres: use guard(spinlock_irqsave) where applicable Date: Tue, 3 Feb 2026 00:48:19 +0100 Message-ID: <20260202235210.55176-7-dakr@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260202235210.55176-1-dakr@kernel.org> References: <20260202235210.55176-1-dakr@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Use guard(spinlock_irqsave)(&dev->devres_lock) where it improves the code. Some places still use manual spin_lock_irqsave() and spin_unlock() as changing it to use a scoped_guard() would result in unnecessary churn. Signed-off-by: Danilo Krummrich --- drivers/base/devres.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 2006fe411b49..58e2f82a30f6 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -228,12 +228,11 @@ void devres_for_each_res(struct device *dev, dr_relea= se_t release, { struct devres_node *node; struct devres_node *tmp; - unsigned long flags; =20 if (!fn) return; =20 - spin_lock_irqsave(&dev->devres_lock, flags); + guard(spinlock_irqsave)(&dev->devres_lock); list_for_each_entry_safe_reverse(node, tmp, &dev->devres_head, entry) { struct devres *dr =3D container_of(node, struct devres, node); @@ -244,7 +243,6 @@ void devres_for_each_res(struct device *dev, dr_release= _t release, continue; fn(dev, dr->data, data); } - spin_unlock_irqrestore(&dev->devres_lock, flags); } EXPORT_SYMBOL_GPL(devres_for_each_res); =20 @@ -330,14 +328,12 @@ void *devres_find(struct device *dev, dr_release_t re= lease, dr_match_t match, void *match_data) { struct devres *dr; - unsigned long flags; =20 - spin_lock_irqsave(&dev->devres_lock, flags); + guard(spinlock_irqsave)(&dev->devres_lock); dr =3D find_dr(dev, release, match, match_data); - spin_unlock_irqrestore(&dev->devres_lock, flags); - if (dr) return dr->data; + return NULL; } EXPORT_SYMBOL_GPL(devres_find); @@ -396,18 +392,15 @@ void *devres_remove(struct device *dev, dr_release_t = release, dr_match_t match, void *match_data) { struct devres *dr; - unsigned long flags; =20 - spin_lock_irqsave(&dev->devres_lock, flags); + guard(spinlock_irqsave)(&dev->devres_lock); dr =3D find_dr(dev, release, match, match_data); if (dr) { list_del_init(&dr->node.entry); devres_log(dev, &dr->node, "REM"); + return dr->data; } - spin_unlock_irqrestore(&dev->devres_lock, flags); =20 - if (dr) - return dr->data; return NULL; } EXPORT_SYMBOL_GPL(devres_remove); @@ -655,17 +648,13 @@ static struct devres_group *find_group(struct device = *dev, void *id) void devres_close_group(struct device *dev, void *id) { struct devres_group *grp; - unsigned long flags; - - spin_lock_irqsave(&dev->devres_lock, flags); =20 + guard(spinlock_irqsave)(&dev->devres_lock); grp =3D find_group(dev, id); if (grp) add_dr(dev, &grp->node[1]); else WARN_ON(1); - - spin_unlock_irqrestore(&dev->devres_lock, flags); } EXPORT_SYMBOL_GPL(devres_close_group); =20 --=20 2.52.0 From nobody Mon Feb 9 07:19:21 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8E30E36214A; Mon, 2 Feb 2026 23:52:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076354; cv=none; b=TobOBVqcsjUCPIpbuTIgROkRI2kQFE1McF9Q3IQha7EfrEEAPxxYeYhlq+IZymkK/gjPnUuXaJJZA7iT05inhaMa6Hu/ZCr+JQnoPEDSVL6GY2Bll3NHKefjzEySKo2PZEpq0F5wbChpu+ohLgXiUEqTNwJCX/bd2dGnb0LVsK8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770076354; c=relaxed/simple; bh=i26uVIvYQxloE6fGrmb+wYZqzx176RUsJfLep0tnBkE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UKji/BerR9gQUe+yWkOpgOL7M8ptRaEzGkei9xKQTQYVpW6OGeQplYWgBZDJFanGBS2S+R0kk4FuMp3u8u8U509RHYttlLvuhpCYu1IpQYmsQIOmly4sGlTsGsWOuWn2UhtfOaZWkozOJlj6CQLHKr9RZUVI1fcf58GRnAvbRKk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=LtiOS0F3; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="LtiOS0F3" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 31650C19421; Mon, 2 Feb 2026 23:52:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770076354; bh=i26uVIvYQxloE6fGrmb+wYZqzx176RUsJfLep0tnBkE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LtiOS0F3p/eOS6ysZY5OU99c/CS4WYkjMwuSNil0r/NF191JG2ocsX7OkmmvrAb9j A9VhMZ/k3gQ0iNNp6H604aXIC36WnBNSnRelyv1qzy7INeDyprndKa2srfPe1MXl47 hx7OKa7IY9JYWK+LNMv9ZnVXRWPwmrvROMdvPZeJJXZXh+M0CHf9U770tv4Y2ZoPnK A6/GCJcRWwjmlnjwSVJw2hDBC1gDO9eSLeRogUo5NcZIiRxHoBjAcw6NPVYTAH7Xa4 PchBqfoYkUCmKLhtu3uHeaHay1UJOIruk9xpQtFTnkxo7l+PiOYTnbSfTrBy74bDcl un889UYdI4K7w== From: Danilo Krummrich To: gregkh@linuxfoundation.org, rafael@kernel.org Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, Danilo Krummrich Subject: [PATCH 7/7] devres: remove unnecessary unlocks in devres_release_group() Date: Tue, 3 Feb 2026 00:48:20 +0100 Message-ID: <20260202235210.55176-8-dakr@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260202235210.55176-1-dakr@kernel.org> References: <20260202235210.55176-1-dakr@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" There is no need to call spin_unlock_irqrestore() in every conditional block, as release_nodes() can safely be called with an empty list, in case we hit the "if else" or "else" case. We do not use a scoped_guard() here to not unnecessarily change the indentation level. Signed-off-by: Danilo Krummrich --- drivers/base/devres.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/base/devres.c b/drivers/base/devres.c index 58e2f82a30f6..0fca73b56168 100644 --- a/drivers/base/devres.c +++ b/drivers/base/devres.c @@ -708,7 +708,6 @@ int devres_release_group(struct device *dev, void *id) int cnt =3D 0; =20 spin_lock_irqsave(&dev->devres_lock, flags); - grp =3D find_group(dev, id); if (grp) { struct list_head *first =3D &grp->node[0].entry; @@ -718,20 +717,18 @@ int devres_release_group(struct device *dev, void *id) end =3D grp->node[1].entry.next; =20 cnt =3D remove_nodes(dev, first, end, &todo); - spin_unlock_irqrestore(&dev->devres_lock, flags); - - release_nodes(dev, &todo); } else if (list_empty(&dev->devres_head)) { /* * dev is probably dying via devres_release_all(): groups * have already been removed and are on the process of * being released - don't touch and don't warn. */ - spin_unlock_irqrestore(&dev->devres_lock, flags); } else { WARN_ON(1); - spin_unlock_irqrestore(&dev->devres_lock, flags); } + spin_unlock_irqrestore(&dev->devres_lock, flags); + + release_nodes(dev, &todo); =20 return cnt; } --=20 2.52.0