From patchwork Sun Jan 14 16:53:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Cameron X-Patchwork-Id: 13519174 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 3F22E5231; Sun, 14 Jan 2024 16:54:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JYyzReS4" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 724F2C43390; Sun, 14 Jan 2024 16:54:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705251257; bh=3W1qHEpkEEvNPT0uRw4qBpEp9CwZhHXPWsBb4ES3aiw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JYyzReS4uoTuzJYfBvbtzCM9fU52/WE5RmYMrtt96OEQHyPlvG6lbnEaL3vIJ3iyd wBdAFAj/hxtTBb5cCqDxsn7b6Dxk7hJNnWLFe9RUPOPDG22m6LvQ0wtmwAhTUN9Rla ZSDmiXRC/aikBlYohcR1TyQRB9ElQ/yz6Vb3QXJoe01vOJlR287X5/HwuewxAKFZTW Gk2a8DGsUvAfNQ9ik/92atDSpo/QEOu+GAUKmWe7KuJFR2kFm7fBsML7Bou0vEvPpG x0uiwBUmBpmyq2ECpt8H+5KW3Cnu09k45VP7tsmL+EOxFkOyEA7V3z+YVxKPQuu2bL U0n0YsyEJEv0w== From: Jonathan Cameron To: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring , Frank Rowand Cc: Julia Lawall , Nicolas Palix , Sumera Priyadarsini , Jonathan Cameron Subject: [PATCH 1/4] of: Add cleanup.h based auto release via __free(device_node) markings. Date: Sun, 14 Jan 2024 16:53:55 +0000 Message-ID: <20240114165358.119916-2-jic23@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240114165358.119916-1-jic23@kernel.org> References: <20240114165358.119916-1-jic23@kernel.org> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Jonathan Cameron The recent addition of scope based cleanup support to the kernel provides a convenient tool to reduce the chances of leaking reference counts where of_node_put() should have been called in an error path. This enables struct device_node *child __free(device_node) = NULL; for_each_child_of_node(np, child) { if (test) return test; } with no need for a manual call of of_node_put() In this simple example the gains are small but there are some very complex error handling cases buried in these loops that will be greatly simplified by enabling early returns with out the need for this manual of_node_put() call. Note that there are coccinelle checks in scripts/coccinelle/iterators/for_each_child.cocci to detect a failure to call of_node_put(). This new approach does not cause false positives. Longer term we may want to add scripting to check this new approach is done correctly with no double of_node_put() calls being introduced due to the auto cleanup. It may also be useful to script finding places this new approach is useful. Signed-off-by: Jonathan Cameron --- include/linux/of.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/of.h b/include/linux/of.h index 6a9ddf20e79a..50e882ee91da 100644 --- a/include/linux/of.h +++ b/include/linux/of.h @@ -13,6 +13,7 @@ */ #include #include +#include #include #include #include @@ -134,6 +135,7 @@ static inline struct device_node *of_node_get(struct device_node *node) } static inline void of_node_put(struct device_node *node) { } #endif /* !CONFIG_OF_DYNAMIC */ +DEFINE_FREE(device_node, struct device_node *, if (_T) of_node_put(_T)) /* Pointer for first entry in chain of all nodes. */ extern struct device_node *of_root; From patchwork Sun Jan 14 16:53:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Cameron X-Patchwork-Id: 13519175 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 32106538B; Sun, 14 Jan 2024 16:54:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="onqKFgYS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 47095C433F1; Sun, 14 Jan 2024 16:54:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705251260; bh=ByQ1wz0BzDgc8cWxsG6CqiN3dkI10323kafU/vw5Pe8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=onqKFgYScJYLG51yCoQ6f6ILOH3pZqqDKusTv8aGyaxzFmQYha2Xslnc30ww950D8 4cZKeJwB8KwmlvSafMYSDNd+fqrahm6NbukaKI/bRsiMQYm/AWAjEd+ML+sI1z9u7V Svy0ZDGIdhsVSUzlGainBHL/JPOs/2AHLzT8AESeZ4HKqpQVcxmSFsdPM4Onf1AdlO LS18ei/23hvOrl3Ca/QE61P3aiHcbx1psZ/Cbsu7i9R/L0VOSsY30owKqRCMIzyrVk XpzbVpKg82taOj4CGIWdwV6uBw0OJpAKKRIrRhtuiURZBb/6Knhm1Nm2NNAf8uC7Oj /V4rJz9JTDAyg== From: Jonathan Cameron To: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring , Frank Rowand Cc: Julia Lawall , Nicolas Palix , Sumera Priyadarsini , Jonathan Cameron Subject: [PATCH 2/4] of: unittest: Use __free(device_node) Date: Sun, 14 Jan 2024 16:53:56 +0000 Message-ID: <20240114165358.119916-3-jic23@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240114165358.119916-1-jic23@kernel.org> References: <20240114165358.119916-1-jic23@kernel.org> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Jonathan Cameron A simple example of the utility of this autocleanup approach to handling of_node_put() Signed-off-by: Jonathan Cameron --- drivers/of/unittest.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index e9e90e96600e..b6d9edb831f0 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c @@ -233,27 +233,23 @@ static void __init of_unittest_dynamic(void) static int __init of_unittest_check_node_linkage(struct device_node *np) { - struct device_node *child; + struct device_node *child __free(device_node) = NULL; int count = 0, rc; for_each_child_of_node(np, child) { if (child->parent != np) { pr_err("Child node %pOFn links to wrong parent %pOFn\n", child, np); - rc = -EINVAL; - goto put_child; + return -EINVAL; } rc = of_unittest_check_node_linkage(child); if (rc < 0) - goto put_child; + return rc; count += rc; } return count + 1; -put_child: - of_node_put(child); - return rc; } static void __init of_unittest_check_tree_linkage(void) From patchwork Sun Jan 14 16:53:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Cameron X-Patchwork-Id: 13519176 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 921BA53A1; Sun, 14 Jan 2024 16:54:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eIV72eZt" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8FB1AC43394; Sun, 14 Jan 2024 16:54:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705251263; bh=tpyIiinfVf36Owr7X4Mhg3T4gpSPmzxIBlw+KoPBg7o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eIV72eZtXJNpCAWIFZ+xLZjCZ29Wv+8cOHb5MGp9ySaIhginppPDUaSuq7vThPKqE VW2kWYDm1n3aF+wYvauGu2P1P6/4/3N2ohfFv+35Mie41l0kAmDPQBTPnNOaH2HVpN +Om/tbylbjzTLTfXM4TGiWUgB824ePbGshbS+6gGU1EExzRUMRxNRDd1QNX77PA4bK MfKWM/huSTpJN5JL4b5XhvVufz9E6DG67aDrhvE1N7QLMSfAuAlVgdCBa2SmUn2HGd nf22OnMNUtLM7pCDYE6NfRI2nND12vethA0fOopyqXc++3G6elKcNX3+Tlcl8Ckrnp Q1USQdZAhYfYw== From: Jonathan Cameron To: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring , Frank Rowand Cc: Julia Lawall , Nicolas Palix , Sumera Priyadarsini , Jonathan Cameron Subject: [PATCH 3/4] iio: adc: fsl-imx25-gcq: Use __free(device_node) Date: Sun, 14 Jan 2024 16:53:57 +0000 Message-ID: <20240114165358.119916-4-jic23@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240114165358.119916-1-jic23@kernel.org> References: <20240114165358.119916-1-jic23@kernel.org> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Jonathan Cameron Using automated cleanup reduces chance of an reference count leak and simplfies the code. Signed-off-by: Jonathan Cameron --- drivers/iio/adc/fsl-imx25-gcq.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/drivers/iio/adc/fsl-imx25-gcq.c b/drivers/iio/adc/fsl-imx25-gcq.c index 68c813de0605..e04f92d7a953 100644 --- a/drivers/iio/adc/fsl-imx25-gcq.c +++ b/drivers/iio/adc/fsl-imx25-gcq.c @@ -199,7 +199,7 @@ static int mx25_gcq_setup_cfgs(struct platform_device *pdev, struct mx25_gcq_priv *priv) { struct device_node *np = pdev->dev.of_node; - struct device_node *child; + struct device_node *child __free(device_node) = NULL; struct device *dev = &pdev->dev; int ret, i; @@ -224,14 +224,12 @@ static int mx25_gcq_setup_cfgs(struct platform_device *pdev, ret = of_property_read_u32(child, "reg", ®); if (ret) { dev_err(dev, "Failed to get reg property\n"); - of_node_put(child); return ret; } if (reg >= MX25_NUM_CFGS) { dev_err(dev, "reg value is greater than the number of available configuration registers\n"); - of_node_put(child); return -EINVAL; } @@ -243,10 +241,9 @@ static int mx25_gcq_setup_cfgs(struct platform_device *pdev, case MX25_ADC_REFP_XP: case MX25_ADC_REFP_YP: ret = mx25_gcq_ext_regulator_setup(&pdev->dev, priv, refp); - if (ret) { - of_node_put(child); + if (ret) return ret; - } + priv->channel_vref_mv[reg] = regulator_get_voltage(priv->vref[refp]); /* Conversion from uV to mV */ @@ -257,7 +254,6 @@ static int mx25_gcq_setup_cfgs(struct platform_device *pdev, break; default: dev_err(dev, "Invalid positive reference %d\n", refp); - of_node_put(child); return -EINVAL; } @@ -270,12 +266,10 @@ static int mx25_gcq_setup_cfgs(struct platform_device *pdev, if ((refp & MX25_ADCQ_CFG_REFP_MASK) != refp) { dev_err(dev, "Invalid fsl,adc-refp property value\n"); - of_node_put(child); return -EINVAL; } if ((refn & MX25_ADCQ_CFG_REFN_MASK) != refn) { dev_err(dev, "Invalid fsl,adc-refn property value\n"); - of_node_put(child); return -EINVAL; } From patchwork Sun Jan 14 16:53:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Cameron X-Patchwork-Id: 13519177 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 96A275255; Sun, 14 Jan 2024 16:54:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="R0EGIyDF" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 873CCC43390; Sun, 14 Jan 2024 16:54:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705251265; bh=yP6evj5zceY7Ye61hXwY7pu/5SYa4vhY2oqK5+w0LMA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=R0EGIyDFYYCkrWB4GOrhGufynlrhz3RUYvWcgm1sVxfiWaKG9PzAPtsjvyBtQ7+ob qeseiggh660pI3m682zfICNKpOMnJziGasyxsC8GmqjnmqjNgRfxBySrCQK5nimsVX h/W1h50WatooFD6N826HKIGRAXB88yDITzEndhnevbdMO2yKLyfXocXvOiNYmJLzNj BAKzs/IdehUg7MphG4kGTQdX/EOXt4dFCx2R7j+/q1uPeyyFaL4GAa/m5gJDHzjJHm +G001VhRn1jSpsufAmCN8LH2czTm5oy0AjpD6aAeUkTmrkNsxpdvR6GwAynAT4tJGk sCPtJrTCqdq/A== From: Jonathan Cameron To: linux-iio@vger.kernel.org, devicetree@vger.kernel.org, Rob Herring , Frank Rowand Cc: Julia Lawall , Nicolas Palix , Sumera Priyadarsini , Jonathan Cameron Subject: [PATCH 4/4] iio: adc: rcar-gyroadc: use __free(device_node) Date: Sun, 14 Jan 2024 16:53:58 +0000 Message-ID: <20240114165358.119916-5-jic23@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240114165358.119916-1-jic23@kernel.org> References: <20240114165358.119916-1-jic23@kernel.org> Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Jonathan Cameron Using automated cleanup to replace of_node_put() handling allows for a simplfied flow by enabling direct returns on errors. Signed-off-by: Jonathan Cameron --- drivers/iio/adc/rcar-gyroadc.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/drivers/iio/adc/rcar-gyroadc.c b/drivers/iio/adc/rcar-gyroadc.c index d524f2e8e927..9d6227b31724 100644 --- a/drivers/iio/adc/rcar-gyroadc.c +++ b/drivers/iio/adc/rcar-gyroadc.c @@ -318,7 +318,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) struct rcar_gyroadc *priv = iio_priv(indio_dev); struct device *dev = priv->dev; struct device_node *np = dev->of_node; - struct device_node *child; + struct device_node *child __free(device_node) = NULL; struct regulator *vref; unsigned int reg; unsigned int adcmode = -1, childmode; @@ -352,7 +352,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) num_channels = ARRAY_SIZE(rcar_gyroadc_iio_channels_3); break; default: - goto err_e_inval; + return -EINVAL; } /* @@ -369,7 +369,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) dev_err(dev, "Failed to get child reg property of ADC \"%pOFn\".\n", child); - goto err_of_node_put; + return ret; } /* Channel number is too high. */ @@ -377,7 +377,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) dev_err(dev, "Only %i channels supported with %pOFn, but reg = <%i>.\n", num_channels, child, reg); - goto err_e_inval; + return -EINVAL; } } @@ -386,7 +386,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) dev_err(dev, "Channel %i uses different ADC mode than the rest.\n", reg); - goto err_e_inval; + return -EINVAL; } /* Channel is valid, grab the regulator. */ @@ -396,8 +396,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) if (IS_ERR(vref)) { dev_dbg(dev, "Channel %i 'vref' supply not connected.\n", reg); - ret = PTR_ERR(vref); - goto err_of_node_put; + return PTR_ERR(vref); } priv->vref[reg] = vref; @@ -422,7 +421,6 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) * we can stop parsing here. */ if (childmode == RCAR_GYROADC_MODE_SELECT_1_MB88101A) { - of_node_put(child); break; } } @@ -433,12 +431,6 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) } return 0; - -err_e_inval: - ret = -EINVAL; -err_of_node_put: - of_node_put(child); - return ret; } static void rcar_gyroadc_deinit_supplies(struct iio_dev *indio_dev)