From patchwork Sun Mar 4 09:37:29 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junchang Wang X-Patchwork-Id: 144483 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 06003B6EF3 for ; Sun, 4 Mar 2012 20:36:07 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751948Ab2CDJgD (ORCPT ); Sun, 4 Mar 2012 04:36:03 -0500 Received: from mail-iy0-f174.google.com ([209.85.210.174]:37759 "EHLO mail-iy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751903Ab2CDJgB (ORCPT ); Sun, 4 Mar 2012 04:36:01 -0500 Received: by iagz16 with SMTP id z16so4236436iag.19 for ; Sun, 04 Mar 2012 01:36:00 -0800 (PST) Received-SPF: pass (google.com: domain of junchangwang@gmail.com designates 10.50.156.194 as permitted sender) client-ip=10.50.156.194; Authentication-Results: mr.google.com; spf=pass (google.com: domain of junchangwang@gmail.com designates 10.50.156.194 as permitted sender) smtp.mail=junchangwang@gmail.com; dkim=pass header.i=junchangwang@gmail.com Received: from mr.google.com ([10.50.156.194]) by 10.50.156.194 with SMTP id wg2mr3560301igb.18.1330853760722 (num_hops = 1); Sun, 04 Mar 2012 01:36:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mime-version:content-type :content-disposition:user-agent; bh=lRiXPiYp4Ye+ZkqUoaoxHHf+bKQ845RiRXZBEXNXwDA=; b=BpgH+E78l5iJswcG3g1M6FDgyw0OVeLcqEvF57+RrSx2YjRheINT4V0C7Q7FP46IQV w42OOOMJh8in/oJirZ3XHMHksVEP0Yzlfmn3GUucb8HKFLpGD9lphZGjLHxC1K9U37cj 7MMXP4TqGxuSeC0UBdmS2TaPQT+PzyS5lNlMMnRzeCepVxQz29Fj1rCwo1J65ueD+urA +LSiDgZH5mddFhu6s4jxHfcNZ7HuxTVp2aQaOt0JZ/fsQzxsvXaWrG1S8aHNBfjL1q00 x4Y741hZMds2cjQPP9Zh1s5lCiGwD85qdHtkNZYMHR8ebxhBHlmaQ17zn3CbziRgZnew 0g7w== Received: by 10.50.156.194 with SMTP id wg2mr2964777igb.18.1330853760635; Sun, 04 Mar 2012 01:36:00 -0800 (PST) Received: from Spy32 ([58.211.218.74]) by mx.google.com with ESMTPS id az9sm7793178igb.2.2012.03.04.01.35.56 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 04 Mar 2012 01:36:00 -0800 (PST) Date: Sun, 4 Mar 2012 17:37:29 +0800 From: Junchang Wang To: romieu@fr.zoreil.com, eric.dumazet@gmail.com, davem@davemloft.net Cc: netdev@vger.kernel.org Subject: [PATCH net-next] r8169: Add 64bit statistics Message-ID: <20120304093727.GA5115@Spy32> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-12-10) Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org I submitted this two months ago. This is a resubmission. Thanks. Switch to use ndo_get_stats64 to get 64bit statistics. Two sync entries are used (one for Rx and one for Tx). Signed-off-by: Junchang Wang --- drivers/net/ethernet/realtek/r8169.c | 61 +++++++++++++++++++++++++++++----- 1 files changed, 52 insertions(+), 9 deletions(-) -- -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index fbd855b..c1e2421 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -675,6 +675,12 @@ enum rtl_flag { RTL_FLAG_MAX }; +struct rtl8169_stats { + struct u64_stats_sync syncp; + u64 packets; + u64 bytes; +}; + struct rtl8169_private { void __iomem *mmio_addr; /* memory map physical address */ struct pci_dev *pci_dev; @@ -689,6 +695,8 @@ struct rtl8169_private { u32 dirty_tx; struct TxDesc *TxDescArray; /* 256-aligned Tx descriptor ring */ struct RxDesc *RxDescArray; /* 256-aligned Rx descriptor ring */ + struct rtl8169_stats rx_stats; + struct rtl8169_stats tx_stats; dma_addr_t TxPhyAddr; dma_addr_t RxPhyAddr; void *Rx_databuff[NUM_RX_DESC]; /* Rx data buffers */ @@ -775,7 +783,9 @@ static void rtl_hw_start(struct net_device *dev); static int rtl8169_close(struct net_device *dev); static void rtl_set_rx_mode(struct net_device *dev); static void rtl8169_tx_timeout(struct net_device *dev); -static struct net_device_stats *rtl8169_get_stats(struct net_device *dev); +static struct rtnl_link_stats64 *rtl8169_get_stats64(struct net_device *dev, + struct rtnl_link_stats64 + *stats); static int rtl8169_change_mtu(struct net_device *dev, int new_mtu); static void rtl8169_rx_clear(struct rtl8169_private *tp); static int rtl8169_poll(struct napi_struct *napi, int budget); @@ -3521,7 +3531,7 @@ static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp) static const struct net_device_ops rtl8169_netdev_ops = { .ndo_open = rtl8169_open, .ndo_stop = rtl8169_close, - .ndo_get_stats = rtl8169_get_stats, + .ndo_get_stats64 = rtl8169_get_stats64, .ndo_start_xmit = rtl8169_start_xmit, .ndo_tx_timeout = rtl8169_tx_timeout, .ndo_validate_addr = eth_validate_addr, @@ -5658,8 +5668,10 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb, tp->TxDescArray + entry); if (status & LastFrag) { - dev->stats.tx_packets++; - dev->stats.tx_bytes += tx_skb->skb->len; + u64_stats_update_begin(&tp->tx_stats.syncp); + tp->tx_stats.packets++; + tp->tx_stats.bytes += tx_skb->skb->len; + u64_stats_update_end(&tp->tx_stats.syncp); dev_kfree_skb(tx_skb->skb); tx_skb->skb = NULL; } @@ -5807,8 +5819,10 @@ process_pkt: napi_gro_receive(&tp->napi, skb); - dev->stats.rx_bytes += pkt_size; - dev->stats.rx_packets++; + u64_stats_update_begin(&tp->rx_stats.syncp); + tp->rx_stats.packets++; + tp->rx_stats.bytes += pkt_size; + u64_stats_update_end(&tp->rx_stats.syncp); } /* Work around for AMD plateform. */ @@ -6070,20 +6084,49 @@ static void rtl_set_rx_mode(struct net_device *dev) } /** - * rtl8169_get_stats - Get rtl8169 read/write statistics + * rtl8169_get_stats64 - Get rtl8169 read/write statistics * @dev: The Ethernet Device to get statistics for * * Get TX/RX statistics for rtl8169 */ -static struct net_device_stats *rtl8169_get_stats(struct net_device *dev) +static struct rtnl_link_stats64 * +rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) { struct rtl8169_private *tp = netdev_priv(dev); void __iomem *ioaddr = tp->mmio_addr; + u64 _packets, _bytes; + unsigned int start; if (netif_running(dev)) rtl8169_rx_missed(dev, ioaddr); - return &dev->stats; + do { + start = u64_stats_fetch_begin_bh(&tp->rx_stats.syncp); + _packets = tp->rx_stats.packets; + _bytes = tp->rx_stats.bytes; + } while (u64_stats_fetch_retry_bh(&tp->rx_stats.syncp, start)); + + stats->rx_packets = _packets; + stats->rx_bytes = _bytes; + + do { + start = u64_stats_fetch_begin_bh(&tp->tx_stats.syncp); + _packets = tp->tx_stats.packets; + _bytes = tp->tx_stats.bytes; + } while (u64_stats_fetch_retry_bh(&tp->tx_stats.syncp, start)); + + stats->tx_packets = _packets; + stats->tx_bytes = _bytes; + + stats->rx_dropped = dev->stats.rx_dropped; + stats->tx_dropped = dev->stats.tx_dropped; + stats->rx_length_errors = dev->stats.rx_length_errors; + stats->rx_errors = dev->stats.rx_errors; + stats->rx_crc_errors = dev->stats.rx_crc_errors; + stats->rx_fifo_errors = dev->stats.rx_fifo_errors; + stats->rx_missed_errors = dev->stats.rx_missed_errors; + + return stats; } static void rtl8169_net_suspend(struct net_device *dev)