[ovs-dev] [PATCH v3] netdev-dpdk: Fix mempool segfault.

Ian Stokes ian.stokes at intel.com
Thu Mar 9 13:57:37 UTC 2017


The dpdk_mp_get() function can return a NULL pointer which leads to a
segfault when a mempool cannot be created. The lack of a return value
check for the function netdev_dpdk_mempool_configure() when called in
netdev_dpdk_reconfigure() can result in a segfault also as
a NULL pointer for the mempool will be passed to rte_eth_rx_queue_setup().

Fix this by adding appropriate NULL pointer and return value checks to
dpdk_mp_get(), netdev_dpdk_reconfigure() and dpdk_vhost_reconfigure_helper().

Signed-off-by: Ian Stokes <ian.stokes at intel.com>
Fixes: 2ae3d542 ("netdev-dpdk: Refactor dpdk_mp_get().")
Fixes: 0072e931 ("netdev-dpdk: add support for jumbo frames")
CC: Daniele Di Proietto <diproiettod at vmware.com>
CC: Mark Kavanagh <mark.b.kavanagh at intel.com>

---
v3
* Remove assignments within if conditions for
  netdev_dpdk_reconfigure(), netdev_vhost_reconfigure_helper() and
  dpdk_mp_get()

v2
* Remove extra VLOG_ERR in netdev_dpdk_reconfigure()
* Remove extra VLOG_ERR in netdev_vhost_reconfigure_helper()
* Remove check for NULL mempool in netdev_vhost_reconfigure_helper() as
  netdev_dpdk_mempool_configure() already checks and returns ENOMEM error
  for this case.

v1
* Add NULL pointer check to dpdk_mp_get() when calling dpdk_mp_create().
* Add return type check when calling netdev_dpdk_mempool_configure() in
  netdev_dpdk_reconfigure().
* Add return type check when calling netdev_dpdk_mempool_configure() in
  netdev_vhost_reconfigure_helper()
---
 lib/netdev-dpdk.c |   20 +++++++++++++-------
 1 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index ee53c4c..67905c4 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -530,7 +530,9 @@ dpdk_mp_get(int socket_id, int mtu)
     }
 
     dmp = dpdk_mp_create(socket_id, mtu);
-    ovs_list_push_back(&dpdk_mp_list, &dmp->list_node);
+    if (dmp) {
+        ovs_list_push_back(&dpdk_mp_list, &dmp->list_node);
+    }
 
 out:
     ovs_mutex_unlock(&dpdk_mp_mutex);
@@ -3131,7 +3133,10 @@ netdev_dpdk_reconfigure(struct netdev *netdev)
 
     if (dev->mtu != dev->requested_mtu
         || dev->socket_id != dev->requested_socket_id) {
-        netdev_dpdk_mempool_configure(dev);
+        err = netdev_dpdk_mempool_configure(dev);
+        if (err) {
+            goto out;
+        }
     }
 
     netdev->n_txq = dev->requested_n_txq;
@@ -3160,6 +3165,7 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev)
 {
     dev->up.n_txq = dev->requested_n_txq;
     dev->up.n_rxq = dev->requested_n_rxq;
+    int err;
 
     /* Enable TX queue 0 by default if it wasn't disabled. */
     if (dev->tx_q[0].map == OVS_VHOST_QUEUE_MAP_UNKNOWN) {
@@ -3170,15 +3176,15 @@ dpdk_vhost_reconfigure_helper(struct netdev_dpdk *dev)
 
     if (dev->requested_socket_id != dev->socket_id
         || dev->requested_mtu != dev->mtu) {
-        if (!netdev_dpdk_mempool_configure(dev)) {
+        err = netdev_dpdk_mempool_configure(dev);
+        if (err) {
+            return err;
+        }
+        else {
             netdev_change_seq_changed(&dev->up);
         }
     }
 
-    if (!dev->dpdk_mp) {
-        return ENOMEM;
-    }
-
     if (netdev_dpdk_get_vid(dev) >= 0) {
         dev->vhost_reconfigured = true;
     }
-- 
1.7.0.7



More information about the dev mailing list