summaryrefslogtreecommitdiff
path: root/drivers/bus
diff options
context:
space:
mode:
authorTone Zhang <tone.zhang@arm.com>2018-12-12 19:25:59 +0800
committerThomas Monjalon <thomas@monjalon.net>2018-12-20 00:12:20 +0100
commit9cea8774cf1c466cdd6dc8bade4350cc28161905 (patch)
tree0c00f8f362ef8b1418e78b2e40d4a3cae4731f2b /drivers/bus
parent32fa7f8913930be9bb44995e391b5c6b2a88efb6 (diff)
downloaddpdk-next-eventdev-9cea8774cf1c466cdd6dc8bade4350cc28161905.zip
dpdk-next-eventdev-9cea8774cf1c466cdd6dc8bade4350cc28161905.tar.gz
dpdk-next-eventdev-9cea8774cf1c466cdd6dc8bade4350cc28161905.tar.xz
vfio: support 64KB kernel page size
With a larger PAGE_SIZE it is possible for the MSI table to very close to the end of the BAR s.t. when we align the start and end of the MSI table to the PAGE_SIZE, the end offset of the MSI table is out of the PCI BAR boundary. This patch addresses the issue by comparing both the start and the end offset of the MSI table with the BAR size, and skip the mapping if it is out of Bar scope. The patch fixes the debug log as below: EAL: Skipping BAR0 Signed-off-by: Tone Zhang <tone.zhang@arm.com> Reviewed-by: Gavin Hu <gavin.hu@arm.com> Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com> Reviewed-by: Steve Capper <steve.capper@arm.com> Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
Diffstat (limited to 'drivers/bus')
-rw-r--r--drivers/bus/pci/linux/pci_vfio.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c
index 54a4c95..fa8cfbb 100644
--- a/drivers/bus/pci/linux/pci_vfio.c
+++ b/drivers/bus/pci/linux/pci_vfio.c
@@ -457,9 +457,10 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res,
struct pci_msix_table *msix_table = &vfio_res->msix_table;
struct pci_map *bar = &vfio_res->maps[bar_index];
- if (bar->size == 0)
- /* Skip this BAR */
+ if (bar->size == 0) {
+ RTE_LOG(DEBUG, EAL, "Bar size is 0, skip BAR%d\n", bar_index);
return 0;
+ }
if (msix_table->bar_index == bar_index) {
/*
@@ -468,8 +469,15 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res,
*/
uint32_t table_start = msix_table->offset;
uint32_t table_end = table_start + msix_table->size;
- table_end = (table_end + ~PAGE_MASK) & PAGE_MASK;
- table_start &= PAGE_MASK;
+ table_end = RTE_ALIGN(table_end, PAGE_SIZE);
+ table_start = RTE_ALIGN_FLOOR(table_start, PAGE_SIZE);
+
+ /* If page-aligned start of MSI-X table is less than the
+ * actual MSI-X table start address, reassign to the actual
+ * start address.
+ */
+ if (table_start < msix_table->offset)
+ table_start = msix_table->offset;
if (table_start == 0 && table_end >= bar->size) {
/* Cannot map this BAR */
@@ -481,8 +489,17 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res,
memreg[0].offset = bar->offset;
memreg[0].size = table_start;
- memreg[1].offset = bar->offset + table_end;
- memreg[1].size = bar->size - table_end;
+ if (bar->size < table_end) {
+ /*
+ * If MSI-X table end is beyond BAR end, don't attempt
+ * to perform second mapping.
+ */
+ memreg[1].offset = 0;
+ memreg[1].size = 0;
+ } else {
+ memreg[1].offset = bar->offset + table_end;
+ memreg[1].size = bar->size - table_end;
+ }
RTE_LOG(DEBUG, EAL,
"Trying to map BAR%d that contains the MSI-X "