From patchwork Wed Jul 4 23:46:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roopa Prabhu X-Patchwork-Id: 939604 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="aw6sjso8"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Ld1j02JMz9s29 for ; Thu, 5 Jul 2018 09:46:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752997AbeGDXqj (ORCPT ); Wed, 4 Jul 2018 19:46:39 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:40181 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752958AbeGDXqh (ORCPT ); Wed, 4 Jul 2018 19:46:37 -0400 Received: by mail-pf0-f195.google.com with SMTP id z24-v6so3711679pfe.7 for ; Wed, 04 Jul 2018 16:46:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=tiu/a+pJNIzC1SjoCa6/VJLnwSpxLhqJW5HUFI0QhT0=; b=aw6sjso8s1om4DlUoHkBGNDoJz9ABimO1xRbw4cAROjiPzGTnbFDxeERdn22dEHoOk 7NLMzxCeR7YEX+MsbdcYn14joL+zUS8VQWNCKyAytqEdHeevNVIeiO0oDHrsMHGrB3wt TT2vibxtUCN1WIn7vmD/Fl7nsijPvBWlvoZ9A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=tiu/a+pJNIzC1SjoCa6/VJLnwSpxLhqJW5HUFI0QhT0=; b=PRuI9kF2Y3uG2yg2FG+QIU7zyvyp3j5fHGQB6n0TtiDSk3qWh8++Iyj9ZdsRjxrFk0 dwQ2SSwEgJG4c1HFeSa41s3yx5GqaBMvEt/Att6AmBZn5Iy20IKJ+o+xSo3kDvGxUh3N PArV/2UjZyBem9dEwE+ts5X/kkvy4snxVRIMf9dmw7PFL0rKzINPH7ygSke2sUvp/uki ayHTghZWu7ja8P5Ut40A2zQyvtb5fxPaKWE0eksKleQjDmm2BVszMjwRujcAmlCnD6a/ +12ffPzfW1RChDmT3oeQdQw2/2XfVbc2Z5cCDUVWRrevmveRListBYP2Apn8Xa+JdnkO o+DA== X-Gm-Message-State: APt69E1lVfLiO9slkcejzw3cyzSmHD73e0FBWU2le92xRhAnZR/W6+yp CLRnmHt8KeKikx8XssSNsQt8Xg== X-Google-Smtp-Source: AAOMgpeQLmm3hfDDYGghCS5KI8J9KqTRWUJiIlH1tmeGEToK2T3N318LVw8siNDjzkafwcWJtPJxjg== X-Received: by 2002:a63:a1a:: with SMTP id 26-v6mr3487960pgk.221.1530747997163; Wed, 04 Jul 2018 16:46:37 -0700 (PDT) Received: from monster-08.mvlab.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id r16-v6sm2682896pfe.173.2018.07.04.16.46.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Jul 2018 16:46:36 -0700 (PDT) From: Roopa Prabhu X-Google-Original-From: Roopa Prabhu To: davem@davemloft.net Cc: netdev@vger.kernel.org, jbenc@redhat.com, mike.rapoport@ravellosystems.com, stephen@networkplumber.org Subject: [PATCH net-next 1/4] rtnetlink: add rtnl_link_state check in rtnl_configure_link Date: Wed, 4 Jul 2018 16:46:29 -0700 Message-Id: <1530747992-15878-2-git-send-email-roopa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1530747992-15878-1-git-send-email-roopa@cumulusnetworks.com> References: <1530747992-15878-1-git-send-email-roopa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Roopa Prabhu rtnl_configure_link sets dev->rtnl_link_state to RTNL_LINK_INITIALIZED and unconditionally calls __dev_notify_flags to notify user-space of dev flags. current call sequence for rtnl_configure_link rtnetlink_newlink rtnl_link_ops->newlink rtnl_configure_link (unconditionally notifies userspace of default and new dev flags) If a newlink handler wants to call rtnl_configure_link early, we will end up with duplicate notifications to user-space. This patch fixes rtnl_configure_link to check rtnl_link_state and call __dev_notify_flags with gchanges = 0 if already RTNL_LINK_INITIALIZED. Later in the series, this patch will help the following sequence where a driver implementing newlink can call rtnl_configure_link to initialize the link early. makes the following call sequence work: rtnetlink_newlink rtnl_link_ops->newlink (vxlan) -> rtnl_configure_link (initializes link and notifies user-space of default dev flags) rtnl_configure_link (updates dev flags if requested by user ifm and notifies user-space of new dev flags) Signed-off-by: Roopa Prabhu --- net/core/rtnetlink.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 5ef6122..e3f743c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -2759,9 +2759,12 @@ int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm) return err; } - dev->rtnl_link_state = RTNL_LINK_INITIALIZED; - - __dev_notify_flags(dev, old_flags, ~0U); + if (dev->rtnl_link_state == RTNL_LINK_INITIALIZED) { + __dev_notify_flags(dev, old_flags, 0U); + } else { + dev->rtnl_link_state = RTNL_LINK_INITIALIZED; + __dev_notify_flags(dev, old_flags, ~0U); + } return 0; } EXPORT_SYMBOL(rtnl_configure_link); From patchwork Wed Jul 4 23:46:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roopa Prabhu X-Patchwork-Id: 939607 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="ILmN8Jv4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Ld1v4JNzz9s29 for ; Thu, 5 Jul 2018 09:46:59 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753101AbeGDXqz (ORCPT ); Wed, 4 Jul 2018 19:46:55 -0400 Received: from mail-pf0-f196.google.com ([209.85.192.196]:44124 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752964AbeGDXqi (ORCPT ); Wed, 4 Jul 2018 19:46:38 -0400 Received: by mail-pf0-f196.google.com with SMTP id j3-v6so3697916pfh.11 for ; Wed, 04 Jul 2018 16:46:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=vLekRpJ0zmNfMA6qBc4rL4gF2tpB140cYhSLk0EZhJg=; b=ILmN8Jv4M8SQUqV8SnE6t0FY53X1d8UTO4AvyRbXB3YJsQw9ZgLENdJkKnZTt2i4wf uErnUCYZFluR6DpmEXnpxVPvL6j1TIiSYNwUJr094Lhw0NaHtFGeMJefCoO1Om8NqlUz 8AL40K0yIC3/OxcJXUrzEbCMNLLNwQFx6/P8Q= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=vLekRpJ0zmNfMA6qBc4rL4gF2tpB140cYhSLk0EZhJg=; b=DTINIaN2vNXQ3mhN0it2BGtLIltbm8VqT3YVj41pdvJKUpub7XgG4yv9GEunq/sJoS CBtF3iGb0dmCipfhuZ/Ly40gsuHfMKndwN5ebIUqXANa6iXYAu0DnuLXVZ7dMAGUnJlG 6uiey2qXyqRJ170VofXBSPbFqdKdIc63iqNnqSqeioBbHCI/MgsnZYoIhpG+dhJng6VN Cycbw0UBGXpnwFyDw1AQ1v1Ija19nJcn4NZS8ay+6Pnk2DO6Vqyl2/SiL1/XSNMuR4dK Jc5IqXXtK0PlOsm703/ehFNESn7L2aVjoa9SJ0xSAO/ShULtCI+kgsjWJZPzTV7TMAAC 1Qlw== X-Gm-Message-State: APt69E1DuObZIRsYyWhWh8ePTLcUzv0x81ERlm5sFsxcD4roseeIk+0m dYcOhZoebooWrVEg81upy5luFA== X-Google-Smtp-Source: AAOMgpcvRCmKpTtCOAo0PEW+7LGHMO4y/0oJsQK4w1RbCOAeLHIuos6qYnOkfjsuzyU0lqqYvwRWHg== X-Received: by 2002:a65:638a:: with SMTP id h10-v6mr3516268pgv.269.1530747998086; Wed, 04 Jul 2018 16:46:38 -0700 (PDT) Received: from monster-08.mvlab.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id r16-v6sm2682896pfe.173.2018.07.04.16.46.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Jul 2018 16:46:37 -0700 (PDT) From: Roopa Prabhu X-Google-Original-From: Roopa Prabhu To: davem@davemloft.net Cc: netdev@vger.kernel.org, jbenc@redhat.com, mike.rapoport@ravellosystems.com, stephen@networkplumber.org Subject: [PATCH net-next 2/4] vxlan: add new fdb alloc and create helpers Date: Wed, 4 Jul 2018 16:46:30 -0700 Message-Id: <1530747992-15878-3-git-send-email-roopa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1530747992-15878-1-git-send-email-roopa@cumulusnetworks.com> References: <1530747992-15878-1-git-send-email-roopa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Roopa Prabhu - Add new vxlan_fdb_alloc helper - rename existing vxlan_fdb_create into vxlan_fdb_update: because it really creates or updates an existing fdb entry - move new fdb creation into a separate vxlan_fdb_create Main motivation for this change is to introduce the ability to decouple vxlan fdb creation and notify, used in a later patch. Signed-off-by: Roopa Prabhu --- drivers/net/vxlan.c | 91 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 62 insertions(+), 29 deletions(-) diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 601ae17..aa88beb 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -637,9 +637,62 @@ static int vxlan_gro_complete(struct sock *sk, struct sk_buff *skb, int nhoff) return eth_gro_complete(skb, nhoff + sizeof(struct vxlanhdr)); } -/* Add new entry to forwarding table -- assumes lock held */ +static struct vxlan_fdb *vxlan_fdb_alloc(struct vxlan_dev *vxlan, + const u8 *mac, __u16 state, + __be32 src_vni, __u8 ndm_flags) +{ + struct vxlan_fdb *f; + + f = kmalloc(sizeof(*f), GFP_ATOMIC); + if (!f) + return NULL; + f->state = state; + f->flags = ndm_flags; + f->updated = f->used = jiffies; + f->vni = src_vni; + INIT_LIST_HEAD(&f->remotes); + memcpy(f->eth_addr, mac, ETH_ALEN); + + return f; +} + static int vxlan_fdb_create(struct vxlan_dev *vxlan, const u8 *mac, union vxlan_addr *ip, + __u16 state, __be16 port, __be32 src_vni, + __be32 vni, __u32 ifindex, __u8 ndm_flags, + struct vxlan_fdb **fdb) +{ + struct vxlan_rdst *rd = NULL; + struct vxlan_fdb *f; + int rc; + + if (vxlan->cfg.addrmax && + vxlan->addrcnt >= vxlan->cfg.addrmax) + return -ENOSPC; + + netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip); + f = vxlan_fdb_alloc(vxlan, mac, state, src_vni, ndm_flags); + if (!f) + return -ENOMEM; + + rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd); + if (rc < 0) { + kfree(f); + return rc; + } + + ++vxlan->addrcnt; + hlist_add_head_rcu(&f->hlist, + vxlan_fdb_head(vxlan, mac, src_vni)); + + *fdb = f; + + return 0; +} + +/* Add new entry to forwarding table -- assumes lock held */ +static int vxlan_fdb_update(struct vxlan_dev *vxlan, + const u8 *mac, union vxlan_addr *ip, __u16 state, __u16 flags, __be16 port, __be32 src_vni, __be32 vni, __u32 ifindex, __u8 ndm_flags) @@ -688,37 +741,17 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan, if (!(flags & NLM_F_CREATE)) return -ENOENT; - if (vxlan->cfg.addrmax && - vxlan->addrcnt >= vxlan->cfg.addrmax) - return -ENOSPC; - /* Disallow replace to add a multicast entry */ if ((flags & NLM_F_REPLACE) && (is_multicast_ether_addr(mac) || is_zero_ether_addr(mac))) return -EOPNOTSUPP; netdev_dbg(vxlan->dev, "add %pM -> %pIS\n", mac, ip); - f = kmalloc(sizeof(*f), GFP_ATOMIC); - if (!f) - return -ENOMEM; - - notify = 1; - f->state = state; - f->flags = ndm_flags; - f->updated = f->used = jiffies; - f->vni = src_vni; - INIT_LIST_HEAD(&f->remotes); - memcpy(f->eth_addr, mac, ETH_ALEN); - - rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd); - if (rc < 0) { - kfree(f); + rc = vxlan_fdb_create(vxlan, mac, ip, state, port, src_vni, + vni, ifindex, ndm_flags, &f); + if (rc < 0) return rc; - } - - ++vxlan->addrcnt; - hlist_add_head_rcu(&f->hlist, - vxlan_fdb_head(vxlan, mac, src_vni)); + notify = 1; } if (notify) { @@ -864,7 +897,7 @@ static int vxlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], return -EAFNOSUPPORT; spin_lock_bh(&vxlan->hash_lock); - err = vxlan_fdb_create(vxlan, addr, &ip, ndm->ndm_state, flags, + err = vxlan_fdb_update(vxlan, addr, &ip, ndm->ndm_state, flags, port, src_vni, vni, ifindex, ndm->ndm_flags); spin_unlock_bh(&vxlan->hash_lock); @@ -1007,7 +1040,7 @@ static bool vxlan_snoop(struct net_device *dev, /* close off race between vxlan_flush and incoming packets */ if (netif_running(dev)) - vxlan_fdb_create(vxlan, src_mac, src_ip, + vxlan_fdb_update(vxlan, src_mac, src_ip, NUD_REACHABLE, NLM_F_EXCL|NLM_F_CREATE, vxlan->cfg.dst_port, @@ -3172,7 +3205,7 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, /* create an fdb entry for a valid default destination */ if (!vxlan_addr_any(&vxlan->default_dst.remote_ip)) { - err = vxlan_fdb_create(vxlan, all_zeros_mac, + err = vxlan_fdb_update(vxlan, all_zeros_mac, &vxlan->default_dst.remote_ip, NUD_REACHABLE | NUD_PERMANENT, NLM_F_EXCL | NLM_F_CREATE, @@ -3452,7 +3485,7 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], old_dst.remote_ifindex, 0); if (!vxlan_addr_any(&dst->remote_ip)) { - err = vxlan_fdb_create(vxlan, all_zeros_mac, + err = vxlan_fdb_update(vxlan, all_zeros_mac, &dst->remote_ip, NUD_REACHABLE | NUD_PERMANENT, NLM_F_CREATE | NLM_F_APPEND, From patchwork Wed Jul 4 23:46:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roopa Prabhu X-Patchwork-Id: 939605 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="O38PMhTn"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Ld1j5X0Fz9s2g for ; Thu, 5 Jul 2018 09:46:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753015AbeGDXql (ORCPT ); Wed, 4 Jul 2018 19:46:41 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:36346 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752970AbeGDXqj (ORCPT ); Wed, 4 Jul 2018 19:46:39 -0400 Received: by mail-pf0-f195.google.com with SMTP id u16-v6so3708065pfh.3 for ; Wed, 04 Jul 2018 16:46:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2kIjIBdSTiM+oMsF+YUqxhK7f4e3qY+iQ/tX1DK74rY=; b=O38PMhTn9lsOBiBSiaQI6g9IXb+3UR3QpbK7uwG0aVJyDks/ZD/v8JNDjtfXEWgsi0 mhUHcxMBceGYuBNxozy5XLno6dkY9i2AkpGhmxuv9PPmxaYuE/tR4XowqNEp47Pu+Kkz 8qIdOjpGXNfim2Ts8Gd4q+1Zi9wetATnIcb30= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2kIjIBdSTiM+oMsF+YUqxhK7f4e3qY+iQ/tX1DK74rY=; b=d9KzFvVO0pXfkOm8XqHZkjXykX54H/aP4DTGRk7PQiJ4O2OsEM7uwqJ6jHPk+xPNqX eS53kWUSq2a+VNEj36bhMlGqYTKB8GGnhcwh3UubMhWrTNsJijCKQrHMLhhksS+ImlCj XggoSSGbIC2NrCVmFgbKVkpnRgb+q2Ldw7lxbrowgEhL1STizW0TBO3nVssCu5a+yZvY yd9G8s5GtYkdS9My0lE7FNAYcE7lnyiF7HeJrjxyG4cKMhXNLJtd6CWcodzzQcmPe0Zm JH39HNFFTI4zja/deCZ8kHTnO+BBIXqj32q9WZY3SrlG/PfBlGTia8rOfTJry+GQax9y OqPg== X-Gm-Message-State: APt69E0T25Dhiiin1iz1psP/OffhPP8+93Mt+aXmIodMvAW0KYN+xLer 8Ol6vNaOfUWdpcnP9HADXhdHpg== X-Google-Smtp-Source: AAOMgpfJxOD+0XlEkpLV9RFo+CRCQcoaaNsM6UEa7oyL0Hps0ICwjiSSMJxD/x2wPFmeV3eYZHctIw== X-Received: by 2002:a65:60d2:: with SMTP id r18-v6mr3505441pgv.306.1530747999020; Wed, 04 Jul 2018 16:46:39 -0700 (PDT) Received: from monster-08.mvlab.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id r16-v6sm2682896pfe.173.2018.07.04.16.46.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Jul 2018 16:46:38 -0700 (PDT) From: Roopa Prabhu X-Google-Original-From: Roopa Prabhu To: davem@davemloft.net Cc: netdev@vger.kernel.org, jbenc@redhat.com, mike.rapoport@ravellosystems.com, stephen@networkplumber.org Subject: [PATCH net-next 3/4] vxlan: make netlink notify in vxlan_fdb_destroy optional Date: Wed, 4 Jul 2018 16:46:31 -0700 Message-Id: <1530747992-15878-4-git-send-email-roopa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1530747992-15878-1-git-send-email-roopa@cumulusnetworks.com> References: <1530747992-15878-1-git-send-email-roopa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Roopa Prabhu Add a new option do_notify to vxlan_fdb_destroy to make sending netlink notify optional. Used by a later patch. Signed-off-by: Roopa Prabhu --- drivers/net/vxlan.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index aa88beb..794a9a7 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -775,13 +775,15 @@ static void vxlan_fdb_free(struct rcu_head *head) kfree(f); } -static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f) +static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f, + bool do_notify) { netdev_dbg(vxlan->dev, "delete %pM\n", f->eth_addr); --vxlan->addrcnt; - vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_DELNEIGH); + if (do_notify) + vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_DELNEIGH); hlist_del_rcu(&f->hlist); call_rcu(&f->rcu, vxlan_fdb_free); @@ -931,7 +933,7 @@ static int __vxlan_fdb_delete(struct vxlan_dev *vxlan, goto out; } - vxlan_fdb_destroy(vxlan, f); + vxlan_fdb_destroy(vxlan, f, true); out: return 0; @@ -2399,7 +2401,7 @@ static void vxlan_cleanup(struct timer_list *t) "garbage collect %pM\n", f->eth_addr); f->state = NUD_STALE; - vxlan_fdb_destroy(vxlan, f); + vxlan_fdb_destroy(vxlan, f, true); } else if (time_before(timeout, next_timer)) next_timer = timeout; } @@ -2450,7 +2452,7 @@ static void vxlan_fdb_delete_default(struct vxlan_dev *vxlan, __be32 vni) spin_lock_bh(&vxlan->hash_lock); f = __vxlan_find_mac(vxlan, all_zeros_mac, vni); if (f) - vxlan_fdb_destroy(vxlan, f); + vxlan_fdb_destroy(vxlan, f, true); spin_unlock_bh(&vxlan->hash_lock); } @@ -2504,7 +2506,7 @@ static void vxlan_flush(struct vxlan_dev *vxlan, bool do_all) continue; /* the all_zeros_mac entry is deleted at vxlan_uninit */ if (!is_zero_ether_addr(f->eth_addr)) - vxlan_fdb_destroy(vxlan, f); + vxlan_fdb_destroy(vxlan, f, true); } } spin_unlock_bh(&vxlan->hash_lock); From patchwork Wed Jul 4 23:46:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roopa Prabhu X-Patchwork-Id: 939606 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=cumulusnetworks.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="O1Hhjzds"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 41Ld1l2sxTz9s29 for ; Thu, 5 Jul 2018 09:46:51 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753063AbeGDXqr (ORCPT ); Wed, 4 Jul 2018 19:46:47 -0400 Received: from mail-pf0-f195.google.com ([209.85.192.195]:46108 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753000AbeGDXqk (ORCPT ); Wed, 4 Jul 2018 19:46:40 -0400 Received: by mail-pf0-f195.google.com with SMTP id l123-v6so3706254pfl.13 for ; Wed, 04 Jul 2018 16:46:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xm6njghN30HfHqo4OD80R2tGZHU58KyBk4Yb+cSNYDc=; b=O1HhjzdsQ7sw3rlJMBd6uj7uOHWPR3ZJLOMA2CciuiK7iynbOJoRG5N45uM1ZuXw4r mD85iftdszndXFYx5RY/q/GFH//OqXpSYBq4iQ5uo+C8UT8LZDEe0q7BTb7xlscSALc2 g2k04DcE3zVHjwHQXUmL0NkcGqQFzn3LFr6mc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xm6njghN30HfHqo4OD80R2tGZHU58KyBk4Yb+cSNYDc=; b=RXsHfTFycCLQD706IWaPV21wFToea9dSZz739tXUJ628em+5CB+SP4qp09PRd1LLZb ooQ6LugJnkknPfYUvewDiG6rXk2Gj7CG05DwaXiv5RIG06DAzPmngAo6oJ/6zOTv55xP 4BsgMdfM2DLiY8fDxx+IBxuW1o5eW1LrKr/XZeEwpslxg6hNt6AwDFINpzVvBUdls78R ZoOuH5juQ1MuPW66gKTXzYhlU4A+lEGpE1WVFXp84YszMEUNMiwp+mUVPMDKbN6/UgEq XhZyAk9bpWykYs2JKd50M7sTJzVKIDLIhVm64/3wH+W5RgE2KVMn9Ti3370H6Rcmv8Wl zcvw== X-Gm-Message-State: APt69E2+NAab4o5/mQfPwCKJ/41EOSYKHNorhI0h6mDH6Lvfeb7phXEy 4q7X3E3QbJVy3wLgzZaWmgYt8TlV X-Google-Smtp-Source: AAOMgpcxeq0V+YwEmJ0ibN1Y5PKjH/9kQctmHjyf9NRZwFT21x+v/ugR5jNdjiBJyWW8NCcmFSHk+w== X-Received: by 2002:a62:864a:: with SMTP id x71-v6mr4036527pfd.252.1530747999955; Wed, 04 Jul 2018 16:46:39 -0700 (PDT) Received: from monster-08.mvlab.cumulusnetworks.com. (fw.cumulusnetworks.com. [216.129.126.126]) by smtp.googlemail.com with ESMTPSA id r16-v6sm2682896pfe.173.2018.07.04.16.46.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 Jul 2018 16:46:39 -0700 (PDT) From: Roopa Prabhu X-Google-Original-From: Roopa Prabhu To: davem@davemloft.net Cc: netdev@vger.kernel.org, jbenc@redhat.com, mike.rapoport@ravellosystems.com, stephen@networkplumber.org Subject: [PATCH net-next 4/4] vxlan: fix default fdb entry netlink notify ordering during netdev create Date: Wed, 4 Jul 2018 16:46:32 -0700 Message-Id: <1530747992-15878-5-git-send-email-roopa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1530747992-15878-1-git-send-email-roopa@cumulusnetworks.com> References: <1530747992-15878-1-git-send-email-roopa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Roopa Prabhu Problem: In vxlan_newlink, a default fdb entry is added before register_netdev. The default fdb creation function also notifies user-space of the fdb entry on the vxlan device which user-space does not know about yet. (RTM_NEWNEIGH goes before RTM_NEWLINK for the same ifindex). This patch fixes the user-space netlink notification ordering issue with the following changes: - decouple fdb notify from fdb create. - Move fdb notify after register_netdev. - Call rtnl_configure_link in vxlan newlink handler to notify userspace about the newlink before fdb notify and hence avoiding the user-space race. Fixes: afbd8bae9c79 ("vxlan: add implicit fdb entry for default destination") Signed-off-by: Roopa Prabhu --- drivers/net/vxlan.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 794a9a7..ababba3 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -3197,6 +3197,7 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, { struct vxlan_net *vn = net_generic(net, vxlan_net_id); struct vxlan_dev *vxlan = netdev_priv(dev); + struct vxlan_fdb *f = NULL; int err; err = vxlan_dev_configure(net, dev, conf, false, extack); @@ -3207,27 +3208,38 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, /* create an fdb entry for a valid default destination */ if (!vxlan_addr_any(&vxlan->default_dst.remote_ip)) { - err = vxlan_fdb_update(vxlan, all_zeros_mac, + err = vxlan_fdb_create(vxlan, all_zeros_mac, &vxlan->default_dst.remote_ip, NUD_REACHABLE | NUD_PERMANENT, - NLM_F_EXCL | NLM_F_CREATE, vxlan->cfg.dst_port, vxlan->default_dst.remote_vni, vxlan->default_dst.remote_vni, vxlan->default_dst.remote_ifindex, - NTF_SELF); + NTF_SELF, &f); if (err) return err; } err = register_netdevice(dev); + if (err) + goto errout; + + err = rtnl_configure_link(dev, NULL); if (err) { - vxlan_fdb_delete_default(vxlan, vxlan->default_dst.remote_vni); - return err; + unregister_netdevice(dev); + goto errout; } + /* notify default fdb entry */ + if (f) + vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH); + list_add(&vxlan->next, &vn->vxlan_list); return 0; +errout: + if (f) + vxlan_fdb_destroy(vxlan, f, false); + return err; } static int vxlan_nl2conf(struct nlattr *tb[], struct nlattr *data[], @@ -3462,6 +3474,7 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], struct vxlan_rdst *dst = &vxlan->default_dst; struct vxlan_rdst old_dst; struct vxlan_config conf; + struct vxlan_fdb *f = NULL; int err; err = vxlan_nl2conf(tb, data, @@ -3487,19 +3500,19 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[], old_dst.remote_ifindex, 0); if (!vxlan_addr_any(&dst->remote_ip)) { - err = vxlan_fdb_update(vxlan, all_zeros_mac, + err = vxlan_fdb_create(vxlan, all_zeros_mac, &dst->remote_ip, NUD_REACHABLE | NUD_PERMANENT, - NLM_F_CREATE | NLM_F_APPEND, vxlan->cfg.dst_port, dst->remote_vni, dst->remote_vni, dst->remote_ifindex, - NTF_SELF); + NTF_SELF, &f); if (err) { spin_unlock_bh(&vxlan->hash_lock); return err; } + vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH); } spin_unlock_bh(&vxlan->hash_lock); }