From: Niklas Cassel <niklas.cassel@linaro.org>
To: broonie@kernel.org, Liam Girdwood <lgirdwood@gmail.com>
Cc: linux-arm-msm@vger.kernel.org,
Niklas Cassel <niklas.cassel@linaro.org>,
linux-kernel@vger.kernel.org
Subject: [PATCH 1/4] regulator: qcom_spmi: Fix warning Bad of_node_put()
Date: Mon, 16 Jul 2018 13:35:22 +0200 [thread overview]
Message-ID: <20180716113525.9335-2-niklas.cassel@linaro.org> (raw)
In-Reply-To: <20180716113525.9335-1-niklas.cassel@linaro.org>
For of_find_node_by_name(), you typically pass what the previous call
returned. Therefore, of_find_node_by_name() increases the refcount of
the returned node, and decreases the refcount of the node passed as the
first argument.
However, in this case we don't pass what the previous call returned,
so we have to increase the refcount of the first argument to compensate.
Also add a missing of_node_put() for the returned value, since this was
previously being leaked.
OF: ERROR: Bad of_node_put() on /soc/qcom,spmi@400f000/pmic@3/regulators
CPU: 1 PID: 1 Comm: swapper/0 Tainted: G W 4.18.0-rc4-00223-gefd7b360b70e #12
Hardware name: Qualcomm Technologies, Inc. DB820c (DT)
Call trace:
dump_backtrace+0x0/0x1a8
show_stack+0x14/0x20
dump_stack+0x90/0xb4
of_node_release+0x74/0x78
kobject_put+0x90/0x1f0
of_node_put+0x14/0x20
of_find_node_by_name+0x80/0xd8
qcom_spmi_regulator_probe+0x30c/0x508
Fixes: 0caecaa87202 ("regulator: qcom_spmi: Add support for SAW")
Signed-off-by: Niklas Cassel <niklas.cassel@linaro.org>
---
drivers/regulator/qcom_spmi-regulator.c | 42 ++++++++++++++++++-------
1 file changed, 30 insertions(+), 12 deletions(-)
diff --git a/drivers/regulator/qcom_spmi-regulator.c b/drivers/regulator/qcom_spmi-regulator.c
index 9817f1a75342..8b921b1b1df5 100644
--- a/drivers/regulator/qcom_spmi-regulator.c
+++ b/drivers/regulator/qcom_spmi-regulator.c
@@ -1752,7 +1752,8 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
const char *name;
struct device *dev = &pdev->dev;
struct device_node *node = pdev->dev.of_node;
- struct device_node *syscon;
+ struct device_node *syscon, *reg_node;
+ struct property *reg_prop;
int ret, lenp;
struct list_head *vreg_list;
@@ -1780,10 +1781,18 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
for (reg = match->data; reg->name; reg++) {
- if (saw_regmap && \
- of_find_property(of_find_node_by_name(node, reg->name), \
- "qcom,saw-slave", &lenp)) {
- continue;
+ if (saw_regmap) {
+ /*
+ * Compensate for of_node_put() in
+ * of_find_node_by_name()
+ */
+ of_node_get(node);
+ reg_node = of_find_node_by_name(node, reg->name);
+ reg_prop = of_find_property(reg_node, "qcom,saw-slave",
+ &lenp);
+ of_node_put(reg_node);
+ if (reg_prop)
+ continue;
}
vreg = devm_kzalloc(dev, sizeof(*vreg), GFP_KERNEL);
@@ -1816,13 +1825,22 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev)
if (ret)
continue;
- if (saw_regmap && \
- of_find_property(of_find_node_by_name(node, reg->name), \
- "qcom,saw-leader", &lenp)) {
- spmi_saw_ops = *(vreg->desc.ops);
- spmi_saw_ops.set_voltage_sel = \
- spmi_regulator_saw_set_voltage;
- vreg->desc.ops = &spmi_saw_ops;
+ if (saw_regmap) {
+ /*
+ * Compensate for of_node_put() in
+ * of_find_node_by_name()
+ */
+ of_node_get(node);
+ reg_node = of_find_node_by_name(node, reg->name);
+ reg_prop = of_find_property(reg_node, "qcom,saw-leader",
+ &lenp);
+ of_node_put(reg_node);
+ if (reg_prop) {
+ spmi_saw_ops = *(vreg->desc.ops);
+ spmi_saw_ops.set_voltage_sel =
+ spmi_regulator_saw_set_voltage;
+ vreg->desc.ops = &spmi_saw_ops;
+ }
}
config.dev = dev;
--
2.17.1
next prev parent reply other threads:[~2018-07-16 11:36 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-16 11:35 [PATCH 0/4] regulator: qcom_spmi: fix Bad of_node_put() splat Niklas Cassel
2018-07-16 11:35 ` Niklas Cassel [this message]
2018-07-16 12:01 ` [PATCH 1/4] regulator: qcom_spmi: Fix warning Bad of_node_put() Johan Hovold
2018-07-16 13:29 ` Niklas Cassel
2018-07-16 14:23 ` Johan Hovold
2018-07-16 11:35 ` [PATCH 2/4] regulator: qcom_spmi: Use correct regmap when checking for error Niklas Cassel
2018-07-20 16:45 ` Applied "regulator: qcom_spmi: Use correct regmap when checking for error" to the regulator tree Mark Brown
2018-07-16 11:35 ` [PATCH 3/4] regulator: qcom_spmi: Do not initialise static to NULL Niklas Cassel
2018-07-20 16:45 ` Applied "regulator: qcom_spmi: Do not initialise static to NULL" to the regulator tree Mark Brown
2018-07-16 11:35 ` [PATCH 4/4] regulator: qcom_spmi: Indent with tabs instead of spaces Niklas Cassel
2018-07-20 16:45 ` Applied "regulator: qcom_spmi: Indent with tabs instead of spaces" to the regulator tree Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180716113525.9335-2-niklas.cassel@linaro.org \
--to=niklas.cassel@linaro.org \
--cc=broonie@kernel.org \
--cc=lgirdwood@gmail.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®