PCI: Clean up resource allocation in devm_of_pci_get_host_bridge_resources()
Instead of first allocating and then freeing memory for struct resource in case we cannot parse a PCI resource from the device tree, work against a local struct and kmemdup() it when we decide to go with it. Suggested-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Vladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
This commit is contained in:
parent
ce397d215c
commit
93c9a7f879
|
@ -266,7 +266,7 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
|
|||
struct list_head *resources, resource_size_t *io_base)
|
||||
{
|
||||
struct device_node *dev_node = dev->of_node;
|
||||
struct resource *res;
|
||||
struct resource *res, tmp_res;
|
||||
struct resource *bus_range;
|
||||
struct of_pci_range range;
|
||||
struct of_pci_range_parser parser;
|
||||
|
@ -320,18 +320,16 @@ int devm_of_pci_get_host_bridge_resources(struct device *dev,
|
|||
if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
|
||||
continue;
|
||||
|
||||
res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL);
|
||||
err = of_pci_range_to_resource(&range, dev_node, &tmp_res);
|
||||
if (err)
|
||||
continue;
|
||||
|
||||
res = devm_kmemdup(dev, &tmp_res, sizeof(tmp_res), GFP_KERNEL);
|
||||
if (!res) {
|
||||
err = -ENOMEM;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
err = of_pci_range_to_resource(&range, dev_node, res);
|
||||
if (err) {
|
||||
devm_kfree(dev, res);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (resource_type(res) == IORESOURCE_IO) {
|
||||
if (!io_base) {
|
||||
dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",
|
||||
|
|
Loading…
Reference in New Issue