[dpdk-dev] testpmd hanging using virtualbox and virtio

Steffen Bauch mail at steffenbauch.de
Wed Oct 7 23:34:32 CEST 2015


Hi,

I would like to request help using DPDK, virtualbox and virtio to 
exchange data between two virtual machines (generator and receiver). To 
be able to describe my problem I have created a github repository with a 
sample setup using vagrant.

The setup is using DPDK 2.1.0, uio_pci_generic and rte_virtio_pmd on the 
generator and the plain kernel virtio-net driver on the receiver.

sb at host ~ $ vagrant --version
Vagrant 1.7.4

sb at host ~ $ virtualbox -h
Oracle VM VirtualBox Manager 4.3.30
[...]

sb at host ~ $ git clone 
https://github.com/steffenbauch/vagrant-dpdk-virtio-trial.git

sb at host ~ $ cd vagrant-dpdk-virtio-trial/

sb at host ~ $ vagrant up

sb at host ~ $ vagrant ssh generator

vagrant at vagrant-ubuntu-vivid-64:~/$ cd dpdk/x86_64-native-linuxapp-gcc/app

vagrant at vagrant-ubuntu-vivid-64:~/dpdk/x86_64-native-linuxapp-gcc/app$ 
sudo ./testpmd -b 0000:00:03.0 -c 3 -n 1 -- -i
EAL: Detected lcore 0 as core 0 on socket 0
EAL: Detected lcore 1 as core 1 on socket 0
EAL: Support maximum 128 logical core(s) by configuration.
EAL: Detected 2 lcore(s)
EAL: VFIO modules not all loaded, skip VFIO support...
EAL: Setting up physically contiguous memory...
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7fc5ee600000 (size = 0x200000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7fc5ee200000 (size = 0x200000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7fc5ede00000 (size = 0x200000)
EAL: Ask a virtual area of 0x11400000 bytes
EAL: Virtual area found at 0x7fc5dc800000 (size = 0x11400000)
EAL: Ask a virtual area of 0x2e400000 bytes
EAL: Virtual area found at 0x7fc5ae200000 (size = 0x2e400000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7fc5ade00000 (size = 0x200000)
EAL: Requesting 512 pages of size 2MB from socket 0
EAL: TSC frequency is ~2195200 KHz
EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using 
unreliable clock cycles !
EAL: Master lcore 0 is ready (tid=f03568c0;cpuset=[0])
EAL: lcore 1 is ready (tid=addff700;cpuset=[1])
EAL: PCI device 0000:00:03.0 on NUMA socket -1
EAL:   probe driver: 1af4:1000 rte_virtio_pmd
EAL:   Device is blacklisted, not initializing
EAL: PCI device 0000:00:08.0 on NUMA socket -1
EAL:   probe driver: 1af4:1000 rte_virtio_pmd
EAL: PCI device 0000:00:09.0 on NUMA socket -1
EAL:   probe driver: 1af4:1000 rte_virtio_pmd
Interactive-mode selected
Configuring Port 0 (socket 0)

[blocking]

At this point the process is hanging and not progressing towards the 
command line prompt.

I attached with gdb to the process and identified the configuration of 
the promiscious mode as the hanging call

(gdb) bt
#0  0x00007fc5ef50ec4d in nanosleep () at 
../sysdeps/unix/syscall-template.S:81
#1  0x00007fc5ef541e84 in usleep (useconds=<optimized out>) at 
../sysdeps/unix/sysv/linux/usleep.c:32
#2  0x00000000004e857d in virtio_dev_promiscuous_disable ()
#3  0x00000000004b5daf in rte_eth_dev_start ()
#4  0x0000000000435df0 in start_port ()
#5  0x0000000000431591 in main ()

Apparently the initialization is hanging sleeping in a while loop in 
virtio_send_command().

In an experiment I temporarily disabled the functions for setting the 
promiscous mode and multicast mode and was able to progress to to the 
command line prompt of testpmd. It was possible to send a burst of 32 
frames towards the receiver (using start tx_first).

Due to missing knowledge about the gory details of virtio I can not fix 
the problem and request help.

diff --git a/drivers/net/virtio/virtio_ethdev.c 
b/drivers/net/virtio/virtio_ethdev.c
index 465d3cd..e463c54 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -462,9 +462,9 @@ virtio_dev_close(struct rte_eth_dev *dev)
  }

  static void
-virtio_dev_promiscuous_enable(struct rte_eth_dev *dev)
+virtio_dev_promiscuous_enable(__attribute__((unused)) struct 
rte_eth_dev *dev)
  {
-    struct virtio_hw *hw = dev->data->dev_private;
+/*    struct virtio_hw *hw = dev->data->dev_private;
      struct virtio_pmd_ctrl ctrl;
      int dlen[1];
      int ret;
@@ -481,13 +481,13 @@ virtio_dev_promiscuous_enable(struct rte_eth_dev *dev)

      ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
      if (ret)
-        PMD_INIT_LOG(ERR, "Failed to enable promisc");
+        PMD_INIT_LOG(ERR, "Failed to enable promisc"); */
  }

  static void
-virtio_dev_promiscuous_disable(struct rte_eth_dev *dev)
+virtio_dev_promiscuous_disable(__attribute__((unused)) struct 
rte_eth_dev *dev)
  {
-    struct virtio_hw *hw = dev->data->dev_private;
+/*    struct virtio_hw *hw = dev->data->dev_private;
      struct virtio_pmd_ctrl ctrl;
      int dlen[1];
      int ret;
@@ -504,13 +504,13 @@ virtio_dev_promiscuous_disable(struct rte_eth_dev 
*dev)

      ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
      if (ret)
-        PMD_INIT_LOG(ERR, "Failed to disable promisc");
+        PMD_INIT_LOG(ERR, "Failed to disable promisc"); */
  }

  static void
-virtio_dev_allmulticast_enable(struct rte_eth_dev *dev)
+virtio_dev_allmulticast_enable(__attribute__((unused)) struct 
rte_eth_dev *dev)
  {
-    struct virtio_hw *hw = dev->data->dev_private;
+/*    struct virtio_hw *hw = dev->data->dev_private;
      struct virtio_pmd_ctrl ctrl;
      int dlen[1];
      int ret;
@@ -527,13 +527,13 @@ virtio_dev_allmulticast_enable(struct rte_eth_dev 
*dev)

      ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
      if (ret)
-        PMD_INIT_LOG(ERR, "Failed to enable allmulticast");
+        PMD_INIT_LOG(ERR, "Failed to enable allmulticast"); */
  }

  static void
-virtio_dev_allmulticast_disable(struct rte_eth_dev *dev)
+virtio_dev_allmulticast_disable(__attribute__((unused)) struct 
rte_eth_dev *dev)
  {
-    struct virtio_hw *hw = dev->data->dev_private;
+/*    struct virtio_hw *hw = dev->data->dev_private;
      struct virtio_pmd_ctrl ctrl;
      int dlen[1];
      int ret;
@@ -550,7 +550,7 @@ virtio_dev_allmulticast_disable(struct rte_eth_dev *dev)

      ret = virtio_send_command(hw->cvq, &ctrl, dlen, 1);
      if (ret)
-        PMD_INIT_LOG(ERR, "Failed to disable allmulticast");
+        PMD_INIT_LOG(ERR, "Failed to disable allmulticast"); */
  }

  /*


More information about the dev mailing list