Message ID | 20170417213639.21092.22951.stgit@bhelgaas-glaptop.roam.corp.google.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
On Mon, Apr 17, 2017 at 2:36 PM, Bjorn Helgaas <bhelgaas@google.com> wrote: > From: Yongji Xie <elohimes@gmail.com> > > In case that one device's alignment is greater than its size, > we may get an incorrect size and alignment for its bus's memory > window in pbus_size_mem(). This patch fixes this case. In which case, that device alignment is not same as size? or powerpc need small size, but alignment is PAGE_SIZE? Thanks Yinghai
Hi Yinghai, On 18 April 2017 at 05:45, Yinghai Lu <yinghai@kernel.org> wrote: > On Mon, Apr 17, 2017 at 2:36 PM, Bjorn Helgaas <bhelgaas@google.com> wrote: >> From: Yongji Xie <elohimes@gmail.com> >> >> In case that one device's alignment is greater than its size, >> we may get an incorrect size and alignment for its bus's memory >> window in pbus_size_mem(). This patch fixes this case. > > In which case, that device alignment is not same as size? > or powerpc need small size, but alignment is PAGE_SIZE? > Yes, powerpc may have some small size (smaller than PAGE_SIZE) devices whose alignment would be enforced to be PAGE_SIZE by pcibios_default_alignment() (in patch 4). Thanks, Yongji
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index cb389277df41..958da7db9033 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -1066,10 +1066,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, r->flags = 0; continue; } - size += r_size; + size += max(r_size, align); /* Exclude ranges with size > align from calculation of the alignment. */ - if (r_size == align) + if (r_size <= align) aligns[order] += align; if (order > max_order) max_order = order;