> -----Original Message----- > From: David Marchand <david.march...@redhat.com> > Sent: Friday, July 10, 2020 5:54 PM > To: Zhang, AlvinX <alvinx.zh...@intel.com> > Cc: dev <dev@dpdk.org>; Xing, Beilei <beilei.x...@intel.com>; Guo, Jia > <jia....@intel.com> > Subject: Re: [dpdk-dev] [PATCH] bus/pci: fix mmap PCI resource > > On Wed, Jul 8, 2020 at 11:26 AM <alvinx.zh...@intel.com> wrote: > > > > From: Alvin Zhang <alvinx.zh...@intel.com> > > > > When mapping a PCI BAR containing an MSI-X table, some devices do not > > need to actually map this BAR or only need to map part of them, which > > may cause the mapping to fail. Now some checks are added and a > > non-NULL initial value is set to the variable to avoid this situation. > > > > Fixes: 2fd3567e5425 ("pci: use OS generic memory mapping functions") > > Cc: tal...@mellanox.com > > > > Signed-off-by: Alvin Zhang <alvinx.zh...@intel.com> > > --- > > drivers/bus/pci/linux/pci_vfio.c | 12 +++++++++++- > > 1 file changed, 11 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/bus/pci/linux/pci_vfio.c > > b/drivers/bus/pci/linux/pci_vfio.c > > index fdeb9a8..9143bfc 100644 > > --- a/drivers/bus/pci/linux/pci_vfio.c > > +++ b/drivers/bus/pci/linux/pci_vfio.c > > @@ -547,6 +547,14 @@ > > bar_index, > > memreg[0].offset, memreg[0].size, > > memreg[1].offset, memreg[1].size); > > + > > + if (memreg[0].size == 0 && memreg[1].size == 0) { > > + /* No need to map this BAR */ > > + RTE_LOG(DEBUG, EAL, "Skipping BAR%d\n", > bar_index); > > + bar->size = 0; > > + bar->addr = 0; > > + return 0; > > + } > > We already have a check on bar size == 0. > Why would we have this condition? > Broken hw? >
If the misx-table size is equal to the bar size, the memreg[0].size and memreg[1].size will be zero at same time although the bar size is not zero > > > } else { > > memreg[0].offset = bar->offset; > > memreg[0].size = bar->size; @@ -556,7 +564,9 @@ > > bar_addr = mmap(bar->addr, bar->size, 0, MAP_PRIVATE | > > MAP_ANONYMOUS | additional_flags, -1, 0); > > if (bar_addr != MAP_FAILED) { > > - void *map_addr = NULL; > > + /* Set non NULL initial value for in case of no PCI mapping > */ > > + void *map_addr = bar_addr; > > + > > It took me some time to understand this code... > Anyway, we have a regression in the librte_pci. > This is where the fix should be. > > We can cleanup this code later. The key cause is the value of memreg[0].size is 0 > > > if (memreg[0].size) { > > /* actual map of first part */ > > map_addr = pci_map_resource(bar_addr, > > vfio_dev_fd, > > -- > > 1.8.3.1 > > > > > Thanks. > > -- > David Marchand