> 
> The function rte_eth_dev_set_mtu is not supported for all DPDK drivers.
> Currently if it is not supported we return an error in
> dpdk_eth_dev_queue_setup. There are two issues with this.
> 
> (i) A device can still function even if rte_eth_dev_set_mtu is not
> supported albeit with the default max rx packet length.
> 
> (ii) When the ENOTSUP is returned it will not be caught in
> port_reconfigure() at the dpif-netdev layer. Port_reconfigure() checks
> if a netdev_reconfigure() function is supported for a given netdev and
> ignores EOPNOTSUPP errors as it assumes errors of this value mean there
> is no reconfiguration function. In this case the reconfiguration function
> is supported for netdev dpdk but a function called as part of the
> reconfigure (rte_eth_dev_set_mtu) may not be supported.
> 
> As this is a corner case, this commit warns a user when
> rte_eth_dev_set_mtu is not supported and informs them of the default
> max rx packet length that will be used instead.
> 
> Signed-off-by: Ian Stokes <[email protected]>
> Co-author: Michal Weglicki <[email protected]>

Tested-by: Ciara Loftus <[email protected]>

Hi Ian,

Thanks for the patch. It needs a rebase.

PCAP vdevs fall under the (i) category. Before this patch I always observed a 
SEGV on pcap rx. Queues were not setup for pcap devices due to the failed 
mtu_set function, and later polling on those non-existent queues caused the 
SEGV. This patch removes this case and reports the error as described instead.

Thanks,
Ciara

> ---
>  lib/netdev-dpdk.c | 17 ++++++++++++++---
>  1 file changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 50c7619..e6c483d 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -771,6 +771,7 @@ dpdk_eth_dev_queue_setup(struct netdev_dpdk
> *dev, int n_rxq, int n_txq)
>      int diag = 0;
>      int i;
>      struct rte_eth_conf conf = port_conf;
> +    uint16_t conf_mtu;
> 
>      /* For some NICs (e.g. Niantic), scatter_rx mode needs to be explicitly
>       * enabled. */
> @@ -804,9 +805,19 @@ dpdk_eth_dev_queue_setup(struct netdev_dpdk
> *dev, int n_rxq, int n_txq)
> 
>          diag = rte_eth_dev_set_mtu(dev->port_id, dev->mtu);
>          if (diag) {
> -            VLOG_ERR("Interface %s MTU (%d) setup error: %s",
> -                    dev->up.name, dev->mtu, rte_strerror(-diag));
> -            break;
> +            /* A device may not support rte_eth_dev_set_mtu, in this case
> +             * check flag a warning to the user and include the devices
> +             * configured MTU value that will be used instead. */
> +            if (-ENOTSUP == diag) {
> +                rte_eth_dev_get_mtu(dev->port_id, &conf_mtu);
> +                VLOG_WARN("Interface %s does not support MTU configuration, "
> +                          "max packet size supported is %d.",
> +                          dev->up.name, conf_mtu);
> +            } else {
> +                VLOG_ERR("Interface %s MTU (%d) setup error: %s",
> +                         dev->up.name, dev->mtu, rte_strerror(-diag));
> +                break;
> +            }
>          }
> 
>          for (i = 0; i < n_txq; i++) {
> --
> 2.7.5
> 
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to