From patchwork Mon Mar 5 11:33:55 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junchang Wang X-Patchwork-Id: 144664 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 9F950B6EEE for ; Mon, 5 Mar 2012 22:32:31 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756900Ab2CELc1 (ORCPT ); Mon, 5 Mar 2012 06:32:27 -0500 Received: from mail-iy0-f174.google.com ([209.85.210.174]:45878 "EHLO mail-iy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756578Ab2CELc0 (ORCPT ); Mon, 5 Mar 2012 06:32:26 -0500 Received: by iagz16 with SMTP id z16so5408455iag.19 for ; Mon, 05 Mar 2012 03:32:26 -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=e7PeUBQK0d8OWyhzQW/duwqhJI7MxJXOhjJbXucrbQU=; b=gUkY9m9oAKKGlEBM7QKDw/qj9eA0OmVX7cF/jCzKf9UmfHrprimZoRuqCr2xG6Idgo Y8+qjuc2/C65jeXuPWUgI1plzvc5uNcJ0eGs4gKQszY8RtVu2SXu8KgNHr/Fm6ssAMCf OkBgIIjbu1T4R+Lu6VbLHARTeQVHpSmtvCgLuMuWZsWctY9rCL9XPu8R/intmQgCJPsk F1ZKOrpmJbziyHAXOcOFFNJ8RkqgMRE3RjyciID8l75JgbHzNoYlxDjVU3m3rN6M5W1T gvjW9LLzVRov5S1+CtFwnxHOyvlELiWpzRmRQlKIX2SFCgJzp2hDqJFxGYI6CC+dQfku nsiA== Received: by 10.50.178.38 with SMTP id cv6mr5280410igc.1.1330947145977; Mon, 05 Mar 2012 03:32:25 -0800 (PST) Received: from Spy32 ([58.211.218.74]) by mx.google.com with ESMTPS id em2sm11290404igc.0.2012.03.05.03.32.20 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 05 Mar 2012 03:32:25 -0800 (PST) Date: Mon, 5 Mar 2012 19:33:55 +0800 From: Junchang Wang To: davem@davemloft.net, eric.dumazet@gmail.com, greearb@candelatech.com, adobriyan@gmail.com, jasowang@redhat.com, joe@perches.com Cc: netdev@vger.kernel.org Subject: [PATCH net-next] 8139too: Add 64bit statistics Message-ID: <20120305113353.GA12969@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 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/8139too.c | 61 +++++++++++++++++++++++++++---- 1 files changed, 53 insertions(+), 8 deletions(-) -- --Junchang -- 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/8139too.c b/drivers/net/ethernet/realtek/8139too.c index abd6aca..a00d76b 100644 --- a/drivers/net/ethernet/realtek/8139too.c +++ b/drivers/net/ethernet/realtek/8139too.c @@ -565,6 +565,12 @@ struct rtl_extra_stats { unsigned long rx_lost_in_ring; }; +struct rtl8139_stats { + u64 packets; + u64 bytes; + struct u64_stats_sync syncp; +}; + struct rtl8139_private { void __iomem *mmio_addr; int drv_flags; @@ -575,11 +581,13 @@ struct rtl8139_private { unsigned char *rx_ring; unsigned int cur_rx; /* RX buf index of next pkt */ + struct rtl8139_stats rx_stats; dma_addr_t rx_ring_dma; unsigned int tx_flag; unsigned long cur_tx; unsigned long dirty_tx; + struct rtl8139_stats tx_stats; unsigned char *tx_buf[NUM_TX_DESC]; /* Tx bounce buffers */ unsigned char *tx_bufs; /* Tx bounce buffer region. */ dma_addr_t tx_bufs_dma; @@ -641,7 +649,9 @@ static int rtl8139_poll(struct napi_struct *napi, int budget); static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance); static int rtl8139_close (struct net_device *dev); static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); -static struct net_device_stats *rtl8139_get_stats (struct net_device *dev); +static struct rtnl_link_stats64 *rtl8139_get_stats64(struct net_device *dev, + struct rtnl_link_stats64 + *stats); static void rtl8139_set_rx_mode (struct net_device *dev); static void __set_rx_mode (struct net_device *dev); static void rtl8139_hw_start (struct net_device *dev); @@ -937,7 +947,7 @@ static int rtl8139_set_features(struct net_device *dev, netdev_features_t featur static const struct net_device_ops rtl8139_netdev_ops = { .ndo_open = rtl8139_open, .ndo_stop = rtl8139_close, - .ndo_get_stats = rtl8139_get_stats, + .ndo_get_stats64 = rtl8139_get_stats64, .ndo_change_mtu = eth_change_mtu, .ndo_validate_addr = eth_validate_addr, .ndo_set_mac_address = rtl8139_set_mac_address, @@ -1807,8 +1817,10 @@ static void rtl8139_tx_interrupt (struct net_device *dev, dev->stats.tx_fifo_errors++; } dev->stats.collisions += (txstatus >> 24) & 15; - dev->stats.tx_bytes += txstatus & 0x7ff; - dev->stats.tx_packets++; + u64_stats_update_begin(&tp->tx_stats.syncp); + tp->tx_stats.packets++; + tp->tx_stats.bytes += txstatus & 0x7ff; + u64_stats_update_end(&tp->tx_stats.syncp); } dirty_tx++; @@ -2050,8 +2062,10 @@ keep_pkt: skb->protocol = eth_type_trans (skb, dev); - 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); netif_receive_skb (skb); } else { @@ -2515,11 +2529,13 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) } -static struct net_device_stats *rtl8139_get_stats (struct net_device *dev) +static struct rtnl_link_stats64 * +rtl8139_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) { struct rtl8139_private *tp = netdev_priv(dev); void __iomem *ioaddr = tp->mmio_addr; unsigned long flags; + unsigned int start; if (netif_running(dev)) { spin_lock_irqsave (&tp->lock, flags); @@ -2528,7 +2544,36 @@ static struct net_device_stats *rtl8139_get_stats (struct net_device *dev) spin_unlock_irqrestore (&tp->lock, flags); } - return &dev->stats; + do { + start = u64_stats_fetch_begin_bh(&tp->rx_stats.syncp); + stats->rx_packets = tp->rx_stats.packets; + stats->rx_bytes = tp->rx_stats.bytes; + } while (u64_stats_fetch_retry_bh(&tp->rx_stats.syncp, start)); + + do { + start = u64_stats_fetch_begin_bh(&tp->tx_stats.syncp); + stats->tx_packets = tp->tx_stats.packets; + stats->tx_bytes = tp->tx_stats.bytes; + } while (u64_stats_fetch_retry_bh(&tp->tx_stats.syncp, start)); + + stats->rx_errors = dev->stats.rx_errors; + stats->tx_errors = dev->stats.tx_errors; + stats->rx_dropped = dev->stats.rx_dropped; + stats->tx_dropped = dev->stats.tx_dropped; + stats->collisions = dev->stats.collisions; + + stats->rx_length_errors = dev->stats.rx_length_errors; + stats->rx_crc_errors = dev->stats.rx_crc_errors; + stats->rx_frame_errors = dev->stats.rx_frame_errors; + stats->rx_fifo_errors = dev->stats.rx_fifo_errors; + stats->rx_missed_errors = dev->stats.rx_missed_errors; + + stats->tx_aborted_errors = dev->stats.tx_aborted_errors; + stats->tx_carrier_errors = dev->stats.tx_carrier_errors; + stats->tx_fifo_errors = dev->stats.tx_fifo_errors; + stats->tx_window_errors = dev->stats.tx_window_errors; + + return stats; } /* Set or clear the multicast filter for this adaptor.