Messages in this thread | | | Date | Sun, 28 Oct 2007 10:17:24 -0700 | From | Randy Dunlap <> | Subject | Re: [PATCH] Align PCI memory regions to page size (4K) |
| |
On Sun, 28 Oct 2007 11:00:38 -0400 Barak Fargoun wrote:
> Add a boot parameter ('pci-mem-align') which forces PCI memory regions > to be aligned to 4K. > > > > This is very useful when developing an hypervisor, since in case we want > to let native domains direct access to specific hardware, we don't want > PCI devices to share their memory region page with other devices. In Xen > for example, PCI devices mmio resources are mapped by remapping complete > pages (by Intel VT-d & the Neocleus pass-through patch for Xen). >
Hi, This patch is oddly double-spaced and space-stuffed (spaces instead of tabs). Likely a mail client doing this. It's usually a good idea to send patches to yourself to make sure that they will apply cleanly with 'patch' before unloading them on someone else.
> > Signed-off-by: Barak Fargoun (barak@neocleus.com) > > --- > > Kernel version: 2.6.18 > > --- > > diff -r 840b9df48b6a drivers/pci/bus.c > > --- a/drivers/pci/bus.c Tue Aug 07 09:37:41 2007 +0100 > > +++ b/drivers/pci/bus.c Sun Oct 28 08:40:52 2007 -0400 > > @@ -16,6 +16,8 @@ > > #include <linux/init.h> > > > > #include "pci.h" > > + > > +extern int pci_mem_align; > > > > /** > > * pci_bus_alloc_resource - allocate a resource from a parent bus > > @@ -43,6 +45,15 @@ pci_bus_alloc_resource(struct pci_bus *b > > int i, ret = -ENOMEM; > > > > type_mask |= IORESOURCE_IO | IORESOURCE_MEM; > > + > > + /* if the boot parameter 'pci-mem-align' was specified, > then we need to > > + align the memory addresses, at page size > alignment */ > > + if (pci_mem_align) > > + { > > + /* we change only alignments which are > smaller than page size */ > > + if (align < (PAGE_SIZE-1)) > > + align = PAGE_SIZE - 1; > > + } > > > > for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { > > struct resource *r = bus->resource[i]; > > diff -r 840b9df48b6a drivers/pci/quirks.c > > --- a/drivers/pci/quirks.c Tue Aug 07 09:37:41 2007 +0100 > > +++ b/drivers/pci/quirks.c Sun Oct 28 08:40:52 2007 -0400 > > @@ -22,6 +22,54 @@ > > #include <linux/delay.h> > > #include <linux/acpi.h> > > #include "pci.h" > > + > > +/* a global flag, which signals if we should align PCI mem windows to > 4K */ > > +int pci_mem_align = 0; > > + > > +/* this function is called, if the 'pci-mem-align' was specified as a > boot > > + parameter. Used to force the kernel to > align PCI mem windows to 4k */ > > +static int __init set_pci_mem_align(char *str) > > +{ > > + pci_mem_align = 1; > > + return 1; > > +} > > +__setup("pci-mem-align", set_pci_mem_align); > > + > > +/* > > + This quirk function enables us to force all memory > resources which are > > + assigned to PCI devices, to be aligned at > a page size. This > > + fetaurs helps us in xen when running > native domains > > +*/ > > +static void __devinit quirk_xen_align_mem_resources(struct pci_dev > *dev) > > +{ > > + int i; > > + struct resource *r; > > + > > + /* if the boot parameter 'pci-mem-align' wasn't specified, > then no need > > + to align the memory addresses */ > > + if (pci_mem_align == 0) > > + return; > > + > > + for (i=0; i < DEVICE_COUNT_RESOURCE; ++i) { > > + r = &dev->resource[i]; > > + > > + if (r == NULL) > > + continue; > > + > > + /* we need to adjust only memory resources > */ > > + if (r->flags & IORESOURCE_MEM) { > > + /* align the start address > in page size alignment alignment (round up) */ > > + resource_size_t old_start > = r->start; > > + r->start = (r->start + > (PAGE_SIZE-1)) & (~(PAGE_SIZE-1)); > > + > > + /* update the end address, > so that the region size will not be > > + affected > */ > > + r->end = r->end - > (old_start - r->start); > > + } > > + } > > +} > > +DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, > quirk_xen_align_mem_resources); > > + > > > > /* The Mellanox Tavor device gives false positive parity errors > > * Mark this device with a broken_parity_status, to allow > > > >
--- ~Randy - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |