2024-04-29 00:50:03

by Bard Liao

[permalink] [raw]
Subject: [PATCH] soundwire: fix usages of device_get_named_child_node()

From: Pierre-Louis Bossart <[email protected]>

The documentation for device_get_named_child_node() mentions this
important point:

"
The caller is responsible for calling fwnode_handle_put() on the
returned fwnode pointer.
"

Add fwnode_handle_put() to avoid leaked references.

Signed-off-by: Pierre-Louis Bossart <[email protected]>
Signed-off-by: Bard Liao <[email protected]>
---
drivers/soundwire/amd_manager.c | 3 +++
drivers/soundwire/intel_auxdevice.c | 6 +++++-
drivers/soundwire/mipi_disco.c | 30 +++++++++++++++++++++++------
3 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/drivers/soundwire/amd_manager.c b/drivers/soundwire/amd_manager.c
index 1066d87aa011..14bc624bc6b5 100644
--- a/drivers/soundwire/amd_manager.c
+++ b/drivers/soundwire/amd_manager.c
@@ -558,6 +558,9 @@ static int sdw_master_read_amd_prop(struct sdw_bus *bus)
amd_manager->wake_en_mask = wake_en_mask;
fwnode_property_read_u32(link, "amd-sdw-power-mode", &power_mode_mask);
amd_manager->power_mode_mask = power_mode_mask;
+
+ fwnode_handle_put(link);
+
return 0;
}

diff --git a/drivers/soundwire/intel_auxdevice.c b/drivers/soundwire/intel_auxdevice.c
index 17cf27e6ea73..18517121cc89 100644
--- a/drivers/soundwire/intel_auxdevice.c
+++ b/drivers/soundwire/intel_auxdevice.c
@@ -155,8 +155,10 @@ static int sdw_master_read_intel_prop(struct sdw_bus *bus)
SDW_MASTER_QUIRKS_CLEAR_INITIAL_PARITY;

intel_prop = devm_kzalloc(bus->dev, sizeof(*intel_prop), GFP_KERNEL);
- if (!intel_prop)
+ if (!intel_prop) {
+ fwnode_handle_put(link);
return -ENOMEM;
+ }

/* initialize with hardware defaults, in case the properties are not found */
intel_prop->doaise = 0x1;
@@ -184,6 +186,8 @@ static int sdw_master_read_intel_prop(struct sdw_bus *bus)
intel_prop->dodse,
intel_prop->dods);

+ fwnode_handle_put(link);
+
return 0;
}

diff --git a/drivers/soundwire/mipi_disco.c b/drivers/soundwire/mipi_disco.c
index 55a9c51c84c1..e5d9df26d4dc 100644
--- a/drivers/soundwire/mipi_disco.c
+++ b/drivers/soundwire/mipi_disco.c
@@ -66,8 +66,10 @@ int sdw_master_read_prop(struct sdw_bus *bus)
prop->clk_freq = devm_kcalloc(bus->dev, prop->num_clk_freq,
sizeof(*prop->clk_freq),
GFP_KERNEL);
- if (!prop->clk_freq)
+ if (!prop->clk_freq) {
+ fwnode_handle_put(link);
return -ENOMEM;
+ }

fwnode_property_read_u32_array(link,
"mipi-sdw-clock-frequencies-supported",
@@ -92,8 +94,10 @@ int sdw_master_read_prop(struct sdw_bus *bus)
prop->clk_gears = devm_kcalloc(bus->dev, prop->num_clk_gears,
sizeof(*prop->clk_gears),
GFP_KERNEL);
- if (!prop->clk_gears)
+ if (!prop->clk_gears) {
+ fwnode_handle_put(link);
return -ENOMEM;
+ }

fwnode_property_read_u32_array(link,
"mipi-sdw-supported-clock-gears",
@@ -116,6 +120,8 @@ int sdw_master_read_prop(struct sdw_bus *bus)
fwnode_property_read_u32(link, "mipi-sdw-command-error-threshold",
&prop->err_threshold);

+ fwnode_handle_put(link);
+
return 0;
}
EXPORT_SYMBOL(sdw_master_read_prop);
@@ -197,8 +203,10 @@ static int sdw_slave_read_dpn(struct sdw_slave *slave,
dpn[i].num_words,
sizeof(*dpn[i].words),
GFP_KERNEL);
- if (!dpn[i].words)
+ if (!dpn[i].words) {
+ fwnode_handle_put(node);
return -ENOMEM;
+ }

fwnode_property_read_u32_array(node,
"mipi-sdw-port-wordlength-configs",
@@ -236,8 +244,10 @@ static int sdw_slave_read_dpn(struct sdw_slave *slave,
dpn[i].num_channels,
sizeof(*dpn[i].channels),
GFP_KERNEL);
- if (!dpn[i].channels)
+ if (!dpn[i].channels) {
+ fwnode_handle_put(node);
return -ENOMEM;
+ }

fwnode_property_read_u32_array(node,
"mipi-sdw-channel-number-list",
@@ -251,8 +261,10 @@ static int sdw_slave_read_dpn(struct sdw_slave *slave,
dpn[i].num_ch_combinations,
sizeof(*dpn[i].ch_combinations),
GFP_KERNEL);
- if (!dpn[i].ch_combinations)
+ if (!dpn[i].ch_combinations) {
+ fwnode_handle_put(node);
return -ENOMEM;
+ }

fwnode_property_read_u32_array(node,
"mipi-sdw-channel-combination-list",
@@ -274,6 +286,8 @@ static int sdw_slave_read_dpn(struct sdw_slave *slave,

/* TODO: Read audio mode */

+ fwnode_handle_put(node);
+
i++;
}

@@ -348,10 +362,14 @@ int sdw_slave_read_prop(struct sdw_slave *slave)
prop->dp0_prop = devm_kzalloc(&slave->dev,
sizeof(*prop->dp0_prop),
GFP_KERNEL);
- if (!prop->dp0_prop)
+ if (!prop->dp0_prop) {
+ fwnode_handle_put(port);
return -ENOMEM;
+ }

sdw_slave_read_dp0(slave, port, prop->dp0_prop);
+
+ fwnode_handle_put(port);
}

/*
--
2.34.1



2024-04-29 11:43:31

by Markus Elfring

[permalink] [raw]
Subject: Re: [PATCH] soundwire: fix usages of device_get_named_child_node()


> Add fwnode_handle_put() to avoid leaked references.

calls?

Would you like to add the tag “Fixes” accordingly?



> +++ b/drivers/soundwire/mipi_disco.c

> @@ -236,8 +244,10 @@ static int sdw_slave_read_dpn(struct sdw_slave *slave,
> dpn[i].num_channels,
> sizeof(*dpn[i].channels),
> GFP_KERNEL);
> - if (!dpn[i].channels)
> + if (!dpn[i].channels) {
> + fwnode_handle_put(node);
> return -ENOMEM;
> + }
>
> fwnode_property_read_u32_array(node,
> "mipi-sdw-channel-number-list",
> @@ -251,8 +261,10 @@ static int sdw_slave_read_dpn(struct sdw_slave *slave,
> dpn[i].num_ch_combinations,
> sizeof(*dpn[i].ch_combinations),
> GFP_KERNEL);
> - if (!dpn[i].ch_combinations)
> + if (!dpn[i].ch_combinations) {
> + fwnode_handle_put(node);
> return -ENOMEM;
> + }
>
> fwnode_property_read_u32_array(node,
> "mipi-sdw-channel-combination-list",


* Would you like to complete the exception handling by using goto chains?

* How do you think about to increase the application of scope-based resource management?


Regards,
Markus

2024-05-04 12:56:33

by Vinod Koul

[permalink] [raw]
Subject: Re: [PATCH] soundwire: fix usages of device_get_named_child_node()

On 29-04-24, 00:49, Bard Liao wrote:
> From: Pierre-Louis Bossart <[email protected]>
>
> The documentation for device_get_named_child_node() mentions this
> important point:
>
> "
> The caller is responsible for calling fwnode_handle_put() on the
> returned fwnode pointer.
> "
>
> Add fwnode_handle_put() to avoid leaked references.

This fails on sdw/next for me

--
~Vinod

2024-05-06 00:48:37

by Liao, Bard

[permalink] [raw]
Subject: RE: [PATCH] soundwire: fix usages of device_get_named_child_node()



> -----Original Message-----
> From: Vinod Koul <[email protected]>
> Sent: Saturday, May 4, 2024 8:56 PM
> To: Bard Liao <[email protected]>
> Cc: [email protected]; [email protected]; pierre-
> [email protected]; Liao, Bard <[email protected]>
> Subject: Re: [PATCH] soundwire: fix usages of device_get_named_child_node()
>
> On 29-04-24, 00:49, Bard Liao wrote:
> > From: Pierre-Louis Bossart <[email protected]>
> >
> > The documentation for device_get_named_child_node() mentions this
> > important point:
> >
> > "
> > The caller is responsible for calling fwnode_handle_put() on the
> > returned fwnode pointer.
> > "
> >
> > Add fwnode_handle_put() to avoid leaked references.
>
> This fails on sdw/next for me

Sorry I didn't realize this patch depends on" SoundWire: intel_ace2x:
read DOAIS and DODS from _DSD properties."
Could you please try again now?
Sorry about that.

>
> --
> ~Vinod