Just a note on this. The issue that it resolves would also be resolved by 
Roberts patch which removes the use of the ovs list for tracking mempools.

https://mail.openvswitch.org/pipermail/ovs-dev/2017-February/329112.html

As there has not been a lot of feedback to date on that patch, I thought this 
simpler patch might be ok in the interim to avoid the segfault on master/2.7 
branch.

Ian

> 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() and netdev_dpdk_reconfigure(), also flag when a memory
> configuration error occurs in dpdk_vhost_reconfigure_helper().
> 
> Signed-off-by: Ian Stokes <[email protected]>
> Fixes: 2ae3d542 ("netdev-dpdk: Refactor dpdk_mp_get().")
> Fixes: 0072e931 ("netdev-dpdk: add support for jumbo frames")
> CC: Daniele Di Proietto <[email protected]>
> CC: Mark Kavanagh <[email protected]>
> ---
>  lib/netdev-dpdk.c |   18 ++++++++++++++----
>  1 files changed, 14 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index ee53c4c..62f4409
> 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -529,8 +529,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 = dpdk_mp_create(socket_id, mtu))) {
> +        ovs_list_push_back(&dpdk_mp_list, &dmp->list_node);
> +    }
> 
>  out:
>      ovs_mutex_unlock(&dpdk_mp_mutex);
> @@ -3131,7 +3132,11 @@ netdev_dpdk_reconfigure(struct netdev *netdev)
> 
>      if (dev->mtu != dev->requested_mtu
>          || dev->socket_id != dev->requested_socket_id) {
> -        netdev_dpdk_mempool_configure(dev);
> +        if ((err = netdev_dpdk_mempool_configure(dev))) {
> +            VLOG_ERR("Mempool configuration failed for device %s: %s",
> +                     dev->up.name, rte_strerror(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,9
> +3176,13 @@ 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)) {
> +        if (!(err = netdev_dpdk_mempool_configure(dev))) {
>              netdev_change_seq_changed(&dev->up);
>          }
> +        else {
> +            VLOG_ERR("Mempool configuration failed for device %s: %s",
> +                     dev->up.name, rte_strerror(err));
> +        }
>      }
> 
>      if (!dev->dpdk_mp) {
> --
> 1.7.0.7

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to