From a38dccb3ee80a1d0b8973191c9e94f045441f8cc Mon Sep 17 00:00:00 2001 From: Jianbo Liu Date: Mon, 29 Oct 2018 08:29:41 +0000 Subject: [PATCH] dpif-netlink: Don't destroy and recreate port if it exists In commit 7521e0cf9e ('ofproto-dpif: Let the dpif report when a port is a duplicate'), the checking of port existence before adding was removed, and it's up to the dpif to check if port exists and add only if needed. But the port can't be added to datapath if already exists. Then it will be destroyed and created again. This causes problem because configuration may miss. For example, if creating two vxlan on the same port, its ingress qdisc will be lost after recreated. Fixes: 7521e0cf9e88 ("ofproto-dpif: Let the dpif report when a port is a duplicate.") Signed-off-by: Jianbo Liu Reviewed-by: Roi Dayan Signed-off-by: Ben Pfaff --- lib/dpif-netlink.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 2b2bb01a4..f2011f22e 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -863,7 +863,7 @@ dpif_netlink_rtnl_port_create_and_add(struct dpif_netlink *dpif, name = netdev_vport_get_dpif_port(netdev, namebuf, sizeof namebuf); error = dpif_netlink_port_add__(dpif, name, OVS_VPORT_TYPE_NETDEV, NULL, port_nop); - if (error) { + if (error && error != EEXIST) { dpif_netlink_rtnl_port_destroy(name, netdev_get_type(netdev)); } return error; @@ -880,7 +880,7 @@ dpif_netlink_port_add(struct dpif *dpif_, struct netdev *netdev, if (!ovs_tunnels_out_of_tree) { error = dpif_netlink_rtnl_port_create_and_add(dpif, netdev, port_nop); } - if (error) { + if (error && error != EEXIST) { error = dpif_netlink_port_add_compat(dpif, netdev, port_nop); } fat_rwlock_unlock(&dpif->upcall_lock);