[dpdk-dev] virtio pmd failed in pci probing

Vincent Li vincent.mc.li at gmail.com
Thu May 12 18:34:29 CEST 2016


Hi

I am testing mTCP https://github.com/eunyoung14/mtcp  with dpdk-16.04
on KVM guest and it appears the virtio pmd fail to load, detail info
below:


# ./tools/dpdk_nic_bind.py --status

Network devices using DPDK-compatible driver
============================================
0000:00:07.0 'Virtio network device' drv=igb_uio unused=

Network devices using kernel driver
===================================
0000:00:03.0 'Virtio network device' if= drv=virtio-pci unused=igb_uio
0000:00:08.0 'Virtio network device' if= drv=virtio-pci unused=igb_uio

in mtcp/src/io_module.c, I have (I hard code the whiltelist to make it
easy to test for me):



               sprintf(whitelist, "%s", "0000:00:07.0");
               /* initialize the rte env first, what a waste of
implementation effort!  */
                char *argv[] = {"",
                                "-c",
                                cpumaskbuf,
                                "-w",
                                whitelist,
                                "-n",
                                mem_channels,
                                "--proc-type=auto",
                                ""
                };
                const int argc = 8;

                /*
                 * re-set getopt extern variable optind.
                 * this issue was a bitch to debug
                 * rte_eal_init() internally uses getopt() syscall
                 * mtcp applications that also use an `external' getopt
                 * will cause a violent crash if optind is not reset to zero
                 * prior to calling the func below...
                 * see man getopt(3) for more details
                 */
                optind = 0;

                /* initialize the dpdk eal env */
                ret = rte_eal_init(argc, argv);
                if (ret < 0)
                        rte_exit(EXIT_FAILURE, "Invalid EAL args!\n");
                /* give me the count of 'detected' ethernet ports */
                num_devices = rte_eth_dev_count();
                if (num_devices == 0) {
                        rte_exit(EXIT_FAILURE, "No Ethernet port!\n");
                }

in dpdk-16.04/lib/librte_eal/common/eal_common_pci.c
rte_eal_pci_probe_one_driver, I added debug line below:

/*
 * If vendor/device ID match, call the devinit() function of the
 * driver.
 */
static int
rte_eal_pci_probe_one_driver(struct rte_pci_driver *dr, struct
rte_pci_device *dev)
{
        int ret;
        const struct rte_pci_id *id_table;

        RTE_LOG(DEBUG, EAL, "  dev->id.vendor_id:dev->id.device_id
dr->name %x:%x %s\n", dev->id.vendor_id,
                                dev->id.device_id, dr->name);


when I run mTCP app as below, it says "No Ethernet port!", please note
that the debug line did not show rte_virtio_pmd, why? is it because
virtio pmd lack of vendor_id/device_id implementation?


EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using
unreliable clock cycles !
EAL: Master lcore 0 is ready (tid=dca0e900;cpuset=[0])
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_vmxnet3_pmd
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_i40e_pmd
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_i40evf_pmd
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_ixgbe_pmd
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_ixgbevf_pmd
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_igb_pmd
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_igbvf_pmd
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_em_pmd
pci_probe_all_drivers ret: 1 devargs not NULL and whitelisted
EAL: Error - exiting with code: 1
  Cause: No Ethernet port!


dpdk testpmd app detects the ethernet port fine, here is the testpmd
output (Note here the debug line shows rte_virtio_pmd):

./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4  -w 0000:00:07.0 -- -i

EAL: Master lcore 0 is ready (tid=e9c98900;cpuset=[0])
EAL: lcore 3 is ready (tid=a69f6700;cpuset=[3])
EAL: lcore 2 is ready (tid=a71f7700;cpuset=[2])
EAL: lcore 1 is ready (tid=a79f8700;cpuset=[1])
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000 rte_vmxnet3_pmd
EAL:   dev->id.vendor_id:dev->id.device_id dr->name 1af4:1000
rte_virtio_pmd
EAL: PCI device 0000:00:07.0 on NUMA socket -1
EAL:   probe driver: 1af4:1000 rte_virtio_pmd
EAL:   PCI memory mapped at 0x7fabe8a00000


I am able to workaround this by compiling dpdk as shared library for
mTCP and use '-d' to load librte_pmd_virtio.so explicitly.

it looks to me there isn't much difference between how testpmd and
mTCP invokes dpdk, it is straightforward rte_eal_init(argc, argv) and
rte_eth_dev_count()

is there any potential bug in the implementation of virtio pmd in pci probing ?

Thanks!


More information about the dev mailing list