Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp255300imm; Tue, 15 May 2018 00:55:06 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqwhLYMHkO08F8XotnkCaorVi0L9SwmqXP5z3VJgZ9KTUS2BJDKXPTVoOLZqKyjVAERcSA+ X-Received: by 2002:a65:590e:: with SMTP id f14-v6mr11255221pgu.282.1526370906312; Tue, 15 May 2018 00:55:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526370906; cv=none; d=google.com; s=arc-20160816; b=d7WWl2DCW27Kil1bwiqOskkQA8ECh0dw8cMSinLtgTXe+5BuJUdiNXW3TRHjNihBvY 8gL/6C4JcbGe/RiytYq3uG3bXYNYZwlpzxG22liYa1nfdpvfp5g/BL55wP2OnBY7jk17 /SpFmE0LjuCfu35PzZxEkq0X7eHRrnd/rVsatZl59dR0milwlOZc3xPRp9X8omweyZgM gi7x9W/LSY4NiVkkPMaoxX1dXbVvDIGiUm2JFzJbqZv8mCI1z+3CFbenS2Atx9ZmVvdm W0OaSLIkE1Cz86s7cW2AIIEMHsCAk669GZcleVq3noU1S8O8GQ6n2D05NIled15bRmsZ yC+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:in-reply-to :mime-version:user-agent:date:message-id:from:cc:references:to :subject:arc-authentication-results; bh=ZZz404eSdgN9AC2D1U8J9KJTxoTat0wRw40ARhvs79w=; b=teRiN37qIE/68REVeN6P43qUZxte+sk4hQ606Mm5VROmi6pEJsrMDRbtZRB5LQc6mG GXBmqXV6di5NcPhPpoMz6N7JFaZeoPOrFKHh79ulWOKhy4Xe+v5WAc2x7Qq3XCHcpCwp miuiPKLVyu/nyYJQX4WK0OoLE7FBX2lbBICE7k8qzkP8QZ4lrplAHRmsylK6k0SjCuUa hYn6C0Zvg12olRzSGvX+Jz+b97IMYP9G24sIRijVRd4Y7PplxBB3LqHpgeY3e1dPRyDR erMnZWe08reZxOp4v/sg7Ipp21YZGwM6aTGx3ramdZ3m7YXxm7WErnXnorb2e6EgekRX HcQA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p5-v6si10381374plk.537.2018.05.15.00.54.52; Tue, 15 May 2018 00:55:06 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752292AbeEOHyT (ORCPT + 99 others); Tue, 15 May 2018 03:54:19 -0400 Received: from relay1.mentorg.com ([192.94.38.131]:60773 "EHLO relay1.mentorg.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752044AbeEOHyS (ORCPT ); Tue, 15 May 2018 03:54:18 -0400 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-MBX-04.mgc.mentorg.com) by relay1.mentorg.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-SHA384:256) id 1fIUme-0000OM-3T from Vladimir_Zapolskiy@mentor.com ; Tue, 15 May 2018 00:54:08 -0700 Received: from [137.202.108.125] (137.202.0.87) by SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) with Microsoft SMTP Server (TLS) id 15.0.1320.4; Tue, 15 May 2018 08:54:03 +0100 Subject: Re: [PATCH v3 6/8] PCI: Rework of_pci_get_host_bridge_resources() to devm_of_pci_get_host_bridge_resources() To: Jan Kiszka , Bjorn Helgaas , Linux Kernel Mailing List , , References: <4ae78ed8c3d866446f8322c1df4a19c2ca4fef58.1526363896.git.jan.kiszka@siemens.com> CC: Jingoo Han , Joao Pinto , Lorenzo Pieralisi From: Vladimir Zapolskiy Message-ID: Date: Tue, 15 May 2018 10:54:03 +0300 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Icedove/45.2.0 MIME-Version: 1.0 In-Reply-To: <4ae78ed8c3d866446f8322c1df4a19c2ca4fef58.1526363896.git.jan.kiszka@siemens.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit X-Originating-IP: [137.202.0.87] X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To SVR-IES-MBX-04.mgc.mentorg.com (139.181.222.4) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Jan, On 05/15/2018 08:58 AM, Jan Kiszka wrote: > From: Jan Kiszka > > of_pci_get_host_bridge_resources() allocates the resource structures it > fills dynamically, but none of its callers care to release them so far. > Rather than requiring everyone to do this explicitly, convert the > existing function to a managed version. > > CC: Jingoo Han > CC: Joao Pinto > CC: Lorenzo Pieralisi > Signed-off-by: Jan Kiszka [snip] > diff --git a/drivers/pci/of.c b/drivers/pci/of.c > index 4f21514cb4e4..00f42389aa56 100644 > --- a/drivers/pci/of.c > +++ b/drivers/pci/of.c > @@ -244,7 +244,8 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only); > > #if defined(CONFIG_OF_ADDRESS) > /** > - * of_pci_get_host_bridge_resources - Parse PCI host bridge resources from DT > + * devm_of_pci_get_host_bridge_resources() - Resource-managed parsing of PCI > + * host bridge resources from DT > * @dev: host bridge device > * @busno: bus number associated with the bridge root bus > * @bus_max: maximum number of buses for this bridge > @@ -253,8 +254,6 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only); > * address for the start of the I/O range. Can be NULL if the caller doesn't > * expect I/O ranges to be present in the device tree. > * > - * It is the caller's job to free the @resources list. > - * > * This function will parse the "ranges" property of a PCI host bridge device > * node and setup the resource mapping based on its content. It is expected > * that the property conforms with the Power ePAPR document. > @@ -262,12 +261,11 @@ EXPORT_SYMBOL_GPL(of_pci_check_probe_only); > * It returns zero if the range parsing has been successful or a standard error > * value if it failed. > */ > -int of_pci_get_host_bridge_resources(struct device *dev, > +int devm_of_pci_get_host_bridge_resources(struct device *dev, > unsigned char busno, unsigned char bus_max, > struct list_head *resources, resource_size_t *io_base) > { > struct device_node *dev_node = dev->of_node; > - struct resource_entry *window; > struct resource *res; > struct resource *bus_range; > struct of_pci_range range; > @@ -278,7 +276,7 @@ int of_pci_get_host_bridge_resources(struct device *dev, > if (io_base) > *io_base = (resource_size_t)OF_BAD_ADDR; > > - bus_range = kzalloc(sizeof(*bus_range), GFP_KERNEL); > + bus_range = devm_kzalloc(dev, sizeof(*bus_range), GFP_KERNEL); > if (!bus_range) > return -ENOMEM; > > @@ -300,7 +298,7 @@ int of_pci_get_host_bridge_resources(struct device *dev, > /* Check for ranges property */ > err = of_pci_range_parser_init(&parser, dev_node); > if (err) > - goto parse_failed; > + return err; In my opinion allocated by pci_add_resource() and pci_add_resource_offset() resource entries are leaked on error paths, and pci_free_resource_list() should be called. > > dev_dbg(dev, "Parsing ranges property...\n"); > for_each_of_pci_range(&parser, &range) { > @@ -322,15 +320,13 @@ int of_pci_get_host_bridge_resources(struct device *dev, > if (range.cpu_addr == OF_BAD_ADDR || range.size == 0) > continue; > > - res = kzalloc(sizeof(struct resource), GFP_KERNEL); > - if (!res) { > - err = -ENOMEM; > - goto parse_failed; > - } > + res = devm_kzalloc(dev, sizeof(struct resource), GFP_KERNEL); > + if (!res) > + return -ENOMEM; Same as above. > > err = of_pci_range_to_resource(&range, dev_node, res); > if (err) { > - kfree(res); > + devm_kfree(dev, res); > continue; > } > > @@ -339,8 +335,7 @@ int of_pci_get_host_bridge_resources(struct device *dev, > dev_err(dev, > "I/O range found for %pOF. Please provide an io_base pointer to save CPU base address\n", > dev_node); > - err = -EINVAL; > - goto conversion_failed; > + return -EINVAL; Same as above. > } > if (*io_base != (resource_size_t)OF_BAD_ADDR) > dev_warn(dev, > @@ -353,16 +348,8 @@ int of_pci_get_host_bridge_resources(struct device *dev, > } > > return 0; > - > -conversion_failed: > - kfree(res); > -parse_failed: > - resource_list_for_each_entry(window, resources) > - kfree(window->res); > - pci_free_resource_list(resources); > - return err; > } > -EXPORT_SYMBOL_GPL(of_pci_get_host_bridge_resources); > +EXPORT_SYMBOL_GPL(devm_of_pci_get_host_bridge_resources); > #endif /* CONFIG_OF_ADDRESS */ > > /** > @@ -606,7 +593,7 @@ int pci_parse_request_of_pci_ranges(struct device *dev, > struct resource_entry *win, *tmp; > > INIT_LIST_HEAD(resources); > - err = of_pci_get_host_bridge_resources(dev, 0, 0xff, resources, > + err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, resources, > &iobase); > if (err) > return err; -- With best wishes, Vladimir