[ovs-dev] [PATCHv2] dpif-netlink-rtnl: Fix ovs_geneve probing after restart.

Eric Garver e at erig.me
Thu Nov 2 17:32:48 UTC 2017


On Wed, Nov 01, 2017 at 12:35:40PM -0700, William Tu wrote:
> When using the out-of-tree (openvswitch compat) geneve module,
> the first time oot tunnel probing returns true (correct).
> Without unloading the geneve module, if the userspace ovs-vswitchd
> restarts, because the 'geneve_sys_6081' still exists, the probing
> incorrectly returns false and loads the in-tree (upstream kernel)
> geneve module.
> 
> The patch fixes it by querying the geneve device's kind when exists.
> The out-of-tree modules uses kind string as 'ovs_geneve', while the
> in-tree module uses 'geneve'.  To reproduce the issue, start the ovs
> > /etc/init.d/openvswitch-switch start
> > creat a bridge and attach a geneve port using out-of-tree geneve
> > /etc/init.d/openvswitch-switch restart
> 
> Fixes: 921c370a9df5 ("dpif-netlink: Probe for out-of-tree tunnels, decides used interface")
> Signed-off-by: William Tu <u9012063 at gmail.com>
> Cc: Eric Garver <e at erig.me>
> Cc: Gurucharan Shetty <guru at ovn.org>
> ---
> v1->v2:
>     Add detection of existing module, instead of unconditionally
>     remote it and create.
> ---
>  lib/dpif-netlink-rtnl.c | 35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
> 
> diff --git a/lib/dpif-netlink-rtnl.c b/lib/dpif-netlink-rtnl.c
> index 0c32e7d8ccb4..b19b862d308b 100644
> --- a/lib/dpif-netlink-rtnl.c
> +++ b/lib/dpif-netlink-rtnl.c
> @@ -440,6 +440,7 @@ dpif_netlink_rtnl_probe_oot_tunnels(void)
>  
>      error = netdev_open("ovs-system-probe", "geneve", &netdev);
>      if (!error) {
> +        struct ofpbuf *reply;
>          const struct netdev_tunnel_config *tnl_cfg;
>  
>          tnl_cfg = netdev_get_tunnel_config(netdev);
> @@ -448,6 +449,36 @@ dpif_netlink_rtnl_probe_oot_tunnels(void)
>          }
>  
>          name = netdev_vport_get_dpif_port(netdev, namebuf, sizeof namebuf);
> +
> +        /* The geneve module exists when ovs-vswitchd crashes
> +         * and restarts, handle the case here.
> +         */
> +        error = dpif_netlink_rtnl_getlink(name, &reply);
> +        if (!error) {
> +
> +            struct nlattr *linkinfo[ARRAY_SIZE(linkinfo_policy)];
> +            struct nlattr *rtlink[ARRAY_SIZE(rtlink_policy)];
> +            const char *kind;
> +
> +            nl_policy_parse(reply, NLMSG_HDRLEN + sizeof(struct ifinfomsg),
> +                            rtlink_policy, rtlink,
> +                            ARRAY_SIZE(rtlink_policy));
> +            nl_parse_nested(rtlink[IFLA_LINKINFO], linkinfo_policy,
> +                            linkinfo, ARRAY_SIZE(linkinfo_policy));

Should check the return code of these two.

> +            kind = nl_attr_get_string(linkinfo[IFLA_INFO_KIND]);
> +
> +            if (!strcmp(kind, "ovs_geneve")) {
> +                out_of_tree = true;
> +                goto exit;
> +            } else if (!strcmp(kind, "geneve")) {
> +                out_of_tree = false;
> +                goto exit;
> +            } else {
> +                VLOG_ABORT("Geneve tunnel device %s with kind %s"
> +                           " not supported", name, kind);
> +            }

Need to free reply somewhere, ofpbuf_delete(reply)

> +        }
> +
>          error = dpif_netlink_rtnl_create(tnl_cfg, name, OVS_VPORT_TYPE_GENEVE,
>                                           "ovs_geneve",
>                                           (NLM_F_REQUEST | NLM_F_ACK
> @@ -458,6 +489,10 @@ dpif_netlink_rtnl_probe_oot_tunnels(void)
>              }
>              out_of_tree = true;
>          }
> +    }
> +
> +exit:
> +    if (!error) {
>          netdev_close(netdev);
>      }

This is not right. netdev_open() may succeed, but
dpif_netlink_rtnl_create() can fail. Which means netdev will not be
freed here.


More information about the dev mailing list