On Fri, Nov 09, 2018 at 07:24:55AM -0500, Eelco Chaudron wrote:
> When the netdev link flags are changed, !NETDEV_UP, the DPDK ports are not
> actually going down. This is causing problems for people trying to bring
> down a bond member. The bond link is no longer being used to receive or
> transmit traffic, however, the other end keeps sending data as the link
> remains up.
> 
> With OVS 2.6 the link was brought down, and this was changed with commit
> 3b1fb0779. In this commit, it's explicitly mentioned that the link down/up
> DPDK APIs are not called as not all PMD devices support it.
> 
> However, this patch does call the appropriate DPDK APIs and ignoring
> errors due to the PMD not supporting it. PMDs not supporting this should
> be fixed in DPDK upstream.
> 
> I verified this patch is working correctly using the
> ovs-appctl netdev-dpdk/set-admin-state <port> {up|down} and
> ovs-ofctl mod-port <bridge> <port> {up|down} commands on a XL710
> and 82599ES.
> 
> Fixes: 3b1fb0779b87 ("netdev-dpdk: Don't call rte_dev_stop() in 
> update_flags().")
> Signed-off-by: Eelco Chaudron <echau...@redhat.com>
> 
> ---
> * V4:
>   - Use netdev_get_name() instead of dev->up.name directly
> 
> * V3:
>   - Update log message and changed the level to INFO
> 
> * V2:
>   - Only call link state change function if the upstate changed
>   - Restore original flags on error
>   - Log a message when the NIC does not support the link state API
> 
>  lib/netdev-dpdk.c |   18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index 7e0a593..00f5acc 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -2942,6 +2942,24 @@ netdev_dpdk_update_flags__(struct netdev_dpdk *dev,
>      }
>  
>      if (dev->type == DPDK_DEV_ETH) {
> +
> +        if ((dev->flags ^ *old_flagsp) & NETDEV_UP) {
> +            int err;
> +
> +            if (dev->flags & NETDEV_UP) {
> +                err = rte_eth_dev_set_link_up(dev->port_id);
> +            } else {
> +                err = rte_eth_dev_set_link_down(dev->port_id);
> +            }
> +            if (err == -ENOTSUP) {
> +                VLOG_INFO("Interface %s does not support link state "
> +                          "configuration", netdev_get_name(&dev->up));
> +            } else if (err < 0) {

The netdev_dpdk_set_admin_state__() ignores the return value so we
won't know if the there is a problem or not.
Maybe worth to fix the caller or add a msg here too?
(sorry to come up late)
fbl


> +                dev->flags = *old_flagsp;
> +                return -err;
> +            }
> +        }
> +
>          if (dev->flags & NETDEV_PROMISC) {
>              rte_eth_promiscuous_enable(dev->port_id);
>          }
> 
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

-- 
Flavio

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to