From patchwork Thu Nov 8 20:27:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Khoronzhuk X-Patchwork-Id: 150593 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp1307169ljp; Thu, 8 Nov 2018 12:31:04 -0800 (PST) X-Google-Smtp-Source: AJdET5fx8dfrCcVud2DWJ4lgmJKj/87/uI5GnqdWraUyb5RneWFNlFkJohVqYtjRxPK6q+KY7pV5 X-Received: by 2002:a17:902:c7:: with SMTP id a65-v6mr6113579pla.296.1541709064420; Thu, 08 Nov 2018 12:31:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541709064; cv=none; d=google.com; s=arc-20160816; b=c/zSqnibuYWjcs9kAz/im4mQm1LaVT2TTCSnup0jJ/WNLUZSG95wG8CvGYPqoyYTDK l4VSipc6e+CRHusQ18pO5cAP7qNw3tthj4wVMDQIKz0qNtj1wTafI2n7pumT9zopFIoz vI5aExs8F2RElWNxUWwcmFWWjdENxFBzzwXf8rCoJtxsqQWH6qtnZbyYS+qFyiiUCE84 qzVnScBhZUBrmBbCFFKoFPuc/CZiOfWhVJTRaK9WMg42oUrTcw+gD066IfzpUFhmZ8hp G+BUiiJhWWdq7Cnd9pQk+MHtIc6KLnYGkK3mDVcF/LUhTWtcfvlbcjLQfVzgo3Lc4emx 9bqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=j6h7cGyTcDwoxdKOJu25q1JmarscrLLy/bea2IWaKVw=; b=R3Fm3J47kk6SHvKF/HE1uyclT6qtAVaDbJsHC2NVBf2XcqPFJN+08tQrDvvSlk56Y8 PlT42Yhtw5jhrXtv+F/pfnyyEMm0h69iwu60JpdGpLrqt6kYd2Ph856i3CCFi3Dv/KAs ma0NUcOzO1SO3jkMqhsKG9lboHMEJufVL/2zIE19dAuzoYo5u9Rxd/T0o9d094WSDRZD xvyq1ZC4mZduJXdt3kYUURPsRfRpxo01oFzYRz328TLwFw/QqtKW4ThskU+bS1XTh4e+ CROvHvd7d4nUbPej9m5g8ywub7X1wo/fgxX1A1su0gMORQllFUR2+OePVdXXJ76Ms6I9 v8tw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=fdwgnrsk; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y19-v6si5259530pll.117.2018.11.08.12.31.04; Thu, 08 Nov 2018 12:31:04 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=fdwgnrsk; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727311AbeKIGII (ORCPT + 10 others); Fri, 9 Nov 2018 01:08:08 -0500 Received: from mail-lj1-f193.google.com ([209.85.208.193]:38577 "EHLO mail-lj1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726962AbeKIGIH (ORCPT ); Fri, 9 Nov 2018 01:08:07 -0500 Received: by mail-lj1-f193.google.com with SMTP id q186-v6so19202891ljb.5 for ; Thu, 08 Nov 2018 12:30:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=j6h7cGyTcDwoxdKOJu25q1JmarscrLLy/bea2IWaKVw=; b=fdwgnrskFVFXQdC2Zsbdp+Y2cJu2gQPi4Y00LnERc5nmYMzNIkNHhdc5nVvDTkvJvP dDd9NE7D0UkJ9TQz6oEiK2HxxA7NOa8iAZtfSh34zlFGyAZGWQOQRtSTze/BM9Jx49dp ajZDzZsnhZPySHp2CZG8UdMVDLZTJM8UXb0HI= 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=j6h7cGyTcDwoxdKOJu25q1JmarscrLLy/bea2IWaKVw=; b=eeITHVC96rSXpTpBz6/nmOOjDKtWa2DC+FjsO4pLfIn8AEo5wViOThXCe29RhxU1oc OMSDC25URIqW322ghiSaO+Gy/YUIQi1DVV/RwHjHI+dqrWEPy2Fg/pU4dG3MxUSzVij5 XHDXWLUmIAA2yLWsRtbRcOlIslXAg/Oe+0VVHq6Gqwaku2xYVttyyw5JJitdf6L0UsOq qTyofzSpTlf3pnyXvXnVhP0NdMmQxCLFg3SHEH6djzU7ccz4DVBYyQ3fa3BKM4dqnat4 ODVw0od3BNmd6x/1DGa2+KLTyBDmcbnXI4qB+s3zDpG/XFxxfMLpvUApHBcrJkK0ACp6 6M6A== X-Gm-Message-State: AGRZ1gK1dsugIDwtcoIPEKUIsGjjP4Ivrn9GuFUDyJxBfUwTg0H2aCh9 M31Ko6tkeifRlu4nQwMjQ8QoNw== X-Received: by 2002:a2e:9c59:: with SMTP id t25-v6mr4152333ljj.107.1541709058001; Thu, 08 Nov 2018 12:30:58 -0800 (PST) Received: from localhost.localdomain (59-201-94-178.pool.ukrtel.net. [178.94.201.59]) by smtp.gmail.com with ESMTPSA id w9sm809250lfc.66.2018.11.08.12.30.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Nov 2018 12:30:57 -0800 (PST) From: Ivan Khoronzhuk To: grygorii.strashko@ti.com, davem@davemloft.net Cc: linux-omap@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alexander.h.duyck@intel.com, bjorn@mork.no, Ivan Khoronzhuk Subject: [PATCH v2 net-next 1/4] net: core: dev_addr_lists: add auxiliary func to handle reference address updates Date: Thu, 8 Nov 2018 22:27:54 +0200 Message-Id: <20181108202757.30110-2-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181108202757.30110-1-ivan.khoronzhuk@linaro.org> References: <20181108202757.30110-1-ivan.khoronzhuk@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In order to avoid all table update, and only remove or add new address, the auxiliary function exists, named __hw_addr_sync_dev(). It allows end driver do nothing when nothing changed and add/rm when concrete address is firstly added or lastly removed. But it doesn't include cases when an address of real device or vlan was reused by other vlans or vlan/macval devices. For handaling events when address was reused/unreused the patch adds new auxiliary routine - __hw_addr_ref_sync_dev(). It allows to do nothing when nothing was changed and do updates only for an address being added/reused/deleted/unreused. Thus, clone address changes for vlans can be mirrored in the table. The function is exclusive with __hw_addr_sync_dev(). It's responsibility of the end driver to identify address vlan device, if it needs so. Signed-off-by: Ivan Khoronzhuk --- include/linux/netdevice.h | 10 ++++ net/core/dev_addr_lists.c | 97 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) -- 2.17.1 diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 857f8abf7b91..487fa5e0e165 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -4068,6 +4068,16 @@ int __hw_addr_sync_dev(struct netdev_hw_addr_list *list, int (*sync)(struct net_device *, const unsigned char *), int (*unsync)(struct net_device *, const unsigned char *)); +int __hw_addr_ref_sync_dev(struct netdev_hw_addr_list *list, + struct net_device *dev, + int (*sync)(struct net_device *, + const unsigned char *, int), + int (*unsync)(struct net_device *, + const unsigned char *, int)); +void __hw_addr_ref_unsync_dev(struct netdev_hw_addr_list *list, + struct net_device *dev, + int (*unsync)(struct net_device *, + const unsigned char *, int)); void __hw_addr_unsync_dev(struct netdev_hw_addr_list *list, struct net_device *dev, int (*unsync)(struct net_device *, diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index d884d8f5f0e5..81a8cd4ea3bd 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -277,6 +277,103 @@ int __hw_addr_sync_dev(struct netdev_hw_addr_list *list, } EXPORT_SYMBOL(__hw_addr_sync_dev); +/** + * __hw_addr_ref_sync_dev - Synchronize device's multicast address list taking + * into account references + * @list: address list to synchronize + * @dev: device to sync + * @sync: function to call if address or reference on it should be added + * @unsync: function to call if address or some reference on it should removed + * + * This function is intended to be called from the ndo_set_rx_mode + * function of devices that require explicit address or references on it + * add/remove notifications. The unsync function may be NULL in which case + * the addresses or references on it requiring removal will simply be + * removed without any notification to the device. That is responsibility of + * the driver to identify and distribute address or references on it between + * internal address tables. + **/ +int __hw_addr_ref_sync_dev(struct netdev_hw_addr_list *list, + struct net_device *dev, + int (*sync)(struct net_device *, + const unsigned char *, int), + int (*unsync)(struct net_device *, + const unsigned char *, int)) +{ + struct netdev_hw_addr *ha, *tmp; + int err, ref_cnt; + + /* first go through and flush out any unsynced/stale entries */ + list_for_each_entry_safe(ha, tmp, &list->list, list) { + /* sync if address is not used */ + if ((ha->sync_cnt << 1) <= ha->refcount) + continue; + + /* if fails defer unsyncing address */ + ref_cnt = ha->refcount - ha->sync_cnt; + if (unsync && unsync(dev, ha->addr, ref_cnt)) + continue; + + ha->refcount = (ref_cnt << 1) + 1; + ha->sync_cnt = ref_cnt; + __hw_addr_del_entry(list, ha, false, false); + } + + /* go through and sync updated/new entries to the list */ + list_for_each_entry_safe(ha, tmp, &list->list, list) { + /* sync if address added or reused */ + if ((ha->sync_cnt << 1) >= ha->refcount) + continue; + + ref_cnt = ha->refcount - ha->sync_cnt; + err = sync(dev, ha->addr, ref_cnt); + if (err) + return err; + + ha->refcount = ref_cnt << 1; + ha->sync_cnt = ref_cnt; + } + + return 0; +} +EXPORT_SYMBOL(__hw_addr_ref_sync_dev); + +/** + * __hw_addr_ref_unsync_dev - Remove synchronized addresses and references on + * it from device + * @list: address list to remove synchronized addresses (references on it) from + * @dev: device to sync + * @unsync: function to call if address and references on it should be removed + * + * Remove all addresses that were added to the device by + * __hw_addr_ref_sync_dev(). This function is intended to be called from the + * ndo_stop or ndo_open functions on devices that require explicit address (or + * references on it) add/remove notifications. If the unsync function pointer + * is NULL then this function can be used to just reset the sync_cnt for the + * addresses in the list. + **/ +void __hw_addr_ref_unsync_dev(struct netdev_hw_addr_list *list, + struct net_device *dev, + int (*unsync)(struct net_device *, + const unsigned char *, int)) +{ + struct netdev_hw_addr *ha, *tmp; + + list_for_each_entry_safe(ha, tmp, &list->list, list) { + if (!ha->sync_cnt) + continue; + + /* if fails defer unsyncing address */ + if (unsync && unsync(dev, ha->addr, ha->sync_cnt)) + continue; + + ha->refcount -= ha->sync_cnt - 1; + ha->sync_cnt = 0; + __hw_addr_del_entry(list, ha, false, false); + } +} +EXPORT_SYMBOL(__hw_addr_ref_unsync_dev); + /** * __hw_addr_unsync_dev - Remove synchronized addresses from device * @list: address list to remove synchronized addresses from From patchwork Thu Nov 8 20:27:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Khoronzhuk X-Patchwork-Id: 150596 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp1307344ljp; Thu, 8 Nov 2018 12:31:13 -0800 (PST) X-Google-Smtp-Source: AJdET5cxf6zXChUVKR3Hw0IBigMdyIWuwuW3il/H3blm2Uo6gaJmDnDgfIxqrs9XFZOVcN2lXQQD X-Received: by 2002:a17:902:b03:: with SMTP id 3-v6mr6032348plq.233.1541709073122; Thu, 08 Nov 2018 12:31:13 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541709073; cv=none; d=google.com; s=arc-20160816; b=be7L7x/ZHXg42egh95OipVof+sy2f3C0d/zCLXMKpTqQc6NtCzdxTucNyuD6VEFymg tDoJhWwM6XXXENXbl4+gcptANcpSo48Re/JmjJDyDerCDWzHhJhA6IrHvZew453Votcr vjAe2uE7L6Mi6O1gGs0RJQrWg3kWEnJ3+3XganHS7/tZDg6SlraWKkOmN5E/zKHEU8s5 TV1fS2qbQ8T4/3FPmA+QeVsofxqvH5P20pd+iGSRrIAZpf/3OM1mVy7stY9h5TQKT2Jy vx9MBW2YQ1ZaeylTGk22HUhYpKgIFIfbBFyzj54ykIsO2gJK2V/geO+GHu7c6XIGQdvN 5LJQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=dJ21MFheqMtGC0GP2Ri/IKr1RXrXmw8gJIrPZPUwV48=; b=Sm27BYgssha9rIuDDhAlRQ8e8a8GK6iKNKcZ6IRUhlF9h4+dBn1nqwFKjN3KO9my1p nKnaiRXySJ385qiezS7AmE7dODHf6iW3dM3rw/84ij3Sli4TjyoO/KEEYe/GENmk1d+y y5y6VXueITkHWtT3B5H0rqZ/4l4LKgVJ2BMyiMQmvxuwv5Jm4lQZGrV2Yg/z1AbxPDGE B6tjaoebYzb1ROnC7/FCcvvIHDGwhyzyio1tqLZ/9h+saYDIqKl9IcG3ud3GIxKAilV0 3B3yi15dErRxSYKChHBm0Xi/3XQyKr8mrTL2mmeFyEGxQo/H8nNKOapiCTLVFyshYbky G4CQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Dw3rPxBi; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a6-v6si5586158pln.78.2018.11.08.12.31.12; Thu, 08 Nov 2018 12:31:13 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Dw3rPxBi; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727406AbeKIGIM (ORCPT + 10 others); Fri, 9 Nov 2018 01:08:12 -0500 Received: from mail-lj1-f193.google.com ([209.85.208.193]:35381 "EHLO mail-lj1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727325AbeKIGIL (ORCPT ); Fri, 9 Nov 2018 01:08:11 -0500 Received: by mail-lj1-f193.google.com with SMTP id x85-v6so19226192ljb.2 for ; Thu, 08 Nov 2018 12:31:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dJ21MFheqMtGC0GP2Ri/IKr1RXrXmw8gJIrPZPUwV48=; b=Dw3rPxBiETf1OwrXIWVr1CKTjQCoEq+y9ZtYnMuSqIaqrFOfSCxGvVTrGv7Z1sCD4/ m55iGr9ygEsGTpYgcl1nTL/BdnJMy8xMuVcPe/Bl1dTFIyDctu44hqNd8yILxr14cE6n gShHhNL3x+OhAI9iObgwRZObiDPLaPiwqQUI4= 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=dJ21MFheqMtGC0GP2Ri/IKr1RXrXmw8gJIrPZPUwV48=; b=Qw020/p+nrZd34QPXLU6xUTwFT4bXbXarktWj2qOvytnacdrmjywEe2lnsmUDJe62x jmvoujOXbOGi4sgJJb1ItIJcLxkJfS46XvKHRy6WT3820kES5XWkXs+Sqe8bGa4lXKyK 7uRxuaAMaKFJ3IUCLHYOODO2aEQefX9hPzOUEF2z1HrNowG3nIHj5XV88JFf2SXnOUBr r7HL9BZpcU1HUaCJ3poHma30R+Wn+mHRZGNhrIciMbWPE7T6hzjy3rcHgtoIBVnu5alj v8Hx+PpNonYdIkoZeFfJQmJqFgkFSPMPgpvFPqL2e5P1QzTZexfu83IV0VgyAYHpiIeH xLXw== X-Gm-Message-State: AGRZ1gIfGIp/MdeiVaYYFpDqsnjvuU1XD67bJ2tiiDl/QHZdY0ThcwWm T88rq+xaBxrNE4ceUJ6GO551CA== X-Received: by 2002:a2e:8989:: with SMTP id c9-v6mr343251lji.124.1541709062298; Thu, 08 Nov 2018 12:31:02 -0800 (PST) Received: from localhost.localdomain (59-201-94-178.pool.ukrtel.net. [178.94.201.59]) by smtp.gmail.com with ESMTPSA id w9sm809250lfc.66.2018.11.08.12.31.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Nov 2018 12:31:01 -0800 (PST) From: Ivan Khoronzhuk To: grygorii.strashko@ti.com, davem@davemloft.net Cc: linux-omap@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alexander.h.duyck@intel.com, bjorn@mork.no, Ivan Khoronzhuk Subject: [PATCH v2 net-next 4/4] net: ethernet: ti: cpsw: fix vlan configuration while down/up Date: Thu, 8 Nov 2018 22:27:57 +0200 Message-Id: <20181108202757.30110-5-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181108202757.30110-1-ivan.khoronzhuk@linaro.org> References: <20181108202757.30110-1-ivan.khoronzhuk@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The vlan configuration is not restored after interface donw/up sequence (if dual-emac - both interfaces). Tested on am572x EVM. Steps to check: ~# ip link add link eth1 name eth1.100 type vlan id 100 ~# ifconfig eth0 down ~# ifconfig eth1 down Try to remove vid and observe warning: ~# ip link del eth1.100 [ 739.526757] net eth1: removing vlanid 100 from vlan filter [ 739.533322] failed to kill vid 0081/100 for device eth1 This patch fixes it, restoring only vlan ALE entries and all other unicast/multicast entries are restored by system calling rx_mode ndo. Reviewed-by: Grygorii Strashko Signed-off-by: Ivan Khoronzhuk --- drivers/net/ethernet/ti/cpsw.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) -- 2.17.1 diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 0b18634d336c..9434fd5a5477 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c @@ -565,6 +565,9 @@ static const struct cpsw_stats cpsw_gstrings_ch_stats[] = { (func)(slave++, ##arg); \ } while (0) +static int cpsw_ndo_vlan_rx_add_vid(struct net_device *ndev, + __be16 proto, u16 vid); + static inline int cpsw_get_slave_port(u32 slave_num) { return slave_num + 1; @@ -1951,9 +1954,23 @@ static void cpsw_mqprio_resume(struct cpsw_slave *slave, struct cpsw_priv *priv) slave_write(slave, tx_prio_map, tx_prio_rg); } +static int cpsw_restore_vlans(struct net_device *vdev, int vid, void *arg) +{ + struct cpsw_priv *priv = arg; + + if (!vdev) + return 0; + + cpsw_ndo_vlan_rx_add_vid(priv->ndev, 0, vid); + return 0; +} + /* restore resources after port reset */ static void cpsw_restore(struct cpsw_priv *priv) { + /* restore vlan configurations */ + vlan_for_each(priv->ndev, cpsw_restore_vlans, priv); + /* restore MQPRIO offload */ for_each_slave(priv, cpsw_mqprio_resume, priv);