From patchwork Wed Oct 24 22:10: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: 149505 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp560898ljp; Wed, 24 Oct 2018 15:11:20 -0700 (PDT) X-Google-Smtp-Source: AJdET5cxbYg2ajhWEskwx9dYZm5GNjoaRvcshdUHVVm8F9cSYRK7mHLqRMoab6pkIp25CoRx/Iy9 X-Received: by 2002:a17:902:9a44:: with SMTP id x4-v6mr4020972plv.121.1540419079699; Wed, 24 Oct 2018 15:11:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540419079; cv=none; d=google.com; s=arc-20160816; b=wNwbvl1JQj9O8qCgAaBJMMQ9D4wqzrr358jHzf+lh7X2CnWIBajfr8HAO8+rINJs4M f6jc7u2AbVM8WID8IC2pssf3utZG0JOJMn+Xo66TZTEo/lCpMATEsk3hu0dnzQoyF4+N rUudqRLWtRMXR6G2dGnoqseSKDFvhAtBhK2foAWWEr1Reu6cbnc+fq0yKie4Zo2ClgQe CtW8NMb7jTPCupziVVAfsZZgO9dBHwcfaiBNiCdZQbbDJX2AgIZu7EjQz+Sg0kmp7FlO 4BUpMnc1c4Z3KlKqZMpB/N0a0R4lUdkB1iAblGpWpJHekU8+mu6bQ6A+WMw1Y49BdgH5 95+A== 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=kt0ifiviCYm9e+arNneTDb/upc83BNkTvPy8eJnbc1A=; b=X/VAUUlW5YqRjyi6ghpkdd3D1l1B3GCqMULYaR+U+eYrt3idPP+9sIC2eiEPIDJ8oo cxrCUzPVkz3rPgTq6EbAWjjuZYb2HFTltoZfg7u+CIRldZDZp0XV14HDn3FUHx8D9Mku NFd8xvNBSIzPna77MCBZoqp0H9gZZspQtJg58iDh/yqUGpPvA000UigxK8lpBG3hjvW1 c4MDvpfP6b8SXkvjznYYOa7n+jDu3UFJoKa0/T8MxjHb4GMGP7BU2/ep4gznGMNcRykV vdtQN/N8OY3xruVplsxQoKo2LJmnlZ6NoY0Y70Rteq1ssKAI8A/HdcEjDDgUpuoy5goq 92zA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ggodCmSy; 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 e32-v6si6012599plb.309.2018.10.24.15.11.19; Wed, 24 Oct 2018 15:11:19 -0700 (PDT) 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=ggodCmSy; 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 S1727221AbeJYGlI (ORCPT + 10 others); Thu, 25 Oct 2018 02:41:08 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:43149 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725829AbeJYGlH (ORCPT ); Thu, 25 Oct 2018 02:41:07 -0400 Received: by mail-lf1-f65.google.com with SMTP id p34-v6so5196395lfg.10 for ; Wed, 24 Oct 2018 15:11:15 -0700 (PDT) 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=kt0ifiviCYm9e+arNneTDb/upc83BNkTvPy8eJnbc1A=; b=ggodCmSyrpsvTrMb5CjscBt0YsKysH+YCtsFI/jgJVBzUDXK2BPABys6p8rLaw0i2p aVqW20qx6zqgqdUjnGTxhIaHhaRXcP9YIP74tW8Tt/c4akq5mmCUZGsfZTjfADXyQyxQ 6G3hGh+dTm83w3pV9VJL+U8KALfm8X2QtQIAk= 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=kt0ifiviCYm9e+arNneTDb/upc83BNkTvPy8eJnbc1A=; b=jPu2HdKcUZjjtmlU4H0DwUoUrQCiTtu8wtlusmz4AirZVk/4u13rN999AQMJpeP5rr 789YWvxvLMBhBfrGcErEuRM/JecK1WuoRRThHKPuC9etHCZ33kKhsHvAAL0fJYPd/LS8 FQ6UIquof1Kw2nJjsKIQhELpgsNKsIXfRrAeeAdtZwTWwpAcCLwF8vddJ/JyoGDPccjp Es4xCQXGiQ8wa2vQi1NJhkDvoSoDRgBYvPYmRxmd1ELk72cpedwTXoJ9AtkLkudq2tAZ 2TLehZw4abGXtn9hNEdMxn1mFdRyDSkDIryUARz/fYh8uJ6onGUJ9Qr6foBJ4qVla78V Ud/w== X-Gm-Message-State: AGRZ1gLZyVfeOyZ6YNdnsDijiY6H5F54SlCsYZVQ86sl9PqQQYeS43Xy v2SOEGnBbWf2vjGBufyaS+GBTQ== X-Received: by 2002:a19:d824:: with SMTP id p36-v6mr73317lfg.23.1540419074714; Wed, 24 Oct 2018 15:11:14 -0700 (PDT) Received: from localhost.localdomain (59-201-94-178.pool.ukrtel.net. [178.94.201.59]) by smtp.gmail.com with ESMTPSA id f19-v6sm835350ljc.31.2018.10.24.15.11.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Oct 2018 15:11:13 -0700 (PDT) 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 net-next 2/4] net: 8021q: vlan_core: allow use list of vlans for real device Date: Thu, 25 Oct 2018 01:10:57 +0300 Message-Id: <20181024221059.21834-3-ivan.khoronzhuk@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20181024221059.21834-1-ivan.khoronzhuk@linaro.org> References: <20181024221059.21834-1-ivan.khoronzhuk@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org It's redundancy for the drivers to hold the list of vlans when absolutely the same list exists in vlan core. In most cases it's needed only to traverse the vlan devices, their vids and sync some settings with h/w, so add API to simplify this. At least some of these drivers also can benefit: grep "for_each.*vid" -r drivers/net/ethernet/ drivers/net/ethernet/hisilicon/hns3/hns3_enet.c: drivers/net/ethernet/synopsys/dwc-xlgmac-hw.c: drivers/net/ethernet/qlogic/qlge/qlge_main.c: drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c: drivers/net/ethernet/via/via-rhine.c: drivers/net/ethernet/via/via-velocity.c: drivers/net/ethernet/intel/igb/igb_main.c: drivers/net/ethernet/intel/ice/ice_main.c: drivers/net/ethernet/intel/e1000/e1000_main.c: drivers/net/ethernet/intel/i40e/i40e_main.c: drivers/net/ethernet/intel/e1000e/netdev.c: drivers/net/ethernet/intel/igbvf/netdev.c: drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c: drivers/net/ethernet/intel/ixgb/ixgb_main.c: drivers/net/ethernet/intel/ixgbe/ixgbe_main.c: drivers/net/ethernet/amd/xgbe/xgbe-dev.c: drivers/net/ethernet/emulex/benet/be_main.c: drivers/net/ethernet/neterion/vxge/vxge-main.c: drivers/net/ethernet/adaptec/starfire.c: drivers/net/ethernet/brocade/bna/bnad.c: Reviewed-by: Grygorii Strashko Signed-off-by: Ivan Khoronzhuk --- include/linux/if_vlan.h | 11 +++++++++++ net/8021q/vlan_core.c | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) -- 2.17.1 diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 83ea4df6ab81..410a14cd856c 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h @@ -133,6 +133,9 @@ struct vlan_pcpu_stats { extern struct net_device *__vlan_find_dev_deep_rcu(struct net_device *real_dev, __be16 vlan_proto, u16 vlan_id); +extern int vlan_for_each(struct net_device *dev, + int (*action)(struct net_device *dev, int vid, + void *arg), void *arg); extern struct net_device *vlan_dev_real_dev(const struct net_device *dev); extern u16 vlan_dev_vlan_id(const struct net_device *dev); extern __be16 vlan_dev_vlan_proto(const struct net_device *dev); @@ -236,6 +239,14 @@ __vlan_find_dev_deep_rcu(struct net_device *real_dev, return NULL; } +static inline int +vlan_for_each(struct net_device *dev, + int (*action)(struct net_device *dev, int vid, void *arg), + void *arg) +{ + return 0; +} + static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev) { BUG(); diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 4f60e86f4b8d..6308b5427a66 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c @@ -223,6 +223,33 @@ static int vlan_kill_rx_filter_info(struct net_device *dev, __be16 proto, u16 vi return -ENODEV; } +int vlan_for_each(struct net_device *dev, + int (*action)(struct net_device *dev, int vid, void *arg), + void *arg) +{ + struct vlan_vid_info *vid_info; + struct vlan_info *vlan_info; + struct net_device *vdev; + int ret; + + ASSERT_RTNL(); + + vlan_info = rtnl_dereference(dev->vlan_info); + if (!vlan_info) + return 0; + + list_for_each_entry(vid_info, &vlan_info->vid_list, list) { + vdev = vlan_group_get_device(&vlan_info->grp, vid_info->proto, + vid_info->vid); + ret = action(vdev, vid_info->vid, arg); + if (ret) + return ret; + } + + return 0; +} +EXPORT_SYMBOL(vlan_for_each); + int vlan_filter_push_vids(struct vlan_info *vlan_info, __be16 proto) { struct net_device *real_dev = vlan_info->real_dev;