virtio: skip error when probing kernel managed device
virtio PMD could use IO port to configure the virtio device without using UIO/VFIO driver in legacy mode. There are two issues with previous implementation: 1) virtio PMD will take over the virtio device(s) blindly even if not intended for DPDK. 2) driver conflict between virtio PMD and virtio-net kernel driver. This patch checks if there is kernel driver other than UIO/VFIO managing the virtio device before using port IO. If legacy_virtio_resource_init fails and kernel driver other than VFIO/UIO is managing the device, return 1 to tell the upper layer we don't take over this device. For all other IO port mapping errors, return -1. Note than if VFIO/UIO fails, now we don't fall back to port IO. Fixes: da978dfdc43b ("virtio: use port IO to get PCI resource") Signed-off-by: Huawei Xie <huawei.xie@intel.com> Acked-by: Yuanhan Liu <yuanhan.liu@linux.intel.com> Acked-by: David Marchand <david.marchand@6wind.com>
This commit is contained in:
parent
b8eb345378
commit
ac5e1d838d
@ -1015,6 +1015,7 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
|
||||
struct virtio_net_config *config;
|
||||
struct virtio_net_config local_config;
|
||||
struct rte_pci_device *pci_dev;
|
||||
int ret;
|
||||
|
||||
RTE_BUILD_BUG_ON(RTE_PKTMBUF_HEADROOM < sizeof(struct virtio_net_hdr));
|
||||
|
||||
@ -1037,8 +1038,9 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
|
||||
|
||||
pci_dev = eth_dev->pci_dev;
|
||||
|
||||
if (vtpci_init(pci_dev, hw) < 0)
|
||||
return -1;
|
||||
ret = vtpci_init(pci_dev, hw);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Reset the device although not necessary at startup */
|
||||
vtpci_reset(hw);
|
||||
|
@ -622,6 +622,13 @@ next:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return -1:
|
||||
* if there is error mapping with VFIO/UIO.
|
||||
* if port map error when driver type is KDRV_NONE.
|
||||
* Return 1 if kernel driver is managing the device.
|
||||
* Return 0 on success.
|
||||
*/
|
||||
int
|
||||
vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw)
|
||||
{
|
||||
@ -641,8 +648,15 @@ vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw)
|
||||
}
|
||||
|
||||
PMD_INIT_LOG(INFO, "trying with legacy virtio pci.");
|
||||
if (legacy_virtio_resource_init(dev, hw) < 0)
|
||||
if (legacy_virtio_resource_init(dev, hw) < 0) {
|
||||
if (dev->kdrv == RTE_KDRV_UNKNOWN &&
|
||||
dev->devargs->type != RTE_DEVTYPE_WHITELISTED_PCI) {
|
||||
PMD_INIT_LOG(INFO,
|
||||
"skip kernel managed virtio device.");
|
||||
return 1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
hw->vtpci_ops = &legacy_ops;
|
||||
hw->use_msix = legacy_virtio_has_msix(&dev->addr);
|
||||
|
Loading…
x
Reference in New Issue
Block a user