Message ID | 20240429004935.2400191-1-yung-chuan.liao@linux.intel.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | soundwire: fix usages of device_get_named_child_node() | expand |
… > 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
On 29-04-24, 00:49, Bard Liao wrote: > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> > > 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
> -----Original Message----- > From: Vinod Koul <vkoul@kernel.org> > Sent: Saturday, May 4, 2024 8:56 PM > To: Bard Liao <yung-chuan.liao@linux.intel.com> > Cc: linux-sound@vger.kernel.org; linux-kernel@vger.kernel.org; pierre- > louis.bossart@linux.intel.com; Liao, Bard <bard.liao@intel.com> > 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 <pierre-louis.bossart@linux.intel.com> > > > > 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
On Mon, 29 Apr 2024 00:49:35 +0000, Bard Liao wrote: > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> > > 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. > " > > [...] Applied, thanks! [1/1] soundwire: fix usages of device_get_named_child_node() commit: 55953994903c3b6ef7b520b8f0632245fb718692 Best regards,
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); } /*