From patchwork Mon Nov 30 14:05:36 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Breno Leitao X-Patchwork-Id: 39805 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.176.167]) by ozlabs.org (Postfix) with ESMTP id E6E6A1007D5 for ; Tue, 1 Dec 2009 01:05:53 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753034AbZK3OFk (ORCPT ); Mon, 30 Nov 2009 09:05:40 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752354AbZK3OFk (ORCPT ); Mon, 30 Nov 2009 09:05:40 -0500 Received: from e24smtp04.br.ibm.com ([32.104.18.25]:57437 "EHLO e24smtp04.br.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752042AbZK3OFj (ORCPT ); Mon, 30 Nov 2009 09:05:39 -0500 Received: from mailhub3.br.ibm.com (mailhub3.br.ibm.com [9.18.232.110]) by e24smtp04.br.ibm.com (8.14.3/8.13.1) with ESMTP id nAUDuxBf005525 for ; Mon, 30 Nov 2009 11:56:59 -0200 Received: from d24av03.br.ibm.com (d24av03.br.ibm.com [9.8.31.95]) by mailhub3.br.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id nAUE776K1888402 for ; Mon, 30 Nov 2009 12:07:07 -0200 Received: from d24av03.br.ibm.com (loopback [127.0.0.1]) by d24av03.br.ibm.com (8.14.3/8.13.1/NCO v10.0 AVout) with ESMTP id nAUE5bRh021999 for ; Mon, 30 Nov 2009 12:05:38 -0200 Received: from [9.8.11.127] ([9.8.11.127]) by d24av03.br.ibm.com (8.14.3/8.13.1/NCO v10.0 AVin) with ESMTP id nAUE5bxs021982; Mon, 30 Nov 2009 12:05:37 -0200 Message-ID: <4B13D130.8080108@linux.vnet.ibm.com> Date: Mon, 30 Nov 2009 12:05:36 -0200 From: Breno Leitao User-Agent: Thunderbird 2.0.0.23 (X11/20090817) MIME-Version: 1.0 To: Eric Dumazet CC: Michael Chan , "netdev@vger.kernel.org" Subject: Re: [PATCH] bnx2: avoid flushing statistics when doing a MTU change References: <4B13C5FE.7060403@linux.vnet.ibm.com> <4B13C987.3090409@gmail.com> In-Reply-To: <4B13C987.3090409@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Eric Dumazet wrote: > I see nothing in the driver/patch that will consolidate bp->dev->stats > before your memcpy(). DMA transfert doesnt touch bp->dev->stats. You're right, calling bnx2_get_stats() after the DMA should be enough, as the following patch --- [PATCH] bnx2: avoid flushing statistics when doing a MTU change Actually when bnx2 changes the interface's MTU size, it resets the chip and consequently flushes the interface statistics. This patch saves the statistics in a temporary space in order to maintain the statistics correct after the chip reset. Signed-off-by: Breno Leitao --- drivers/net/bnx2.c | 57 ++++++++++++++++++++++++++++++++++++++------------- drivers/net/bnx2.h | 1 + 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 7fa4048..07c0376 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c @@ -6221,6 +6221,8 @@ bnx2_open(struct net_device *dev) else if (bp->flags & BNX2_FLAG_USING_MSIX) printk(KERN_INFO PFX "%s: using MSIX\n", dev->name); + memset(&bp->stats_extra, 0, sizeof(struct net_device_stats)); + netif_tx_start_all_queues(dev); return 0; @@ -6469,46 +6471,58 @@ bnx2_get_stats(struct net_device *dev) net_stats->rx_packets = GET_NET_STATS(stats_blk->stat_IfHCInUcastPkts) + GET_NET_STATS(stats_blk->stat_IfHCInMulticastPkts) + - GET_NET_STATS(stats_blk->stat_IfHCInBroadcastPkts); + GET_NET_STATS(stats_blk->stat_IfHCInBroadcastPkts) + + bp->stats_extra.rx_packets; net_stats->tx_packets = GET_NET_STATS(stats_blk->stat_IfHCOutUcastPkts) + GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts) + - GET_NET_STATS(stats_blk->stat_IfHCOutBroadcastPkts); + GET_NET_STATS(stats_blk->stat_IfHCOutBroadcastPkts) + + bp->stats_extra.tx_packets; net_stats->rx_bytes = - GET_NET_STATS(stats_blk->stat_IfHCInOctets); + GET_NET_STATS(stats_blk->stat_IfHCInOctets) + + bp->stats_extra.rx_bytes; net_stats->tx_bytes = - GET_NET_STATS(stats_blk->stat_IfHCOutOctets); + GET_NET_STATS(stats_blk->stat_IfHCOutOctets) + + bp->stats_extra.tx_bytes; net_stats->multicast = - GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts); + GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts) + + bp->stats_extra.multicast; net_stats->collisions = - (unsigned long) stats_blk->stat_EtherStatsCollisions; + (unsigned long) stats_blk->stat_EtherStatsCollisions + + bp->stats_extra.collisions; net_stats->rx_length_errors = (unsigned long) (stats_blk->stat_EtherStatsUndersizePkts + - stats_blk->stat_EtherStatsOverrsizePkts); + stats_blk->stat_EtherStatsOverrsizePkts) + + bp->stats_extra.rx_length_errors; net_stats->rx_over_errors = (unsigned long) (stats_blk->stat_IfInFTQDiscards + - stats_blk->stat_IfInMBUFDiscards); + stats_blk->stat_IfInMBUFDiscards) + + bp->stats_extra.rx_over_errors; net_stats->rx_frame_errors = - (unsigned long) stats_blk->stat_Dot3StatsAlignmentErrors; + (unsigned long) stats_blk->stat_Dot3StatsAlignmentErrors + + bp->stats_extra.rx_frame_errors; net_stats->rx_crc_errors = - (unsigned long) stats_blk->stat_Dot3StatsFCSErrors; + (unsigned long) stats_blk->stat_Dot3StatsFCSErrors + + bp->stats_extra.rx_crc_errors; net_stats->rx_errors = net_stats->rx_length_errors + net_stats->rx_over_errors + net_stats->rx_frame_errors + - net_stats->rx_crc_errors; + net_stats->rx_crc_errors + + bp->stats_extra.rx_errors; net_stats->tx_aborted_errors = (unsigned long) (stats_blk->stat_Dot3StatsExcessiveCollisions + - stats_blk->stat_Dot3StatsLateCollisions); + stats_blk->stat_Dot3StatsLateCollisions) + + bp->stats_extra.tx_aborted_errors; if ((CHIP_NUM(bp) == CHIP_NUM_5706) || (CHIP_ID(bp) == CHIP_ID_5708_A0)) @@ -6516,7 +6530,8 @@ bnx2_get_stats(struct net_device *dev) else { net_stats->tx_carrier_errors = (unsigned long) - stats_blk->stat_Dot3StatsCarrierSenseErrors; + stats_blk->stat_Dot3StatsCarrierSenseErrors + + bp->stats_extra.tx_carrier_errors; } net_stats->tx_errors = @@ -6524,11 +6539,13 @@ bnx2_get_stats(struct net_device *dev) stats_blk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors + net_stats->tx_aborted_errors + - net_stats->tx_carrier_errors; + net_stats->tx_carrier_errors + + bp->stats_extra.tx_errors; net_stats->rx_missed_errors = (unsigned long) (stats_blk->stat_IfInFTQDiscards + - stats_blk->stat_IfInMBUFDiscards + stats_blk->stat_FwRxDrop); + stats_blk->stat_IfInMBUFDiscards + stats_blk->stat_FwRxDrop) + + bp->stats_extra.rx_missed_errors; return net_stats; } @@ -6989,6 +7006,16 @@ bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx) { if (netif_running(bp->dev)) { bnx2_netif_stop(bp); + + /* Save statistics that is going to be reseted */ + REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | + BNX2_HC_COMMAND_STATS_NOW); + REG_RD(bp, BNX2_HC_COMMAND); + udelay(5); + bnx2_get_stats(bp->dev); + memcpy(&bp->stats_extra, &bp->dev->stats, + sizeof(struct net_device_stats)); + bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET); bnx2_free_skbs(bp); bnx2_free_mem(bp); diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index a4d8340..1063d1a 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h @@ -6912,6 +6912,7 @@ struct bnx2 { const struct firmware *mips_firmware; const struct firmware *rv2p_firmware; + struct net_device_stats stats_extra; }; #define REG_RD(bp, offset) \