Hi Matan, On 2/2/20 5:03 PM, Matan Azrad wrote: > In order to support virtio queue creation by the FW, ROCE mode > should be disabled in the device. > > Do it by netlink which is like the devlink tool commands: > 1. devlink dev param set pci/[pci] name enable_roce value false > cmode driverinit > 2. devlink dev reload pci/[pci] > Or by sysfs which is like: > echo 0 > /sys/bus/pci/devices/[pci]/roce_enable > > The IB device is matched again after ROCE disabling. > > Signed-off-by: Matan Azrad <ma...@mellanox.com> > Acked-by: Viacheslav Ovsiienko <viachesl...@mellanox.com> > Acked-by: Maxime Coquelin <maxime.coque...@redhat.com> > --- > drivers/vdpa/mlx5/Makefile | 2 +- > drivers/vdpa/mlx5/meson.build | 2 +- > drivers/vdpa/mlx5/mlx5_vdpa.c | 191 > ++++++++++++++++++++++++++++++++++-------- > 3 files changed, 160 insertions(+), 35 deletions(-) ... > diff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c > index 57619d2..710f305 100644 > --- a/drivers/vdpa/mlx5/mlx5_vdpa.c > +++ b/drivers/vdpa/mlx5/mlx5_vdpa.c
... > @@ -246,8 +389,7 @@ > mlx5_vdpa_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, > struct rte_pci_device *pci_dev __rte_unused) > { > - struct ibv_device **ibv_list; > - struct ibv_device *ibv_match = NULL; > + struct ibv_device *ibv; > struct mlx5_vdpa_priv *priv = NULL; > struct ibv_context *ctx = NULL; > struct mlx5_hca_attr attr; > @@ -258,42 +400,25 @@ > " driver."); > return 1; > } > - errno = 0; > - ibv_list = mlx5_glue->get_device_list(&ret); > - if (!ibv_list) { > - rte_errno = ENOSYS; > - DRV_LOG(ERR, "Failed to get device list, is ib_uverbs loaded?"); > + ibv = mlx5_vdpa_get_ib_device_match(&pci_dev->addr); > + if (!ibv) { > + DRV_LOG(ERR, "No matching IB device for PCI slot " > + PCI_PRI_FMT ".", pci_dev->addr.domain, > + pci_dev->addr.bus, pci_dev->addr.devid, > + pci_dev->addr.function); > return -rte_errno; > - } > - while (ret-- > 0) { > - struct rte_pci_addr pci_addr; > - > - DRV_LOG(DEBUG, "Checking device \"%s\"..", ibv_list[ret]->name); > - if (mlx5_dev_to_pci_addr(ibv_list[ret]->ibdev_path, &pci_addr)) > - continue; > - if (pci_dev->addr.domain != pci_addr.domain || > - pci_dev->addr.bus != pci_addr.bus || > - pci_dev->addr.devid != pci_addr.devid || > - pci_dev->addr.function != pci_addr.function) > - continue; > + } else { > DRV_LOG(INFO, "PCI information matches for device \"%s\".", > - ibv_list[ret]->name); > - ibv_match = ibv_list[ret]; > - break; > + ibv->name); > } > - mlx5_glue->free_device_list(ibv_list); > - if (!ibv_match) { > - DRV_LOG(ERR, "No matching IB device for PCI slot " > - "%" SCNx32 ":%" SCNx8 ":%" SCNx8 ".%" SCNx8 ".", > - pci_dev->addr.domain, pci_dev->addr.bus, > - pci_dev->addr.devid, pci_dev->addr.function); > - rte_errno = ENOENT; > - return -rte_errno; > + if (mlx5_vdpa_roce_disable(&pci_dev->addr, &ibv) != 0) { > + DRV_LOG(WARNING, "Failed to disable ROCE for \"%s\".", > + ibv->name); > + //return -rte_errno; > } Is that commented return expected?