From patchwork Sun Dec 17 18:46:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Cameron X-Patchwork-Id: 13495966 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 1450546445; Sun, 17 Dec 2023 18:47:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="DbSTLCst" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5BC7DC433C9; Sun, 17 Dec 2023 18:47:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1702838837; bh=z1xPfR7/0kHIRzEl8mhO13M6/rlHEk5SIFKF0NnTEYk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DbSTLCstSannBhZthV/FWeAOsJMgcrvhBTvNPlksJIwl7QNAZZFVu091p3ppk3wsK fUYKqHwNrXKy+rUxa5zNzg1VPsNGAhD9tIeovrs8tk9pqVMRlogV1VhC7W6bNO9ADu TS6txyZFgOHZseiygE5cExVZKGrr/epWpYcL6iHuMRwCzkiBePGxPvwQC97JIUR4oU lQsxasd1L2Lc4Lg+EwSsEnITDopkw6woa4q5kNR/Fikw/CjduDXZKtUU9N6SjGdVBb q/fmvWaRH6vE0D6tGsmFcxKNpIEaPCwiZaeDpZjRwnsarU/gHm3KKqaUXE16hU8Tso ALMu+LyrC4kNg== From: Jonathan Cameron To: linux-iio@vger.kernel.org, devicetree@vger.kernel.org Cc: Rob Herring , Frank Rowand , Jonathan Cameron Subject: [RFC PATCH 1/4] of: Add cleanup.h based autorelease via __free(device_node) markings. Date: Sun, 17 Dec 2023 18:46:45 +0000 Message-ID: <20231217184648.185236-2-jic23@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231217184648.185236-1-jic23@kernel.org> References: <20231217184648.185236-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 simile example the gains are small but there are some very complex error handling cases burried in these loops that wil be greatly simplified by enabling early returns with out the need for this manual of_node_put() call. 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 Dec 17 18:46:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Cameron X-Patchwork-Id: 13495967 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 B143B46445; Sun, 17 Dec 2023 18:47:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="srB8aVP2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 22F37C433CA; Sun, 17 Dec 2023 18:47:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1702838840; bh=ByQ1wz0BzDgc8cWxsG6CqiN3dkI10323kafU/vw5Pe8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=srB8aVP2ws1RSho00PZuKnJ0Ubo9fue7bBBqE6D/LGB7BJiOUFea0HEPVIjUpWFdq bTkCF3ybatJ2yTi5YzCTrjO5rQ7hnq/iSunZ2U6gExxDxKNTKfjj9fcFXWkda7s05a XYoC6tRGT98ZtfuszWZ3H24kw+mUpadaiDhOdJUpR2mUwOgy4jbDHhL2yaduGFbmO8 fdx37Z/EQvF9lrJ53lqWaDc0HuYvm5RhG0vPCnPq+yQB5R4yj/3vFzrpNWwfrmXKZH Zw9Wtm/mOF8JD482rnYfNwE/AqjniJVfHMcFnPL+9yqRpmF29oK0faSC+d0qiXWRJ5 l8BFhPtX3QG/Q== From: Jonathan Cameron To: linux-iio@vger.kernel.org, devicetree@vger.kernel.org Cc: Rob Herring , Frank Rowand , Jonathan Cameron Subject: [RFC PATCH 2/4] of: unittest: Use __free(device_node) Date: Sun, 17 Dec 2023 18:46:46 +0000 Message-ID: <20231217184648.185236-3-jic23@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231217184648.185236-1-jic23@kernel.org> References: <20231217184648.185236-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 Dec 17 18:46:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Cameron X-Patchwork-Id: 13495968 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 C91A045BFB; Sun, 17 Dec 2023 18:47:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="Ai2Qi7hw" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4CE80C433C8; Sun, 17 Dec 2023 18:47:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1702838843; bh=tpyIiinfVf36Owr7X4Mhg3T4gpSPmzxIBlw+KoPBg7o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ai2Qi7hwvn1Nv+Hwo0E4T/8fjaIOcwwq9KTehHZLycH554M22BJQlpg8I9IDQT2ov YtYpoDn93+CJJBsoAtr3v0x78w/1DO4XztT3kN8BKrwR9CFjMBEhemxenRB8WL73nT DYgipL99lwTvUe2O2XrCUxAHTYJkcDJihkmfTaXwwZOj2JxLBUyZjNWWeBf+jnSiVv cp1ICJl842DDAfXy5pczWuOqBzFfnlEJuF2R6MRFELkw0AV/LfgmWGnLerVNxYHeV/ cAPvjEvL/qMdkQofiD2Rf3nHyWadIVLIPTYFWeZGSjs67t3jYjwn/7OYT4ZKEfsKgD EDhrYMSLIEP6A== From: Jonathan Cameron To: linux-iio@vger.kernel.org, devicetree@vger.kernel.org Cc: Rob Herring , Frank Rowand , Jonathan Cameron Subject: [RFC PATCH 3/4] iio: adc: fsl-imx25-gcq: Use __free(device_node) Date: Sun, 17 Dec 2023 18:46:47 +0000 Message-ID: <20231217184648.185236-4-jic23@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231217184648.185236-1-jic23@kernel.org> References: <20231217184648.185236-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 Dec 17 18:46:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Cameron X-Patchwork-Id: 13495969 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 8BF1641A84; Sun, 17 Dec 2023 18:47:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="cxiOk5dS" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DB3E4C433C7; Sun, 17 Dec 2023 18:47:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1702838846; bh=yP6evj5zceY7Ye61hXwY7pu/5SYa4vhY2oqK5+w0LMA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=cxiOk5dS6asXALo/hODL2as9vhZ9Iupkw0t0yZEVcLU1hdupnMg+BiYd3PlMZZLFf A6KQfP/FF4EDJKLcaRH9lWOiGdKCF3ApY6xW/rRi5uCE6bqpxNX4NwaFCmRxZ04C5/ 9ve7p9JX0EezEm0gA4Sq7dpEUm//B7NiROwu55oZZDhvfVSI6AaxWczUIHf46Aw48/ JlNWLIbnTirCOiFlsxjRj2iwBibp97zgjgJWCzmKBcrrJNYR7HvMyvBneV4Q1cOmx3 TcrTrPp3REToZgSbcjrpaHAkUYZ2ektYUweT3KkQ+RzBf46ileYXOZ3IwC5aurWA2V /CcgaJC7ce1zw== From: Jonathan Cameron To: linux-iio@vger.kernel.org, devicetree@vger.kernel.org Cc: Rob Herring , Frank Rowand , Jonathan Cameron Subject: [RFC PATCH 4/4] iio: adc: rcar-gyroadc: use __free(device_node) Date: Sun, 17 Dec 2023 18:46:48 +0000 Message-ID: <20231217184648.185236-5-jic23@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20231217184648.185236-1-jic23@kernel.org> References: <20231217184648.185236-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)