From: Bjorn Helgaas <bhelgaas@google.com>
To: Wei Yang <weiyang@linux.vnet.ibm.com>,
benh@au1.ibm.com, gwshan@linux.vnet.ibm.com
Cc: linux-pci@vger.kernel.org, linuxppc-dev@lists.ozlabs.org
Subject: Re: [PATCH v12 10/21] PCI: Consider additional PF's IOV BAR alignment in sizing and assigning
Date: Tue, 24 Feb 2015 02:41:52 -0600 [thread overview]
Message-ID: <20150224084152.GG6220@google.com> (raw)
In-Reply-To: <20150224083406.32124.65957.stgit@bhelgaas-glaptop2.roam.corp.google.com>
On Tue, Feb 24, 2015 at 02:34:06AM -0600, Bjorn Helgaas wrote:
> From: Wei Yang <weiyang@linux.vnet.ibm.com>
>
> When sizing and assigning resources, we divide the resources into two
> lists: the requested list and the additional list. We don't consider the
> alignment of additional VF(n) BAR space.
>
> This is reasonable because the alignment required for the VF(n) BAR space
> is the size of an individual VF BAR, not the size of the space for *all*
> VFs. But some platforms, e.g., PowerNV, require additional alignment.
>
> Consider the additional IOV BAR alignment when sizing and assigning
> resources. When there is not enough system MMIO space, the PF's IOV BAR
> alignment will not contribute to the bridge. When there is enough system
> MMIO space, the additional alignment will contribute to the bridge.
I don't understand the ""when there is not enough system MMIO space" part.
How do we tell if there's enough MMIO space?
> Also, take advantage of pci_dev_resource::min_align to store this
> additional alignment.
This comment doesn't seem to make sense; this patch doesn't save anything
in min_align.
Another question below...
> [bhelgaas: changelog, printk cast]
> Signed-off-by: Wei Yang <weiyang@linux.vnet.ibm.com>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
> drivers/pci/setup-bus.c | 83 ++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 70 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
> index e3e17f3c0f0f..affbceae560f 100644
> --- a/drivers/pci/setup-bus.c
> +++ b/drivers/pci/setup-bus.c
> @@ -99,8 +99,8 @@ static void remove_from_list(struct list_head *head,
> }
> }
>
> -static resource_size_t get_res_add_size(struct list_head *head,
> - struct resource *res)
> +static struct pci_dev_resource *res_to_dev_res(struct list_head *head,
> + struct resource *res)
> {
> struct pci_dev_resource *dev_res;
>
> @@ -109,17 +109,37 @@ static resource_size_t get_res_add_size(struct list_head *head,
> int idx = res - &dev_res->dev->resource[0];
>
> dev_printk(KERN_DEBUG, &dev_res->dev->dev,
> - "res[%d]=%pR get_res_add_size add_size %llx\n",
> + "res[%d]=%pR res_to_dev_res add_size %llx min_align %llx\n",
> idx, dev_res->res,
> - (unsigned long long)dev_res->add_size);
> + (unsigned long long)dev_res->add_size,
> + (unsigned long long)dev_res->min_align);
>
> - return dev_res->add_size;
> + return dev_res;
> }
> }
>
> - return 0;
> + return NULL;
> +}
> +
> +static resource_size_t get_res_add_size(struct list_head *head,
> + struct resource *res)
> +{
> + struct pci_dev_resource *dev_res;
> +
> + dev_res = res_to_dev_res(head, res);
> + return dev_res ? dev_res->add_size : 0;
> +}
> +
> +static resource_size_t get_res_add_align(struct list_head *head,
> + struct resource *res)
> +{
> + struct pci_dev_resource *dev_res;
> +
> + dev_res = res_to_dev_res(head, res);
> + return dev_res ? dev_res->min_align : 0;
> }
>
> +
> /* Sort resources by alignment */
> static void pdev_sort_resources(struct pci_dev *dev, struct list_head *head)
> {
> @@ -368,8 +388,9 @@ static void __assign_resources_sorted(struct list_head *head,
> LIST_HEAD(save_head);
> LIST_HEAD(local_fail_head);
> struct pci_dev_resource *save_res;
> - struct pci_dev_resource *dev_res, *tmp_res;
> + struct pci_dev_resource *dev_res, *tmp_res, *dev_res2;
> unsigned long fail_type;
> + resource_size_t add_align, align;
>
> /* Check if optional add_size is there */
> if (!realloc_head || list_empty(realloc_head))
> @@ -384,10 +405,38 @@ static void __assign_resources_sorted(struct list_head *head,
> }
>
> /* Update res in head list with add_size in realloc_head list */
> - list_for_each_entry(dev_res, head, list)
> + list_for_each_entry_safe(dev_res, tmp_res, head, list) {
> dev_res->res->end += get_res_add_size(realloc_head,
> dev_res->res);
>
> + /*
> + * There are two kinds of additional resources in the list:
> + * 1. bridge resource -- IORESOURCE_STARTALIGN
> + * 2. SR-IOV resource -- IORESOURCE_SIZEALIGN
> + * Here just fix the additional alignment for bridge
> + */
> + if (!(dev_res->res->flags & IORESOURCE_STARTALIGN))
> + continue;
> +
> + add_align = get_res_add_align(realloc_head, dev_res->res);
> +
> + /* Reorder the list by their alignment */
Why do we need to reorder the list by alignment?
> + if (add_align > dev_res->res->start) {
> + dev_res->res->start = add_align;
> + dev_res->res->end = add_align +
> + resource_size(dev_res->res);
> +
> + list_for_each_entry(dev_res2, head, list) {
> + align = pci_resource_alignment(dev_res2->dev,
> + dev_res2->res);
> + if (add_align > align)
> + list_move_tail(&dev_res->list,
> + &dev_res2->list);
> + }
> + }
> +
> + }
> +
> /* Try updated head list with add_size added */
> assign_requested_resources_sorted(head, &local_fail_head);
>
> @@ -962,6 +1011,8 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
> struct resource *b_res = find_free_bus_resource(bus,
> mask | IORESOURCE_PREFETCH, type);
> resource_size_t children_add_size = 0;
> + resource_size_t children_add_align = 0;
> + resource_size_t add_align = 0;
>
> if (!b_res)
> return -ENOSPC;
> @@ -986,6 +1037,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
> /* put SRIOV requested res to the optional list */
> if (realloc_head && i >= PCI_IOV_RESOURCES &&
> i <= PCI_IOV_RESOURCE_END) {
> + add_align = max(pci_resource_alignment(dev, r), add_align);
> r->end = r->start - 1;
> add_to_list(realloc_head, dev, r, r_size, 0/* don't care */);
> children_add_size += r_size;
> @@ -1016,19 +1068,23 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
> if (order > max_order)
> max_order = order;
>
> - if (realloc_head)
> + if (realloc_head) {
> children_add_size += get_res_add_size(realloc_head, r);
> + children_add_align = get_res_add_align(realloc_head, r);
> + add_align = max(add_align, children_add_align);
> + }
> }
> }
>
> min_align = calculate_mem_align(aligns, max_order);
> min_align = max(min_align, window_alignment(bus, b_res->flags));
> size0 = calculate_memsize(size, min_size, 0, resource_size(b_res), min_align);
> + add_align = max(min_align, add_align);
> if (children_add_size > add_size)
> add_size = children_add_size;
> size1 = (!realloc_head || (realloc_head && !add_size)) ? size0 :
> calculate_memsize(size, min_size, add_size,
> - resource_size(b_res), min_align);
> + resource_size(b_res), add_align);
> if (!size0 && !size1) {
> if (b_res->start || b_res->end)
> dev_info(&bus->self->dev, "disabling bridge window %pR to %pR (unused)\n",
> @@ -1040,10 +1096,11 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
> b_res->end = size0 + min_align - 1;
> b_res->flags |= IORESOURCE_STARTALIGN;
> if (size1 > size0 && realloc_head) {
> - add_to_list(realloc_head, bus->self, b_res, size1-size0, min_align);
> - dev_printk(KERN_DEBUG, &bus->self->dev, "bridge window %pR to %pR add_size %llx\n",
> + add_to_list(realloc_head, bus->self, b_res, size1-size0, add_align);
> + dev_printk(KERN_DEBUG, &bus->self->dev, "bridge window %pR to %pR add_size %llx add_align %llx\n",
> b_res, &bus->busn_res,
> - (unsigned long long)size1-size0);
> + (unsigned long long) (size1 - size0),
> + (unsigned long long) add_align);
> }
> return 0;
> }
>
next prev parent reply other threads:[~2015-02-24 8:41 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-24 8:32 [PATCH v12 00/21] Enable SRIOV on Power8 Bjorn Helgaas
2015-02-24 8:33 ` [PATCH v12 01/21] PCI: Print more info in sriov_enable() error message Bjorn Helgaas
2015-02-24 8:33 ` [PATCH v12 02/21] PCI: Print PF SR-IOV resource that contains all VF(n) BAR space Bjorn Helgaas
2015-02-24 8:33 ` [PATCH v12 03/21] PCI: Keep individual VF BAR size in struct pci_sriov Bjorn Helgaas
2015-02-24 8:33 ` [PATCH v12 04/21] PCI: Index IOV resources in the conventional style Bjorn Helgaas
2015-02-24 8:33 ` [PATCH v12 05/21] PCI: Refresh First VF Offset and VF Stride when updating NumVFs Bjorn Helgaas
2015-02-24 8:33 ` [PATCH v12 06/21] PCI: Calculate maximum number of buses required for VFs Bjorn Helgaas
2015-02-24 8:33 ` [PATCH v12 07/21] PCI: Export pci_iov_virtfn_bus() and pci_iov_virtfn_devfn() Bjorn Helgaas
2015-02-24 8:33 ` [PATCH v12 08/21] PCI: Add pcibios_sriov_enable() and pcibios_sriov_disable() Bjorn Helgaas
2015-02-24 8:39 ` Bjorn Helgaas
2015-03-02 6:53 ` Wei Yang
2015-02-24 8:33 ` [PATCH v12 09/21] PCI: Add pcibios_iov_resource_alignment() interface Bjorn Helgaas
2015-02-24 8:34 ` [PATCH v12 10/21] PCI: Consider additional PF's IOV BAR alignment in sizing and assigning Bjorn Helgaas
2015-02-24 8:41 ` Bjorn Helgaas [this message]
2015-03-02 7:32 ` Wei Yang
2015-03-11 2:36 ` Bjorn Helgaas
2015-03-11 9:17 ` Wei Yang
2015-02-24 8:34 ` [PATCH v12 11/21] powerpc/pci: Don't unset PCI resources for VFs Bjorn Helgaas
2015-02-24 8:44 ` Bjorn Helgaas
2015-03-02 7:34 ` Wei Yang
2015-02-24 8:34 ` [PATCH v12 12/21] powerpc/pci: Refactor pci_dn Bjorn Helgaas
2015-02-24 8:34 ` [PATCH v12 13/21] powerpc/powernv: Use pci_dn, not device_node, in PCI config accessor Bjorn Helgaas
2015-02-24 8:34 ` [PATCH v12 14/21] powerpc/powernv: Allocate struct pnv_ioda_pe iommu_table dynamically Bjorn Helgaas
2015-02-24 8:46 ` Bjorn Helgaas
2015-03-02 7:50 ` Wei Yang
2015-03-02 7:56 ` Benjamin Herrenschmidt
2015-03-02 8:02 ` Wei Yang
2015-03-11 2:47 ` Bjorn Helgaas
2015-03-11 6:13 ` Wei Yang
2015-02-24 8:34 ` [PATCH v12 15/21] powerpc/powernv: Reserve additional space for IOV BAR according to the number of total_pe Bjorn Helgaas
2015-02-24 8:52 ` Bjorn Helgaas
2015-03-02 7:41 ` Wei Yang
2015-03-11 2:51 ` Bjorn Helgaas
2015-03-11 6:22 ` Wei Yang
2015-03-11 13:40 ` Bjorn Helgaas
2015-02-24 8:34 ` [PATCH v12 16/21] powerpc/powernv: Implement pcibios_iov_resource_alignment() on powernv Bjorn Helgaas
2015-02-24 8:34 ` [PATCH v12 17/21] powerpc/powernv: Shift VF resource with an offset Bjorn Helgaas
2015-02-24 9:00 ` Bjorn Helgaas
2015-02-24 17:10 ` Bjorn Helgaas
2015-03-02 7:58 ` Wei Yang
2015-03-04 3:01 ` Wei Yang
2015-03-11 2:55 ` Bjorn Helgaas
2015-03-11 6:42 ` Wei Yang
2015-02-24 9:03 ` Bjorn Helgaas
2015-02-24 8:35 ` [PATCH v12 18/21] powerpc/powernv: Reserve additional space for IOV BAR, with m64_per_iov supported Bjorn Helgaas
2015-02-24 9:06 ` Bjorn Helgaas
2015-03-02 7:55 ` Wei Yang
2015-02-24 8:35 ` [PATCH v12 19/21] powerpc/powernv: Group VF PE when IOV BAR is big on PHB3 Bjorn Helgaas
2015-02-24 8:35 ` [PATCH v12 20/21] powerpc/pci: Remove unused struct pci_dn.pcidev field Bjorn Helgaas
2015-02-24 8:35 ` [PATCH v12 21/21] powerpc/pci: Add PCI resource alignment documentation Bjorn Helgaas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150224084152.GG6220@google.com \
--to=bhelgaas@google.com \
--cc=benh@au1.ibm.com \
--cc=gwshan@linux.vnet.ibm.com \
--cc=linux-pci@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=weiyang@linux.vnet.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).