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:
Jan Kiszka 2018-06-19 16:52:42 -05:00 committed by Bjorn Helgaas
parent ce397d215c
commit 93c9a7f879
1 changed files with 6 additions and 8 deletions

View File

@ -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 list_head *resources, resource_size_t *io_base)
{ {
struct device_node *dev_node = dev->of_node; struct device_node *dev_node = dev->of_node;
struct resource *res; struct resource *res, tmp_res;
struct resource *bus_range; struct resource *bus_range;
struct of_pci_range range; struct of_pci_range range;
struct of_pci_range_parser parser; 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) if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
continue; 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) { if (!res) {
err = -ENOMEM; err = -ENOMEM;
goto failed; 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 (resource_type(res) == IORESOURCE_IO) {
if (!io_base) { if (!io_base) {
dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n", dev_err(dev, "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n",