Failed to hotplug add a device from secondary process

Message ID CAASPJr=VGDyv7Hm6bJxV750oEx4CGoBqyavTy686d0HhEJj2+Q@mail.gmail.com
State New
Delegated to: Ferruh Yigit
Headers show
Series
  • Failed to hotplug add a device from secondary process
Related show

Checks

Context Check Description
ci/Intel-compilation fail apply issues

Commit Message

Ogawa Yasufumi July 11, 2019, 12:57 p.m.
Hi all,

I have developed a multi-process app and am struggling to fix an error
while adding PMD from secondary process with hotplug feature. As we
reported in [1], I think it is because initializing hogplugged device is
changed to be done by primary first, then secondary. However,
initialization in secondary might work properly, so `rx_pkt_burst` and
`tx_pkt_burst` are NULL.

[1] https://bugs.dpdk.org/show_bug.cgi?id=194

It might happen other than vhost. I confirmed that ring and pcap PMD work
fine, but failed to run null PMD. I've got realized there is a bug in probe
function, such as rte_pmd_vhsot_probe() in
drivers/net/vhost/rte_eth_vhost.c, called from secondary.

I have fixed the issue in nullpmd by simply adding burst functions as
following. However, I'm not sure if it is correct way. In addition, cannot
fix for vhost because there are still some variables shold be setup in
secondary.


Could anyone help us for fixing the issue, or give us some advice?

Regards,
Yasufumi

Patch

diff --git a/drivers/net/null/rte_eth_null.c
b/drivers/net/null/rte_eth_null.c
index 159c1c1fd..5e5b719c0 100644
--- a/drivers/net/null/rte_eth_null.c
+++ b/drivers/net/null/rte_eth_null.c
@@ -623,6 +623,13 @@  rte_pmd_null_probe(struct rte_vdev_device *dev)
                /* TODO: request info from primary to set up Rx and Tx */
                eth_dev->dev_ops = &ops;
                eth_dev->device = &dev->device;
+               if (packet_copy) {
+                       eth_dev->rx_pkt_burst = eth_null_copy_rx;
+                       eth_dev->tx_pkt_burst = eth_null_copy_tx;
+               } else {
+                       eth_dev->rx_pkt_burst = eth_null_rx;
+                       eth_dev->tx_pkt_burst = eth_null_tx;
+               }
                rte_eth_dev_probing_finish(eth_dev);
                return 0;