From patchwork Fri Aug 17 10:26:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 144465 Delivered-To: patch@linaro.org Received: by 2002:a2e:9754:0:0:0:0:0 with SMTP id f20-v6csp595945ljj; Fri, 17 Aug 2018 03:28:02 -0700 (PDT) X-Google-Smtp-Source: AA+uWPwksEGtZFHJU92gARxk4uCENZfFnwZ9ULtArqhK3MQcB94cE4Bmgeq91isnphA3KbYL5+RT X-Received: by 2002:a62:c218:: with SMTP id l24-v6mr36257903pfg.185.1534501682770; Fri, 17 Aug 2018 03:28:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1534501682; cv=none; d=google.com; s=arc-20160816; b=W/Yiy1C3t7ZPNtuiIIvwhdHiRcsmTSz2OWPmhhcrH556MPOqdQugIckljSghn1wZ0H By1cjxHZDoe3uPYvHyDNEyxhEtlSoMe5RV3lAimNNM9dlA45YQEnp/YjhLX/cm8aBpVL oSc2q7rzjoKjM8YiCljrjluwhJuGSASjFNKE3ioW50OnIOLY2RI5LphrvtcHbk8Oxr9I ASPYOJDDuXMhGZc2B4iW6HHcGF9vm30tbQv1i0TdIj8k96LwixSrxoESjGW6NRvpCFek ZtE+J1XB9f1DHpVK6eVxmdIwYluZqw1Re3YsNdddpZIzf//9cP61g8B5aePEdcM680/o IcYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=E9K6caDRCOFAqXYs/Z/taCaKv/lmALqzWiE05IITlbE=; b=KhbEMkOzTZTDsRzCXMWDb5t4iqm84RAP2iuioGQt5Gz2SEywGnh10n0248kIsfrNn9 /e2TLT9nJ6GSCSLbSYKFcYVinbFOp/wp0UvQBay/oflix15HOU8F3q9s+yC03W6tW5tf TRxGNmh1uoHOP5UjyMBlNWd6C18eLJe4hpJs6uU+7N4ZFLALbjvJidAqkLoTJccC0fM+ NQr7fbuHn34+FTxnEEURLpDSxdR49McjUgcyE6TSIIyNWDLWrsnIbF2sEVf8mGYx8YB8 eO9QzdbP+c3gCgtVOj2879nf+Yqr195cputHdBmDxoVMr2Yp+pM32xDol4G2ztmCqjwS RcXQ== 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 l127-v6si1934751pfc.135.2018.08.17.03.28.02; Fri, 17 Aug 2018 03:28:02 -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 S1727442AbeHQNax (ORCPT + 32 others); Fri, 17 Aug 2018 09:30:53 -0400 Received: from mout.kundenserver.de ([212.227.17.10]:44097 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727119AbeHQNac (ORCPT ); Fri, 17 Aug 2018 09:30:32 -0400 Received: from wuerfel.lan ([109.193.40.16]) by mrelayeu.kundenserver.de (mreue101 [212.227.15.145]) with ESMTPA (Nemesis) id 0LfAVs-1gEfGg3Ql6-00olnh; Fri, 17 Aug 2018 12:27:18 +0200 From: Arnd Bergmann To: linux-pci@vger.kernel.org, Bjorn Helgaas Cc: linux-kernel@vger.kernel.org, Christoph Hellwig , Lorenzo Pieralisi , Benjamin Herrenschmidt , linuxppc-dev@lists.ozlabs.org, linux-acpi@vger.kernel.org, Arnd Bergmann Subject: [RFC 09/15] PCI: xenfront: clean up pcifront_scan_root() Date: Fri, 17 Aug 2018 12:26:39 +0200 Message-Id: <20180817102645.3839621-10-arnd@arndb.de> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180817102645.3839621-1-arnd@arndb.de> References: <20180817102645.3839621-1-arnd@arndb.de> X-Provags-ID: V03:K1:imp36udsrO2nyS8JPjqHA5Ds3hFhxVLPHpRGVSWPBGXVbL9/rNV imiE1c81Sfttwp+bT8f8tuK+epvIVP0/tH2n09iCfqvqjLRLlFBwdbr6U+nTVjL+eKbRy82 /29LhtzYPzABNffKaggHUp+zeicohWvtT/S8mD+XO+rHW/DejrjMQq9cGaJyd1HBBEumpqw plfhY45irAx+gsxE+znig== X-UI-Out-Filterresults: notjunk:1; V01:K0:FL2ZqB/032s=:1A5r01tQmTrILHRXQDy23a KFl3ApCPT8sFp2nlafvObwMRHbliIqVL2rMDndnA07kCYvYEizbMGt3o0wJZAFdpNz3kS7ln6 doQt8lxk5AjbiyNPeSPVypLaLKBL+9ecrGYPefgriCFVt9Ddh617MIlRnTb/RM4FjvZzpdzk2 aW8MbQIuJtfC+B2Q15BroI+/75njcF7WXHu6vf9kZu1mYXNPAoq4nS/qN+BBq1q10kF/qZiSB 4ElYO57rst6Jvl7XlbRKy1D9O+uqCHLl1NiZZeWHGuAh7LvkLCBB6sQL1mgERYY1HPInoadrM NaNGhb6gpNJAaJ+aOhqBqZTwSEz905wppbKg8my0ZgosbExtpjhGJBpDrImOpXkrw9Sb85cZT PhYnGbAjh+HxCXfyWW8G3raZzukxI7xGnFVlaaxLXgYduuV7CMu/Qll6tQQCQIGokEipROWKF Zk9BsAVXb5wdT7saIcAAplUs0nccZd6gYsyLcEnHSur1Z6OIsevthXjOvaReUUF1XggWq4Ze/ Q4LljBdzAVS14y6HHjFLmP7+dsqXO6uLSPiicMrc/2jS+mzp4QV3fFuzubU2V1pV+mVeG8DxR iPsP7lfV+geEoBhHreBzfk9KOHzn00fI60UbvvvOEj6R0j3U5WLp2DZV58EHejQqaTxd40NGA nLme5S/oqqT7vNaz8ku8EyO+SZ1KgTzYgkvH3VlEQQaBAxuKnuzI9PXk/u92Ay6Ic9vw= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Merging pci_scan_root_bus() into pcifront_scan_root() simplifies the implementation and makes it more readable. We can allocate the pcifront_sd structure along with the bridge structure, which helps manage its lifetime rules so we don't free it before the device has been released. There are two small issues that I noticed that could be improved: - It seems we unregister the 'bus' device that is a child of the 'pci_host_bridge' device after we unregister its parent in pcifront_free_roots(), which seems odd. - We probably don't need an extra pci_bus_entry list at all, but could instead walk the children of the pcifront_device, which are all pci_host_bridge devices. Signed-off-by: Arnd Bergmann --- drivers/pci/xen-pcifront.c | 67 ++++++++++++-------------------------- 1 file changed, 21 insertions(+), 46 deletions(-) -- 2.18.0 diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index 24070e1c5f22..a5eb6cb02bec 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c @@ -443,40 +443,12 @@ static int pcifront_scan_bus(struct pcifront_device *pdev, return 0; } -static struct pci_bus *pci_scan_root_bus(struct device *parent, int bus, - struct pci_ops *ops, void *sysdata, struct list_head *resources) -{ - struct pci_host_bridge *bridge; - int error; - - bridge = pci_alloc_host_bridge(0); - if (!bridge) - return NULL; - - list_splice_init(resources, &bridge->windows); - bridge->dev.parent = parent; - bridge->sysdata = sysdata; - bridge->busnr = bus; - bridge->ops = ops; - - error = pci_scan_root_bus_bridge(bridge); - if (error < 0) - goto err_out; - - return bridge->bus; - -err_out: - kfree(bridge); - return NULL; -} - static int pcifront_scan_root(struct pcifront_device *pdev, unsigned int domain, unsigned int bus) { - struct pci_bus *b; - LIST_HEAD(resources); struct pcifront_sd *sd = NULL; struct pci_bus_entry *bus_entry = NULL; + struct pci_host_bridge *bridge; int err = 0; static struct resource busn_res = { .start = 0, @@ -498,50 +470,55 @@ static int pcifront_scan_root(struct pcifront_device *pdev, dev_info(&pdev->xdev->dev, "Creating PCI Frontend Bus %04x:%02x\n", domain, bus); + bridge = pci_alloc_host_bridge(sizeof(*sd)); + if (!bridge) + return -ENOMEM; + bus_entry = kzalloc(sizeof(*bus_entry), GFP_KERNEL); - sd = kzalloc(sizeof(*sd), GFP_KERNEL); - if (!bus_entry || !sd) { + sd = pci_host_bridge_priv(bridge); + if (!bus_entry) { err = -ENOMEM; goto err_out; } - pci_add_resource(&resources, &ioport_resource); - pci_add_resource(&resources, &iomem_resource); - pci_add_resource(&resources, &busn_res); + pci_add_resource(&bridge->windows, &ioport_resource); + pci_add_resource(&bridge->windows, &iomem_resource); + pci_add_resource(&bridge->windows, &busn_res); pcifront_init_sd(sd, domain, bus, pdev); + bridge->dev.parent = &pdev->xdev->dev; + bridge->sysdata = sd; + bridge->busnr = bus; + bridge->ops = &pcifront_bus_ops; pci_lock_rescan_remove(); - b = pci_scan_root_bus(&pdev->xdev->dev, bus, - &pcifront_bus_ops, sd, &resources); - if (!b) { + err = pci_scan_root_bus_bridge(bridge); + if (err < 0) { dev_err(&pdev->xdev->dev, "Error creating PCI Frontend Bus!\n"); - err = -ENOMEM; pci_unlock_rescan_remove(); - pci_free_resource_list(&resources); goto err_out; } - bus_entry->bus = b; + bus_entry->bus = bridge->bus; list_add(&bus_entry->list, &pdev->root_buses); /* pci_scan_root_bus skips devices which do not have a * devfn==0. The pcifront_scan_bus enumerates all devfn. */ - err = pcifront_scan_bus(pdev, domain, bus, b); + err = pcifront_scan_bus(pdev, domain, bus, bridge->bus); /* Claim resources before going "live" with our devices */ - pci_walk_bus(b, pcifront_claim_resource, pdev); + pci_walk_bus(bridge->bus, pcifront_claim_resource, pdev); /* Create SysFS and notify udev of the devices. Aka: "going live" */ - pci_bus_add_devices(b); + pci_bus_add_devices(bridge->bus); pci_unlock_rescan_remove(); return err; err_out: + pci_free_host_bridge(bridge); kfree(bus_entry); - kfree(sd); return err; } @@ -605,8 +582,6 @@ static void pcifront_free_roots(struct pcifront_device *pdev) free_root_bus_devs(bus_entry->bus); - kfree(bus_entry->bus->sysdata); - device_unregister(bus_entry->bus->bridge); pci_remove_bus(bus_entry->bus);