From patchwork Thu Nov 8 20:27:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Khoronzhuk X-Patchwork-Id: 150595 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp1307234ljp; Thu, 8 Nov 2018 12:31:07 -0800 (PST) X-Google-Smtp-Source: AJdET5evFzFjEwXQRlSpgacQAfb+g9sekh2TRVZtypc5WCxKbS9beybmljY8ek9d7ORs9R5FewPY X-Received: by 2002:a17:902:a614:: with SMTP id u20-v6mr5990889plq.77.1541709067579; Thu, 08 Nov 2018 12:31:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541709067; cv=none; d=google.com; s=arc-20160816; b=GOCZWtSD38OYr7bHigmMv5Gwn2DDo35G8yKaDR/9OPucme/t3E9+GC8OpiSgDUpOGT 3AFAy9BpM0Riac+9Fxhger4RJohPTnHfUtM5O3PTy4A8sDm2HQwkJzTyhf3Y3rhrPCzf /FXFRoLLYTjNJoAxnB66kBLyzKZMqLvfxUFAMgG/IU1eE+0KriY9D8VofUOqogtfH2hw zcmr3NgCA/6jkv4pM0WjV3bvqhwxUwc/WgUvvq2KrL5OFQp9UVKgKES8NxhPVCPZHccZ eqIdFhNC2+hhGKjeIXBF7Y7mKYZpUIlwCx+g7hjnQY2v7PnLwHJhEdr/bJY0ruXghm5o rfhA== 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=8QdsjuBuNR4syD4kYHeYJE3yp+I/xfPRdcYr33cc40E=; b=wlp6v6QDIIDjIimJ7+CDTnMWNwf8+0JEay7dPLOtMqmER1LCsRmg6A8l/cYZNXdxiv FhijMztOghfK1jYzaAixqb0m4+gzeZ7LnF5fBpsEj6VsaTXptdSLw+qRdPLHSsyLwmmR 1nDMByooqug7qZ3ZogA/KbVKRe86mZkiOcNfC09JBS+Rg4R6PBovxkLbUuvHvafeonaU hWgS+XYa2OhQPqufZWVec4JPRKSPr6g9ziv6pO1N3nk23vMeCAAUzWpFmYcsWHEzLbQB VbWU1ziYTWrYh0PFqB14gyGCSFGBwmQm0f6wxS6brLwv+SOA9H10gNKooFwyYsx4lZZ5 Kl1g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=XufzLPeC; 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 w185si4760404pgd.518.2018.11.08.12.31.07; Thu, 08 Nov 2018 12:31:07 -0800 (PST) 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=XufzLPeC; 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 S1727396AbeKIGIL (ORCPT + 32 others); Fri, 9 Nov 2018 01:08:11 -0500 Received: from mail-lj1-f196.google.com ([209.85.208.196]:44934 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726813AbeKIGIK (ORCPT ); Fri, 9 Nov 2018 01:08:10 -0500 Received: by mail-lj1-f196.google.com with SMTP id k19-v6so19200426lji.11 for ; Thu, 08 Nov 2018 12:31:00 -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=8QdsjuBuNR4syD4kYHeYJE3yp+I/xfPRdcYr33cc40E=; b=XufzLPeCqLvabFv/vXBBK9r+yrpq47Q+NRR/7PiXHDl3QB+5W+c2pF3Aiu7RewOUeK aCnxJzZwU1wqQ1kkvzysaOOCIyii+vi3OEaV/wq6kSyKH6WLmOD3SNv8KEBVlRUYQVpd YHTJXAvj/NxuP6RcxA6EPGYLbjuU1KOKfnEyU= 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=8QdsjuBuNR4syD4kYHeYJE3yp+I/xfPRdcYr33cc40E=; b=r8By9E/QhXceV70F8uCIO6i9Y6IyiDVSG0MFFArY1BpxJoI6IAWH0TXZuwSaTrqKvW omYau5yiYcUM6tQDRy5+cTVJsnqNdNhmFSDsDGByQLAu89wDxezdjn7jJOfIen5UNOEX uEhpAdBN8GeJq7Ip46Q+4o9NCtMZVoJCGqt8JzLMKOrn3mfXkOegiFaIr3XNBGygl637 rA2L4MonhN/AjgXwf4vE+fr/xPe4zfAhgLw7Jbmeb/TcBZ0uzRfe047yVK7UHcWAOTaV aYwPjr3xf/T46NsmjW/0U1fN/+eAQEnivB0NydJB/cu0O/5TRVdHpUqqUnZZKD64/eDP iFRA== X-Gm-Message-State: AGRZ1gIrPqaIsHzDUC9aEf39RfztpHcklRCUgcOhQBuweuIM69FCXeSa +4E1qgE3JINvlSw/rFonl4sXvA== X-Received: by 2002:a2e:8546:: with SMTP id u6-v6mr3725823ljj.95.1541709059378; Thu, 08 Nov 2018 12:30:59 -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.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Nov 2018 12:30:58 -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 2/4] net: 8021q: vlan_core: allow use list of vlans for real device Date: Thu, 8 Nov 2018 22:27:55 +0200 Message-Id: <20181108202757.30110-3-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: 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(+) -- 2.17.1 diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 03b08ffded07..1be5230921b5 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;