]> git.droids-corp.org - dpdk.git/commitdiff
bus/pci: align next mapping address on page boundary
authorWangyu (Eric) <seven.wangyu@huawei.com>
Wed, 13 Nov 2019 07:17:30 +0000 (07:17 +0000)
committerDavid Marchand <david.marchand@redhat.com>
Thu, 14 Nov 2019 13:17:48 +0000 (14:17 +0100)
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 <dengxiaofeng@huawei.com>
Signed-off-by: Wangyu (Eric) <seven.wangyu@huawei.com>
Acked-by: Wei Hu (Xavier) <xavier.huwei@huawei.com>
Acked-by: Min Hu (Connor) <humin29@huawei.com>
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Gavin Hu <gavin.hu@arm.com>
drivers/bus/pci/linux/pci_uio.c
drivers/bus/pci/linux/pci_vfio.c

index 6dca05a9868c4c8d500700509aa924d81cb0e172..097dc19225d6ef4968a5b1dd693bcba79b2f833c 100644 (file)
@@ -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;
index b8faa23f8233f792d5cfc757dbcce9445f1d2f39..64cd84a6897fde6132672c8130ad2832888c6e86 100644 (file)
@@ -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;