From: Wangyu (Eric) Date: Wed, 13 Nov 2019 07:17:30 +0000 (+0000) Subject: bus/pci: align next mapping address on page boundary X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=d25ab4b7f128610cb5310b424c1f608686173f13;p=dpdk.git bus/pci: align next mapping address on page boundary Currently, the next address picked by PCI mapping infrastructure may be page-unaligned due to BAR length being smaller than page size. This leads to a situation where the requested map address is invalid, resulting in mmap() call returning an arbitrary address, which will later interfere with device BAR mapping in secondary processes. Fix it by always aligning the next requested address on page boundary. Fixes: c752998b5e2e ("pci: introduce library and driver") Cc: stable@dpdk.org Signed-off-by: Xiaofeng Deng Signed-off-by: Wangyu (Eric) Acked-by: Wei Hu (Xavier) Acked-by: Min Hu (Connor) Acked-by: Anatoly Burakov Acked-by: Gavin Hu --- diff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c index 6dca05a986..097dc19225 100644 --- a/drivers/bus/pci/linux/pci_uio.c +++ b/drivers/bus/pci/linux/pci_uio.c @@ -351,6 +351,8 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx, pci_map_addr = RTE_PTR_ADD(mapaddr, (size_t)dev->mem_resource[res_idx].len); + pci_map_addr = RTE_PTR_ALIGN(pci_map_addr, sysconf(_SC_PAGE_SIZE)); + maps[map_idx].phaddr = dev->mem_resource[res_idx].phys_addr; maps[map_idx].size = dev->mem_resource[res_idx].len; maps[map_idx].addr = mapaddr; diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c index b8faa23f82..64cd84a689 100644 --- a/drivers/bus/pci/linux/pci_vfio.c +++ b/drivers/bus/pci/linux/pci_vfio.c @@ -750,6 +750,9 @@ pci_vfio_map_resource_primary(struct rte_pci_device *dev) bar_addr = pci_map_addr; pci_map_addr = RTE_PTR_ADD(bar_addr, (size_t) reg->size); + pci_map_addr = RTE_PTR_ALIGN(pci_map_addr, + sysconf(_SC_PAGE_SIZE)); + maps[i].addr = bar_addr; maps[i].offset = reg->offset; maps[i].size = reg->size;