Received: by 2002:ac0:aa62:0:0:0:0:0 with SMTP id w31-v6csp1134987ima; Wed, 24 Oct 2018 15:12:34 -0700 (PDT) X-Google-Smtp-Source: AJdET5fj/DuCBYEXihjtb64jwr7RpwiZWY/RTo+PbhH6PtQklQ58rgCGAFeXGlb8mYoK6cT8m9b/ X-Received: by 2002:a63:b218:: with SMTP id x24mr3986912pge.223.1540419154872; Wed, 24 Oct 2018 15:12:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540419154; cv=none; d=google.com; s=arc-20160816; b=SgK1uwzAGpys3RHKpwimgi4tbOQjNKDbjm+cWLvR1yaxo5B0nKf7Y3KClrdU5W0HeD pW1BrFzb+zBowcy+8cQ0fj4xPc0qIZGpzNnpE5/YMAJWwH3AFgr04R+Ur2xWrWcI0Wzf XIsq5vr92z5pzVsmLmQVH3MfgsO5cfKG3KMEwzCteTYvi0uMasFszpRjW2y9bdW4tHmI D0WRmEfpRTplkgl1s830s0oxyV7LJhIW/qJdpaqTgV+3Pti5LfCh136WNi4+lg/HufMq CcTQrWarCvRqK2NcHUanQN6FHLiDGqrA3Ww8T8GhDc4zx61o/LBiaTaa4DlzaSA2gsO3 NszA== 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=VUEIy8gcA+wDCeNoWw+NT1t3G3l9Ep9n9V6dlZQ0YfkDJRy2JkE+TNEQt00mhtLL/3 S3RfGzobH+lIaSByywjeF2MOdOpJ2kpZ9bwmMwwNSHaVJHKMPfbgDFdaSVq8eM9AzyHr 4xa7GPLx3RfGAj7qOAiGQvDRSe6R/GxHD3s8g25kvyBeMxr8BUWQr1HpK/WxDPKWq1jq jqcSWX47HRe5ApQBSikC7/bCtvavRqyaeiSjl1vuBxdDWfNCdgxHFcvibA9fZpB/w7zr SzVrsqP11MHJ73vhS2BaZM6pKGCLt7UM5hCWbOU2KRaoPjKSzb/INnzeTl26+QDBtZFw PQ6w== 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 linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-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 k5-v6si5776107pgq.413.2018.10.24.15.12.19; Wed, 24 Oct 2018 15:12:34 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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 linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-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 S1727401AbeJYGl3 (ORCPT + 99 others); Thu, 25 Oct 2018 02:41:29 -0400 Received: from mail-lf1-f68.google.com ([209.85.167.68]:39718 "EHLO mail-lf1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727144AbeJYGlH (ORCPT ); Thu, 25 Oct 2018 02:41:07 -0400 Received: by mail-lf1-f68.google.com with SMTP id p11-v6so5192065lfc.6 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=fjMcF8Vk6ST31HRbGf3Vf3AwEnCNWQYqKwPJ9NSJjf06a0U/qdFqCglHcinyzJx5Ht jSz9jmiLpG5ngPDk76vr8yMxF516jhWqmHVImHFhfpUJ964PA/1Zonn9q7VmWopihzl+ xkWZmZhv0FWFome0CrAupaIaFzLXk71B/2fw0YSw2gCy0Uq0YSqhnnMSElPDH8OQkeZz S0OmB4vIiz708SVqpZ1X74kAgidwyEq2BhiD64NO2+xbtSbzsgo7G6/AP/QBHKDPtzWO 5qZl0LyJUyAJNPglyhRcd1ZJl01iwqCLEr/9mna4mUZwkzKTqS+I+4RMpdpUwEknqDjK Zs/w== X-Gm-Message-State: AGRZ1gIAXdUgvMiu6znmmwPEB3MqUwQVsqdRMYY50rKQDFPBYOKD6XYs AWlCMUxE3uVH/1Dym0uimRce+Q== 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: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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(+) 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; -- 2.17.1