From nobody Thu Dec 18 19:04:09 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 032F9C6FA8F for ; Wed, 30 Aug 2023 18:45:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236172AbjH3Sbh (ORCPT ); Wed, 30 Aug 2023 14:31:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52112 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343950AbjH3Rff (ORCPT ); Wed, 30 Aug 2023 13:35:35 -0400 Received: from rere.qmqm.pl (rere.qmqm.pl [91.227.64.183]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DE91F198 for ; Wed, 30 Aug 2023 10:35:32 -0700 (PDT) Received: from remote.user (localhost [127.0.0.1]) by rere.qmqm.pl (Postfix) with ESMTPSA id 4RbWfC14KfzMG; Wed, 30 Aug 2023 19:35:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=rere.qmqm.pl; s=1; t=1693416931; bh=PnYjkE6gtqAOfIRwVhLGjxruQguXRdfkE9L0v73w0Nk=; h=Date:In-Reply-To:References:Subject:From:To:Cc:From; b=GgzllHXWm363dOzSs4WrNZTcC8K6hBGPjynUno9kvKFwdaJkSvzJLTsap7Q+RAafv xyzsp7mkfmBZjcgjd3pOaIcyggzv4MzhDAzcn3Z1CAlF/bMjGn6m4KQSngoODsx0oD H1pCOOwPLcvv4d+h4m0/hcK2Tb0qQmlvODeHpYqngaOgt2oioFWMqbPxsUiHenOxcd sh/T9grNhX4EqAiAecBpppb6r0MU96bIfSuApO8v42IBq1WLoIB/GqCe1dOWl/hSZJ OtKFU18gYLreBuZB8OhrjrJfvqilC5fYab3aRSMKB1s1Ya7PagSI+rLnWiN/Mcihi9 jOQhcQXqnJbnQ== X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at mail Date: Wed, 30 Aug 2023 19:35:30 +0200 Message-Id: <121c27939458ca3c1424b38fd6cee2d81cef831e.1693416477.git.mirq-linux@rere.qmqm.pl> In-Reply-To: References: Subject: [PATCH v2 1/7] regulator/core: regulator_lock_nested: remove `lock` MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= To: Liam Girdwood , Mark Brown Cc: linux-kernel@vger.kernel.org, Douglas Anderson , Stephen Boyd Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org `lock` is only false when the `rdev` is already locked and the owner is `current`. In this case `ret` is always zero. By removing `lock`, we thus remove `mutex_owner` write avoidance, but make the code flow more understandable. Reviewed-by: Douglas Anderson Signed-off-by: Micha=C5=82 Miros=C5=82aw --- drivers/regulator/core.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index d8e1caaf207e..215b721e5cd4 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -141,27 +141,19 @@ static bool regulator_ops_is_valid(struct regulator_d= ev *rdev, int ops) static inline int regulator_lock_nested(struct regulator_dev *rdev, struct ww_acquire_ctx *ww_ctx) { - bool lock =3D false; int ret =3D 0; =20 mutex_lock(®ulator_nesting_mutex); =20 if (!ww_mutex_trylock(&rdev->mutex, ww_ctx)) { - if (rdev->mutex_owner =3D=3D current) - rdev->ref_cnt++; - else - lock =3D true; - - if (lock) { + if (rdev->mutex_owner !=3D current) { mutex_unlock(®ulator_nesting_mutex); ret =3D ww_mutex_lock(&rdev->mutex, ww_ctx); mutex_lock(®ulator_nesting_mutex); } - } else { - lock =3D true; } =20 - if (lock && ret !=3D -EDEADLK) { + if (ret !=3D -EDEADLK) { rdev->ref_cnt++; rdev->mutex_owner =3D current; } --=20 2.39.2 From nobody Thu Dec 18 19:04:09 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1B2F8C83F19 for ; Wed, 30 Aug 2023 18:44:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238850AbjH3SjS (ORCPT ); Wed, 30 Aug 2023 14:39:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52118 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343951AbjH3Rfg (ORCPT ); Wed, 30 Aug 2023 13:35:36 -0400 Received: from rere.qmqm.pl (rere.qmqm.pl [91.227.64.183]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6CE4C193 for ; Wed, 30 Aug 2023 10:35:33 -0700 (PDT) Received: from remote.user (localhost [127.0.0.1]) by rere.qmqm.pl (Postfix) with ESMTPSA id 4RbWfC4LTSzTw; Wed, 30 Aug 2023 19:35:31 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=rere.qmqm.pl; s=1; t=1693416931; bh=hSMQQTeSudZxbDfDsrdeeJ4mA/Mwq7wjXr2m2bQXnP8=; h=Date:In-Reply-To:References:Subject:From:To:Cc:From; b=O6r6i1v+gf7ZVgP9xLvTqNPD7Wia6WA7XFHqAgNdFq+Z1JsmxbUhtMPF1vW+2q9nc 3X8f5nrCq9PdEwADcLxP9kWVFpIcWylHLaQjgfzdug9lh2caDSF3MRuMDUIbK3z3kC dc15kKk1X/01vauF78ELCaixZFfYrsw14i9fJTGYgT5QEZVU77w0mZIiOZWLFE0Tg/ 0qwPjEzS2GDsrNA1FTwJoxI4ZbkGj/1Xs8e4RUqSRjrDNWekA5o96Vr0RFx+eg0HQl nVH0rSQ9qvG+/3/qBqE0gxmt3UHpzXc8KkaRRe1ZpmlUlyW7jq8r7EuqieYB//iSF6 VVoXRLaIril+A== X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at mail Date: Wed, 30 Aug 2023 19:35:31 +0200 Message-Id: In-Reply-To: References: Subject: [PATCH v2 2/7] regulator/core: regulator_lock_nested: skip extra lock for -EDEADLK MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= To: Liam Girdwood , Mark Brown Cc: Douglas Anderson , linux-kernel@vger.kernel.org, Stephen Boyd Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When ww_mutex_lock() returns -EDEADLK the nesting mutex-protected section becomes a no-op. Return early and avoid the extra lock. Reviewed-by: Douglas Anderson Signed-off-by: Micha=C5=82 Miros=C5=82aw --- drivers/regulator/core.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 215b721e5cd4..921c7039baa3 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -145,18 +145,17 @@ static inline int regulator_lock_nested(struct regula= tor_dev *rdev, =20 mutex_lock(®ulator_nesting_mutex); =20 - if (!ww_mutex_trylock(&rdev->mutex, ww_ctx)) { - if (rdev->mutex_owner !=3D current) { - mutex_unlock(®ulator_nesting_mutex); - ret =3D ww_mutex_lock(&rdev->mutex, ww_ctx); - mutex_lock(®ulator_nesting_mutex); - } + if (!ww_mutex_trylock(&rdev->mutex, ww_ctx) && + rdev->mutex_owner !=3D current) { + mutex_unlock(®ulator_nesting_mutex); + ret =3D ww_mutex_lock(&rdev->mutex, ww_ctx); + if (ret =3D=3D -EDEADLK) + return ret; + mutex_lock(®ulator_nesting_mutex); } =20 - if (ret !=3D -EDEADLK) { - rdev->ref_cnt++; - rdev->mutex_owner =3D current; - } + rdev->ref_cnt++; + rdev->mutex_owner =3D current; =20 mutex_unlock(®ulator_nesting_mutex); =20 --=20 2.39.2 From nobody Thu Dec 18 19:04:09 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9F58AC83F01 for ; Wed, 30 Aug 2023 18:53:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243616AbjH3StK (ORCPT ); Wed, 30 Aug 2023 14:49:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52128 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343952AbjH3Rfg (ORCPT ); Wed, 30 Aug 2023 13:35:36 -0400 Received: from rere.qmqm.pl (rere.qmqm.pl [91.227.64.183]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A3AEE1A2 for ; Wed, 30 Aug 2023 10:35:33 -0700 (PDT) Received: from remote.user (localhost [127.0.0.1]) by rere.qmqm.pl (Postfix) with ESMTPSA id 4RbWfD1bCTzVr; Wed, 30 Aug 2023 19:35:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=rere.qmqm.pl; s=1; t=1693416932; bh=d/uWZtIzyiyl8negxdWeJKWCN/bjWfnYvB5RCFJNH3Q=; h=Date:In-Reply-To:References:Subject:From:To:Cc:From; b=JTFHfML1EUtRxjdnL38X/yCPC/OfDVdKOiz7ON0u3Fdeu8GBs563VHAafNI1CYCLP CBUCp5neaGYtus2Wgf7mOmxWUoZyXJfNBB5C8nvTV4/LJmNGx5XQrZr3onS93a8Ccq NrHMCiPpp6/I7FzVu1cXkftiiS8Wcehr9RGSZfQvhi+UfykuXlNc4t7HvKxBj8qLJR 2ZjEV6ra98CTCJoPlreIonp/rB1sNYlRhbTzDqMcfW2fiL6/kjxkd0ruHkPx5nOLoK vJCf7F2XxjfTpB+sJUugvWKJuzSfXBKX0nKkgH+q/55NLdH4+6sFfoUmx/N8eyeZ1A TLgy4/T8guf8g== X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at mail Date: Wed, 30 Aug 2023 19:35:31 +0200 Message-Id: <56ae0bf828d942c92ca867afb3aae95fcabd5498.1693416477.git.mirq-linux@rere.qmqm.pl> In-Reply-To: References: Subject: [PATCH v2 3/7] regulator/core: regulator_lock_nested: simplify nested locking MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= To: Liam Girdwood , Mark Brown Cc: Douglas Anderson , linux-kernel@vger.kernel.org, Stephen Boyd Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Simplify regulator locking by removing locking around locking. rdev->ref check when unlocking is moved inside the critical section. This patch depends on commit 12235da8c80a ("kernel/locking: Add context to ww_mutex_trylock()"). Note: return -EALREADY is removed as no caller depends on it and in that case the lock count is incremented anyway. Reviewed-by: Douglas Anderson Signed-off-by: Micha=C5=82 Miros=C5=82aw --- drivers/regulator/core.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 921c7039baa3..f18e7cb88a0d 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -34,7 +34,6 @@ #include "internal.h" =20 static DEFINE_WW_CLASS(regulator_ww_class); -static DEFINE_MUTEX(regulator_nesting_mutex); static DEFINE_MUTEX(regulator_list_mutex); static LIST_HEAD(regulator_map_list); static LIST_HEAD(regulator_ena_gpio_list); @@ -141,25 +140,18 @@ static bool regulator_ops_is_valid(struct regulator_d= ev *rdev, int ops) static inline int regulator_lock_nested(struct regulator_dev *rdev, struct ww_acquire_ctx *ww_ctx) { - int ret =3D 0; - - mutex_lock(®ulator_nesting_mutex); - if (!ww_mutex_trylock(&rdev->mutex, ww_ctx) && - rdev->mutex_owner !=3D current) { - mutex_unlock(®ulator_nesting_mutex); - ret =3D ww_mutex_lock(&rdev->mutex, ww_ctx); + READ_ONCE(rdev->mutex_owner) !=3D current) { + int ret =3D ww_mutex_lock(&rdev->mutex, ww_ctx); + if (ret =3D=3D -EDEADLK) return ret; - mutex_lock(®ulator_nesting_mutex); } =20 rdev->ref_cnt++; rdev->mutex_owner =3D current; =20 - mutex_unlock(®ulator_nesting_mutex); - - return ret; + return 0; } =20 /** @@ -186,16 +178,13 @@ static void regulator_lock(struct regulator_dev *rdev) */ static void regulator_unlock(struct regulator_dev *rdev) { - mutex_lock(®ulator_nesting_mutex); + if (WARN_ON_ONCE(rdev->ref_cnt <=3D 0)) + return; =20 if (--rdev->ref_cnt =3D=3D 0) { rdev->mutex_owner =3D NULL; ww_mutex_unlock(&rdev->mutex); } - - WARN_ON_ONCE(rdev->ref_cnt < 0); - - mutex_unlock(®ulator_nesting_mutex); } =20 /** --=20 2.39.2 From nobody Thu Dec 18 19:04:09 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A972C83F1D for ; Wed, 30 Aug 2023 19:29:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238871AbjH3T3u (ORCPT ); Wed, 30 Aug 2023 15:29:50 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343953AbjH3Rfh (ORCPT ); Wed, 30 Aug 2023 13:35:37 -0400 Received: from rere.qmqm.pl (rere.qmqm.pl [91.227.64.183]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8F5C0198 for ; Wed, 30 Aug 2023 10:35:34 -0700 (PDT) Received: from remote.user (localhost [127.0.0.1]) by rere.qmqm.pl (Postfix) with ESMTPSA id 4RbWfD3b6wzbv; Wed, 30 Aug 2023 19:35:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=rere.qmqm.pl; s=1; t=1693416932; bh=yfYWTZy4+QsJQZykgw/CudOAdR0bu9dW9lR7LaZnKiU=; h=Date:In-Reply-To:References:Subject:From:To:Cc:From; b=O6tvKnQHLzY4qcOxpg/QGuQ2ZJgasEn9jm2SSOWLR7p+w0oBFGJeVVvARTa/Efq5v YjU9Del7ANkyMGhmpBrKB5ChoVY3pR7gETGOFwP+uqDP0lJQE/Hwh9r4zfXqPnhQ7B CdmGXoGkOIHdk36acJW6hxAU9UBJ3TJ1OO0P1u7VwHcq3+gxpVG2KPSXwg6aGz3Xd1 1gX8Nh9zmZQOddCBKJRjVP3E+zLyQ9feMsR6WXn+5AhWMgWCa+DAhxxxlG5AXzZ6aX djtuJNjBUxV6Xb8FbE7hEIHm1HE47UNj2BViKjhqCJcZnVe2n+Cn0PVul6UBt/7QFH ltE6hFO8wZJNw== X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at mail Date: Wed, 30 Aug 2023 19:35:32 +0200 Message-Id: <3708ae89092b13b1f2598b6a3c02987d6d920e4d.1693416477.git.mirq-linux@rere.qmqm.pl> In-Reply-To: References: Subject: [PATCH v2 4/7] regulator/core: regulator_resolve_supply: remove gotos MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= To: Liam Girdwood , Mark Brown Cc: Douglas Anderson , linux-kernel@vger.kernel.org, Stephen Boyd Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since 14a71d509ac8 ("Fix lockdep warning resolving supplies") the `out` label is just `return ret;`. Inline it for easier reading. Reviewed-by: Douglas Anderson Signed-off-by: Micha=C5=82 Miros=C5=82aw --- drivers/regulator/core.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index f18e7cb88a0d..e89c12d27a9d 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -2039,7 +2039,7 @@ static int regulator_resolve_supply(struct regulator_= dev *rdev) struct regulator_dev *r; struct device *dev =3D rdev->dev.parent; struct ww_acquire_ctx ww_ctx; - int ret =3D 0; + int ret; =20 /* No supply to resolve? */ if (!rdev->supply_name) @@ -2055,7 +2055,7 @@ static int regulator_resolve_supply(struct regulator_= dev *rdev) =20 /* Did the lookup explicitly defer for us? */ if (ret =3D=3D -EPROBE_DEFER) - goto out; + return ret; =20 if (have_full_constraints()) { r =3D dummy_regulator_rdev; @@ -2063,18 +2063,15 @@ static int regulator_resolve_supply(struct regulato= r_dev *rdev) } else { dev_err(dev, "Failed to resolve %s-supply for %s\n", rdev->supply_name, rdev->desc->name); - ret =3D -EPROBE_DEFER; - goto out; + return -EPROBE_DEFER; } } =20 if (r =3D=3D rdev) { dev_err(dev, "Supply for %s (%s) resolved to itself\n", rdev->desc->name, rdev->supply_name); - if (!have_full_constraints()) { - ret =3D -EINVAL; - goto out; - } + if (!have_full_constraints()) + return -EINVAL; r =3D dummy_regulator_rdev; get_device(&r->dev); } @@ -2088,8 +2085,7 @@ static int regulator_resolve_supply(struct regulator_= dev *rdev) if (r->dev.parent && r->dev.parent !=3D rdev->dev.parent) { if (!device_is_bound(r->dev.parent)) { put_device(&r->dev); - ret =3D -EPROBE_DEFER; - goto out; + return -EPROBE_DEFER; } } =20 @@ -2097,7 +2093,7 @@ static int regulator_resolve_supply(struct regulator_= dev *rdev) ret =3D regulator_resolve_supply(r); if (ret < 0) { put_device(&r->dev); - goto out; + return ret; } =20 /* @@ -2111,14 +2107,14 @@ static int regulator_resolve_supply(struct regulato= r_dev *rdev) if (rdev->supply) { regulator_unlock_two(rdev, r, &ww_ctx); put_device(&r->dev); - goto out; + return 0; } =20 ret =3D set_supply(rdev, r); if (ret < 0) { regulator_unlock_two(rdev, r, &ww_ctx); put_device(&r->dev); - goto out; + return ret; } =20 regulator_unlock_two(rdev, r, &ww_ctx); @@ -2133,12 +2129,11 @@ static int regulator_resolve_supply(struct regulato= r_dev *rdev) if (ret < 0) { _regulator_put(rdev->supply); rdev->supply =3D NULL; - goto out; + return ret; } } =20 -out: - return ret; + return 0; } =20 /* Internal regulator request function */ --=20 2.39.2 From nobody Thu Dec 18 19:04:09 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 442D0C83F1B for ; Wed, 30 Aug 2023 19:03:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240440AbjH3TBe (ORCPT ); Wed, 30 Aug 2023 15:01:34 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52142 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343954AbjH3Rfh (ORCPT ); Wed, 30 Aug 2023 13:35:37 -0400 Received: from rere.qmqm.pl (rere.qmqm.pl [91.227.64.183]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9551D1A3 for ; Wed, 30 Aug 2023 10:35:34 -0700 (PDT) Received: from remote.user (localhost [127.0.0.1]) by rere.qmqm.pl (Postfix) with ESMTPSA id 4RbWfF1KmZzgk; Wed, 30 Aug 2023 19:35:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=rere.qmqm.pl; s=1; t=1693416933; bh=FBO3C/ZT0gXV582lOwqaqYNAxfqDw70mVXC++i5rfZQ=; h=Date:In-Reply-To:References:Subject:From:To:Cc:From; b=V0rJTCM40625GgmDxlSvUOLWaZOLLW+/FF4+z4VjKTlAulr35h8dJbrJr5VbfoQn2 SLoU4Qsmqt8wWw/svk6m6PpYOepC8Eesrt9aHTJRPWJ7FM9YyyaQbLyF3vknwuGEyG 8/ex66OV96WAAsHj2PYDAE+NlFUXnc5LVNjFMtjh0TF5tPHtiVcnGBRQbL7utEB1rF Ly1Hv3S5evsQJWGbkTDjDwjHZJT+TPnxW5ceLDrFdJU5PcXjJRAAsaCJyYh9UjiCR9 MxUF5FQEMTmZVLIbS6sXAt2PDa2x5Jw1T8+sABN0kFdLvwm0lFSP+uqgDZmq3SVcCJ 6EojIry0utvsg== X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at mail Date: Wed, 30 Aug 2023 19:35:32 +0200 Message-Id: <85bcd0af56521209f40e76e0cac626c4f02b7df5.1693416477.git.mirq-linux@rere.qmqm.pl> In-Reply-To: References: Subject: [PATCH v2 5/7] regulator/core: regulator_lock_contended: wrap ww_mutex lock sequence restart MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= To: Liam Girdwood , Mark Brown Cc: Douglas Anderson , linux-kernel@vger.kernel.org, Stephen Boyd Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Wrap locking a regulator after a failed ww_mutex locking sequence with a new function. This is to deduplicate occurrences of the pattern and make it self-documenting. Signed-off-by: Micha=C5=82 Miros=C5=82aw Reviewed-by: Douglas Anderson --- drivers/regulator/core.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e89c12d27a9d..7201927c5d5b 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -154,6 +154,22 @@ static inline int regulator_lock_nested(struct regulat= or_dev *rdev, return 0; } =20 +/** + * regulator_lock_contended - retry locking a regulator + * @rdev: regulator source + * @ww_ctx: w/w mutex acquire context + * + * Locks a regulator after a failed locking sequence (aborted + * with -EDEADLK). + */ +static inline void regulator_lock_contended(struct regulator_dev *rdev, + struct ww_acquire_ctx *ww_ctx) +{ + ww_mutex_lock_slow(&rdev->mutex, ww_ctx); + rdev->ref_cnt++; + rdev->mutex_owner =3D current; +} + /** * regulator_lock - lock a single regulator * @rdev: regulator source @@ -218,9 +234,7 @@ static void regulator_lock_two(struct regulator_dev *rd= ev1, while (true) { regulator_unlock(held); =20 - ww_mutex_lock_slow(&contended->mutex, ww_ctx); - contended->ref_cnt++; - contended->mutex_owner =3D current; + regulator_lock_contended(contended, ww_ctx); swap(held, contended); ret =3D regulator_lock_nested(contended, ww_ctx); =20 @@ -376,10 +390,8 @@ static void regulator_lock_dependent(struct regulator_= dev *rdev, =20 do { if (new_contended_rdev) { - ww_mutex_lock_slow(&new_contended_rdev->mutex, ww_ctx); + regulator_lock_contended(new_contended_rdev, ww_ctx); old_contended_rdev =3D new_contended_rdev; - old_contended_rdev->ref_cnt++; - old_contended_rdev->mutex_owner =3D current; } =20 err =3D regulator_lock_recursive(rdev, @@ -6085,10 +6097,8 @@ static void regulator_summary_lock(struct ww_acquire= _ctx *ww_ctx) =20 do { if (new_contended_rdev) { - ww_mutex_lock_slow(&new_contended_rdev->mutex, ww_ctx); + regulator_lock_contended(new_contended_rdev, ww_ctx); old_contended_rdev =3D new_contended_rdev; - old_contended_rdev->ref_cnt++; - old_contended_rdev->mutex_owner =3D current; } =20 err =3D regulator_summary_lock_all(ww_ctx, --=20 2.39.2 From nobody Thu Dec 18 19:04:09 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 14A2DC83F17 for ; Wed, 30 Aug 2023 18:34:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234728AbjH3Seo (ORCPT ); Wed, 30 Aug 2023 14:34:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343955AbjH3Rfh (ORCPT ); Wed, 30 Aug 2023 13:35:37 -0400 Received: from rere.qmqm.pl (rere.qmqm.pl [91.227.64.183]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 546A0193 for ; Wed, 30 Aug 2023 10:35:35 -0700 (PDT) Received: from remote.user (localhost [127.0.0.1]) by rere.qmqm.pl (Postfix) with ESMTPSA id 4RbWfF3GB8zjJ; Wed, 30 Aug 2023 19:35:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=rere.qmqm.pl; s=1; t=1693416933; bh=dWJXSE23EEsNF2ABidxY7QtS4t5FWf+OeZGytVGqGR8=; h=Date:In-Reply-To:References:Subject:From:To:Cc:From; b=l9cjpoKiexV48zwpCG2Zkfb3Ds0UQvudFGggvDKy4nEvJnJMQBvenJi1vwuBxS96N D5461n2lcq8l1JOa/IgGertHluRUaVh+mGso9Ievi3EtvlmMhDZUjeChOY0GVM4Dmr dWqAsta0V4sMW0uMJ1nnCnS7Puj9T1yUlXDVGeLdFuAp0sz8nOb2xakrra6toLK6hz POEtdbL8/Yxby/kDtDdSGg2anisNlvqDEKuoUu6sfg1ci5VEo/LSssrsMF/1SprnhS AJbxVGrvqK81qANtOK9bP/CvEE6XwUJ7ydC2IYslNIl1cZyG6BCXn0LtzJW5JDAk0P pHeuKbujphmfA== X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at mail Date: Wed, 30 Aug 2023 19:35:33 +0200 Message-Id: <3240d792149f32fb4164ad7042091daf9f59f9a3.1693416477.git.mirq-linux@rere.qmqm.pl> In-Reply-To: References: Subject: [PATCH v2 6/7] regulator/core: regulator_lock_two: propagate error up MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= To: Liam Girdwood , Mark Brown Cc: Douglas Anderson , linux-kernel@vger.kernel.org, Stephen Boyd Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Fix up error paths from regulator_lock_two(): although it should not fail, returning with half-locked state after issuing a WARN() asks for even more trouble. Fixes: cba6cfdc7c3f ("regulator: core: Avoid lockdep reports when resolving= supplies") Signed-off-by: Micha=C5=82 Miros=C5=82aw --- v2: - updated kerneldoc - call ww_acquire_done() on all exits --- drivers/regulator/core.c | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 7201927c5d5b..3f9621621da9 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -209,11 +209,12 @@ static void regulator_unlock(struct regulator_dev *rd= ev) * @rdev2: second regulator * @ww_ctx: w/w mutex acquire context * - * Locks both rdevs using the regulator_ww_class. + * Locks both rdevs using the regulator_ww_class. Returns error if an + * unexpected error has been detected during a locking sequence. */ -static void regulator_lock_two(struct regulator_dev *rdev1, - struct regulator_dev *rdev2, - struct ww_acquire_ctx *ww_ctx) +static int regulator_lock_two(struct regulator_dev *rdev1, + struct regulator_dev *rdev2, + struct ww_acquire_ctx *ww_ctx) { struct regulator_dev *held, *contended; int ret; @@ -222,10 +223,13 @@ static void regulator_lock_two(struct regulator_dev *= rdev1, =20 /* Try to just grab both of them */ ret =3D regulator_lock_nested(rdev1, ww_ctx); - WARN_ON(ret); + if (WARN_ON(ret)) + goto exit; ret =3D regulator_lock_nested(rdev2, ww_ctx); - if (ret !=3D -EDEADLOCK) { - WARN_ON(ret); + if (!ret) + goto exit; + if (WARN_ON(ret !=3D -EDEADLOCK)) { + regulator_unlock(rdev1); goto exit; } =20 @@ -239,13 +243,15 @@ static void regulator_lock_two(struct regulator_dev *= rdev1, ret =3D regulator_lock_nested(contended, ww_ctx); =20 if (ret !=3D -EDEADLOCK) { - WARN_ON(ret); + if (WARN_ON(ret)) + regulator_unlock(held); break; } } =20 exit: ww_acquire_done(ww_ctx); + return ret; } =20 /** @@ -2113,7 +2119,11 @@ static int regulator_resolve_supply(struct regulator= _dev *rdev) * between rdev->supply null check and setting rdev->supply in * set_supply() from concurrent tasks. */ - regulator_lock_two(rdev, r, &ww_ctx); + ret =3D regulator_lock_two(rdev, r, &ww_ctx); + if (ret < 0) { + put_device(&r->dev); + return ret; + } =20 /* Supply just resolved by a concurrent task? */ if (rdev->supply) { --=20 2.39.2 From nobody Thu Dec 18 19:04:09 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0F5C9C83F15 for ; Wed, 30 Aug 2023 19:23:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245449AbjH3TWT (ORCPT ); Wed, 30 Aug 2023 15:22:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52166 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343956AbjH3Rfi (ORCPT ); Wed, 30 Aug 2023 13:35:38 -0400 Received: from rere.qmqm.pl (rere.qmqm.pl [91.227.64.183]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DEB991A2 for ; Wed, 30 Aug 2023 10:35:35 -0700 (PDT) Received: from remote.user (localhost [127.0.0.1]) by rere.qmqm.pl (Postfix) with ESMTPSA id 4RbWfG0m3Zzkh; Wed, 30 Aug 2023 19:35:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=rere.qmqm.pl; s=1; t=1693416934; bh=HM9xVlM37R0H8C6zhS+PEHaYWeUHbqjwBKdmiA2Kahc=; h=Date:In-Reply-To:References:Subject:From:To:Cc:From; b=PAE0P/P65FT0kw/23b6ehZwHwq7z5Num3MBY060IIsPdX+QyQlAECOrv+1Tqk3Nw3 d865p7Ec/t38auBAVje+bM7yl32i2CyCilg4GY//mdGec8zSRLT72epGGDFIIHYjdy 8Qb5LPjQQSvzOswKNa+E7iFo+/PzksSUwvffmnn32qyqP5PSXj6OiLLxpAutM3hT4Z gykvdQUNBRijrHWp3n/Z5S7wCbfGABaDmEeft8tQ4KufSFXXOmwEAbfqQ0V7gAe1PV 6K1nt7pEk1QZGh60lF+O1RI7WVZJbRp7Cmm1NBazGlzHECLuOTF/zaaqFpwqubAg2M tBcWq6YJxgLvw== X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at mail Date: Wed, 30 Aug 2023 19:35:33 +0200 Message-Id: <711d447ac7160ca275975f6aba51e19bfcb4f742.1693416477.git.mirq-linux@rere.qmqm.pl> In-Reply-To: References: Subject: [PATCH v2 7/7] regulator/core: regulator_lock_two: remove duplicate locking code MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= To: Liam Girdwood , Mark Brown Cc: Stephen Boyd , Douglas Anderson , linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Make regulator_lock_two() shorter by observing that we have only two locks and when swapped earlier the retry code becomes identical to the normal (optimistic) path. Signed-off-by: Micha=C5=82 Miros=C5=82aw --- drivers/regulator/core.c | 30 +++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 3f9621621da9..36cec3fbcdea 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -216,37 +216,29 @@ static int regulator_lock_two(struct regulator_dev *r= dev1, struct regulator_dev *rdev2, struct ww_acquire_ctx *ww_ctx) { - struct regulator_dev *held, *contended; int ret; =20 ww_acquire_init(ww_ctx, ®ulator_ww_class); =20 - /* Try to just grab both of them */ ret =3D regulator_lock_nested(rdev1, ww_ctx); if (WARN_ON(ret)) goto exit; - ret =3D regulator_lock_nested(rdev2, ww_ctx); - if (!ret) - goto exit; - if (WARN_ON(ret !=3D -EDEADLOCK)) { - regulator_unlock(rdev1); - goto exit; - } =20 - held =3D rdev1; - contended =3D rdev2; while (true) { - regulator_unlock(held); + ret =3D regulator_lock_nested(rdev2, ww_ctx); + if (!ret) + break; =20 - regulator_lock_contended(contended, ww_ctx); - swap(held, contended); - ret =3D regulator_lock_nested(contended, ww_ctx); + regulator_unlock(rdev1); =20 - if (ret !=3D -EDEADLOCK) { - if (WARN_ON(ret)) - regulator_unlock(held); + if (WARN_ON(ret !=3D -EDEADLOCK)) break; - } + + /* Swap the locking order and retry. */ + + swap(rdev1, rdev2); + + regulator_lock_contended(rdev1, ww_ctx); } =20 exit: --=20 2.39.2