From patchwork Wed Jun 15 16:45:56 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Edward Cree X-Patchwork-Id: 635970 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rVCFF20R1z9t0t for ; Thu, 16 Jun 2016 02:50:41 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932548AbcFOQue (ORCPT ); Wed, 15 Jun 2016 12:50:34 -0400 Received: from nbfkord-smmo03.seg.att.com ([209.65.160.84]:43035 "EHLO nbfkord-smmo03.seg.att.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753138AbcFOQua (ORCPT ); Wed, 15 Jun 2016 12:50:30 -0400 Received: from unknown [193.34.186.16] (EHLO nbfkord-smmo03.seg.att.com) by nbfkord-smmo03.seg.att.com(mxl_mta-7.2.4-7) with ESMTP id 65781675.2b054ec5d940.3089696.00-2458.7250857.nbfkord-smmo03.seg.att.com (envelope-from ); Wed, 15 Jun 2016 16:50:30 +0000 (UTC) X-MXL-Hash: 576187561f43e996-c4baec8f0807592e6094604342513d2f7074c0fb Received: from unknown [193.34.186.16] by nbfkord-smmo03.seg.att.com(mxl_mta-7.2.4-7) with SMTP id 45781675.0.3089679.00-2377.7250842.nbfkord-smmo03.seg.att.com (envelope-from ); Wed, 15 Jun 2016 16:50:29 +0000 (UTC) X-MXL-Hash: 57618755283cd2ab-0704e5a020939e2ddb5a5e6bbe15d7e12e65f65e Received: from ec-desktop.uk.solarflarecom.com (10.17.20.45) by ukex01.SolarFlarecom.com (10.17.10.4) with Microsoft SMTP Server (TLS) id 15.0.1044.25; Wed, 15 Jun 2016 17:45:59 +0100 From: Edward Cree Subject: [PATCH net-next 07/17] sfc: Store unicast and multicast promisc flag with address cache To: , , References: <4daf4ef4-7a8b-4a16-c640-04275298abad@solarflare.com> Message-ID: <9c33a1c3-beee-e2fb-7ba2-9a458419b085@solarflare.com> Date: Wed, 15 Jun 2016 17:45:56 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0 MIME-Version: 1.0 In-Reply-To: <4daf4ef4-7a8b-4a16-c640-04275298abad@solarflare.com> X-Originating-IP: [10.17.20.45] X-ClientProxiedBy: ocex03.SolarFlarecom.com (10.20.40.36) To ukex01.SolarFlarecom.com (10.17.10.4) X-TM-AS-Product-Ver: SMEX-11.0.0.1191-8.000.1202-22392.003 X-TM-AS-Result: No--2.031500-8.000000-31 X-TM-AS-User-Approved-Sender: No X-TM-AS-User-Blocked-Sender: No X-AnalysisOut: [v=2.1 cv=RO21atW+ c=1 sm=1 tr=0 a=8P+NB+fYZDP74ap4g4d9Kw==] X-AnalysisOut: [:17 a=fVG4DLb5TBsA:10 a=IkcTkHD0fZMA:10 a=pD_ry4oyNxEA:10 ] X-AnalysisOut: [a=pK7X0mNQAAAA:8 a=zRKbQ67AAAAA:8 a=OThoM_NTZ0ldW_AIohgA:9] X-AnalysisOut: [ a=zfHQkwT06B96GJy5:21 a=fvoAMoPknCemljXJ:21 a=QEXdDO2ut3Y] X-AnalysisOut: [A:10 a=5HA-qpC1VU4iIGLgRoNS:22 a=PA03WX8tBzeizutn5_OT:22] X-Spam: [F=0.2000000000; CM=0.500; S=0.200(2015072901)] X-MAIL-FROM: X-SOURCE-IP: [193.34.186.16] Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Andrew Rybchenko These flags are built when address cache is updated. The information will be required when VLAN filtering is added and address cache is used without re-sync. Signed-off-by: Edward Cree --- drivers/net/ethernet/sfc/ef10.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c index 7abb8a7..a2a10dc 100644 --- a/drivers/net/ethernet/sfc/ef10.c +++ b/drivers/net/ethernet/sfc/ef10.c @@ -89,6 +89,8 @@ struct efx_ef10_filter_table { struct efx_ef10_dev_addr dev_mc_list[EFX_EF10_FILTER_DEV_MC_MAX]; int dev_uc_count; int dev_mc_count; + bool uc_promisc; + bool mc_promisc; /* Whether in multicast promiscuous mode when last changed */ bool mc_promisc_last; struct efx_ef10_filter_vlan vlan; @@ -3948,7 +3950,7 @@ static void efx_ef10_filter_mark_old(struct efx_nic *efx) spin_unlock_bh(&efx->filter_lock); } -static void efx_ef10_filter_uc_addr_list(struct efx_nic *efx, bool *promisc) +static void efx_ef10_filter_uc_addr_list(struct efx_nic *efx) { struct efx_ef10_filter_table *table = efx->filter_state; struct net_device *net_dev = efx->net_dev; @@ -3957,14 +3959,13 @@ static void efx_ef10_filter_uc_addr_list(struct efx_nic *efx, bool *promisc) unsigned int i; addr_count = netdev_uc_count(net_dev); - if (net_dev->flags & IFF_PROMISC) - *promisc = true; + table->uc_promisc = !!(net_dev->flags & IFF_PROMISC); table->dev_uc_count = 1 + addr_count; ether_addr_copy(table->dev_uc_list[0].addr, net_dev->dev_addr); i = 1; netdev_for_each_uc_addr(uc, net_dev) { if (i >= EFX_EF10_FILTER_DEV_UC_MAX) { - *promisc = true; + table->uc_promisc = true; break; } ether_addr_copy(table->dev_uc_list[i].addr, uc->addr); @@ -3972,21 +3973,20 @@ static void efx_ef10_filter_uc_addr_list(struct efx_nic *efx, bool *promisc) } } -static void efx_ef10_filter_mc_addr_list(struct efx_nic *efx, bool *promisc) +static void efx_ef10_filter_mc_addr_list(struct efx_nic *efx) { struct efx_ef10_filter_table *table = efx->filter_state; struct net_device *net_dev = efx->net_dev; struct netdev_hw_addr *mc; unsigned int i, addr_count; - if (net_dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) - *promisc = true; + table->mc_promisc = !!(net_dev->flags & (IFF_PROMISC | IFF_ALLMULTI)); addr_count = netdev_mc_count(net_dev); i = 0; netdev_for_each_mc_addr(mc, net_dev) { if (i >= EFX_EF10_FILTER_DEV_MC_MAX) { - *promisc = true; + table->mc_promisc = true; break; } ether_addr_copy(table->dev_mc_list[i].addr, mc->addr); @@ -4252,7 +4252,6 @@ static void efx_ef10_filter_sync_rx_mode(struct efx_nic *efx) struct efx_ef10_filter_table *table = efx->filter_state; struct efx_ef10_nic_data *nic_data = efx->nic_data; struct net_device *net_dev = efx->net_dev; - bool uc_promisc = false, mc_promisc = false; if (!efx_dev_registered(efx)) return; @@ -4266,12 +4265,12 @@ static void efx_ef10_filter_sync_rx_mode(struct efx_nic *efx) * address and broadcast address */ netif_addr_lock_bh(net_dev); - efx_ef10_filter_uc_addr_list(efx, &uc_promisc); - efx_ef10_filter_mc_addr_list(efx, &mc_promisc); + efx_ef10_filter_uc_addr_list(efx); + efx_ef10_filter_mc_addr_list(efx); netif_addr_unlock_bh(net_dev); /* Insert/renew unicast filters */ - if (uc_promisc) { + if (table->uc_promisc) { efx_ef10_filter_insert_def(efx, false, false); efx_ef10_filter_insert_addr_list(efx, false, false); } else { @@ -4287,9 +4286,10 @@ static void efx_ef10_filter_sync_rx_mode(struct efx_nic *efx) /* If changing promiscuous state with cascaded multicast filters, remove * old filters first, so that packets are dropped rather than duplicated */ - if (nic_data->workaround_26807 && table->mc_promisc_last != mc_promisc) + if (nic_data->workaround_26807 && + table->mc_promisc_last != table->mc_promisc) efx_ef10_filter_remove_old(efx); - if (mc_promisc) { + if (table->mc_promisc) { if (nic_data->workaround_26807) { /* If we failed to insert promiscuous filters, rollback * and fall back to individual multicast filters @@ -4322,7 +4322,7 @@ static void efx_ef10_filter_sync_rx_mode(struct efx_nic *efx) } efx_ef10_filter_remove_old(efx); - table->mc_promisc_last = mc_promisc; + table->mc_promisc_last = table->mc_promisc; } static int efx_ef10_set_mac_address(struct efx_nic *efx)