Netdev List
 help / color / mirror / Atom feed
* Re: [PATCH] netxen: fix race in skb->len access
From: David Miller @ 2011-06-20 20:05 UTC (permalink / raw)
  To: eric.dumazet; +Cc: netdev, amit.salecha
In-Reply-To: <1308551175.3539.133.camel@edumazet-laptop>

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Mon, 20 Jun 2011 08:26:15 +0200

> As soon as skb is given to hardware, TX completion can free skb under
> us.
> Therefore, we should update dev stats before kicking the device.
> 
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>

Applied.

^ permalink raw reply

* Re: [RFT PATCH 3/9] net: ethtool: break association of ETH_FLAG_* with NETIF_F_*
From: Ben Hutchings @ 2011-06-20 20:11 UTC (permalink / raw)
  To: Michał Mirosław; +Cc: netdev, David S. Miller, Stephen Hemminger
In-Reply-To: <51d2fd4cf6855c2285ca9bcd8d267abedcbc599c.1308596963.git.mirq-linux@rere.qmqm.pl>

On Mon, 2011-06-20 at 21:14 +0200, Michał Mirosław wrote:
> This is the only place where NETIF_F_* feature flags are exposed
> to userspace.

Except sysfs.

> After this patch feature flags may be changed/reordered freely.
[...]

Really, what do you think was the point of exposing features through
sysfs if they are going to be changed?

Oh, but they have been changed already:

v2.5.70
net-sysfs added

v2.6.15
+#define NETIF_F_UFO             8192    /* Can offload UDP Large Send*/

v2.6.18
-#define NETIF_F_TSO            2048    /* Can offload TCP/IP segmentation */
-#define NETIF_F_UFO             8192    /* Can offload UDP Large Send*/
+#define NETIF_F_GSO            2048    /* Enable software GSO. */
+#define NETIF_F_GSO_SHIFT      16
+#define NETIF_F_TSO            (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
+#define NETIF_F_UFO            (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
+#define NETIF_F_GSO_ROBUST     (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
+#define NETIF_F_TSO_ECN                (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
+#define NETIF_F_TSO6           (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)

v2.6.23
+#define NETIF_F_IPV6_CSUM      16      /* Can checksum TCP/UDP over IPV6 */
+#define NETIF_F_MULTI_QUEUE    16384   /* Has multiple TX/RX queues */

v2.6.24
+#define NETIF_F_NETNS_LOCAL    8192    /* Does not change network namespaces */

v2.6.27
-#define NETIF_F_MULTI_QUEUE    16384   /* Has multiple TX/RX queues */

v2.6.29
+#define NETIF_F_GRO            16384   /* Generic receive offload */

(I've omitted changes that use previously unused bits.)

If we're going to keep changing features (maybe even more often) then we
have to do something about this sysfs attribute.  Maybe get rid of it
(as it seems not to be widely used, thankfully).  Maybe fix it to use
the same feature values as today, but no new features.  But certainly
don't pretend that feature flags are not exposed.

Ben.

-- 
Ben Hutchings, Senior Software Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.


^ permalink raw reply

* [PATCH] firmware: remove myri_sbus firmware
From: Jon Mason @ 2011-06-20 20:18 UTC (permalink / raw)
  To: David Woodhouse; +Cc: netdev, Andrew Gallatin

The only user of myricom/lanai.bin, the myri_sbus driver, has been
removed from the kernel.  Without any users, the firmware is no longer
necessary.

Signed-off-by: Jon Mason <mason@myri.com>
---
 myricom/lanai.bin |  Bin 76258 -> 0 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 myricom/lanai.bin

diff --git a/myricom/lanai.bin b/myricom/lanai.bin
deleted file mode 100644
index ea0964292ad3b094b738eba87fcb8ddc042f91e0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 76258
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
P4*2wQbC<rhJmvMjkgV5?

-- 
1.7.5.4


^ permalink raw reply

* Re: [RFT PATCH 3/9] net: ethtool: break association of ETH_FLAG_* with NETIF_F_*
From: David Miller @ 2011-06-20 20:27 UTC (permalink / raw)
  To: bhutchings; +Cc: mirq-linux, netdev, shemminger
In-Reply-To: <1308600681.2701.159.camel@bwh-desktop>

From: Ben Hutchings <bhutchings@solarflare.com>
Date: Mon, 20 Jun 2011 21:11:21 +0100

> If we're going to keep changing features (maybe even more often) then we
> have to do something about this sysfs attribute.  Maybe get rid of it
> (as it seems not to be widely used, thankfully).  Maybe fix it to use
> the same feature values as today, but no new features.  But certainly
> don't pretend that feature flags are not exposed.

I'd say we just kill it off, our hands are tied too tightly otherwise.

And this ties in to our efforts to expand netdev->features to a larger
type.

^ permalink raw reply

* [PATCH net-next 4/5] xen: convert to 64 bit stats interface
From: Stephen Hemminger @ 2011-06-20 20:35 UTC (permalink / raw)
  To: davem, Jeremy Fitzhardinge; +Cc: netdev, xen-devel
In-Reply-To: <20110620203506.363818794@vyatta.com>

[-- Attachment #1: xen-stats64.patch --]
[-- Type: text/plain, Size: 8271 bytes --]

Convert xen driver to 64 bit statistics interface.
Use stats_sync to ensure that 64 bit update is read atomically
on 32 bit platform. Put hot statistics into per-cpu table.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>

---
v2 - add stats_sync and per-cpu

--- a/drivers/net/xen-netfront.c	2011-06-20 13:34:56.383992463 -0700
+++ b/drivers/net/xen-netfront.c	2011-06-20 13:41:47.207992232 -0700
@@ -70,6 +70,14 @@ struct netfront_cb {
 #define NET_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE)
 #define TX_MAX_TARGET min_t(int, NET_RX_RING_SIZE, 256)
 
+struct netfront_stats {
+	u64			rx_packets;
+	u64			tx_packets;
+	u64			rx_bytes;
+	u64			tx_bytes;
+	struct u64_stats_sync	syncp;
+};
+
 struct netfront_info {
 	struct list_head list;
 	struct net_device *netdev;
@@ -122,6 +130,8 @@ struct netfront_info {
 	struct mmu_update rx_mmu[NET_RX_RING_SIZE];
 
 	/* Statistics */
+	struct netfront_stats __percpu *stats;
+
 	unsigned long rx_gso_checksum_fixup;
 };
 
@@ -468,6 +478,7 @@ static int xennet_start_xmit(struct sk_b
 {
 	unsigned short id;
 	struct netfront_info *np = netdev_priv(dev);
+	struct netfront_stats *stats = this_cpu_ptr(np->stats);
 	struct xen_netif_tx_request *tx;
 	struct xen_netif_extra_info *extra;
 	char *data = skb->data;
@@ -552,8 +563,10 @@ static int xennet_start_xmit(struct sk_b
 	if (notify)
 		notify_remote_via_irq(np->netdev->irq);
 
-	dev->stats.tx_bytes += skb->len;
-	dev->stats.tx_packets++;
+	u64_stats_update_begin(&stats->syncp);
+	stats->tx_bytes += skb->len;
+	stats->tx_packets++;
+	u64_stats_update_end(&stats->syncp);
 
 	/* Note: It is not safe to access skb after xennet_tx_buf_gc()! */
 	xennet_tx_buf_gc(dev);
@@ -847,6 +860,8 @@ out:
 static int handle_incoming_queue(struct net_device *dev,
 				 struct sk_buff_head *rxq)
 {
+	struct netfront_info *np = netdev_priv(dev);
+	struct netfront_stats *stats = this_cpu_ptr(np->stats);
 	int packets_dropped = 0;
 	struct sk_buff *skb;
 
@@ -867,12 +882,13 @@ static int handle_incoming_queue(struct
 		if (checksum_setup(dev, skb)) {
 			kfree_skb(skb);
 			packets_dropped++;
-			dev->stats.rx_errors++;
 			continue;
 		}
 
-		dev->stats.rx_packets++;
-		dev->stats.rx_bytes += skb->len;
+		u64_stats_update_begin(&stats->syncp);
+		stats->rx_packets++;
+		stats->rx_bytes += skb->len;
+		u64_stats_update_end(&stats->syncp);
 
 		/* Pass it up. */
 		netif_receive_skb(skb);
@@ -1034,6 +1050,38 @@ static int xennet_change_mtu(struct net_
 	return 0;
 }
 
+static struct rtnl_link_stats64 *xennet_get_stats64(struct net_device *dev,
+						    struct rtnl_link_stats64 *tot)
+{
+	struct netfront_info *np = netdev_priv(dev);
+	int cpu;
+
+	for_each_possible_cpu(cpu) {
+		struct netfront_stats *stats = per_cpu_ptr(np->stats, cpu);
+		u64 rx_packets, rx_bytes, tx_packets, tx_bytes;
+		unsigned int start;
+
+		do {
+			start = u64_stats_fetch_begin_bh(&stats->syncp);
+
+			rx_packets = stats->rx_packets;
+			tx_packets = stats->tx_packets;
+			rx_bytes = stats->rx_bytes;
+			tx_bytes = stats->tx_bytes;
+		} while (u64_stats_fetch_retry_bh(&stats->syncp, start));
+
+		tot->rx_packets += rx_packets;
+		tot->tx_packets += tx_packets;
+		tot->rx_bytes   += rx_bytes;
+		tot->tx_bytes   += tx_bytes;
+	}
+
+	tot->rx_errors  = dev->stats.rx_errors;
+	tot->tx_dropped = dev->stats.tx_dropped;
+
+	return tot;
+}
+
 static void xennet_release_tx_bufs(struct netfront_info *np)
 {
 	struct sk_buff *skb;
@@ -1182,6 +1230,7 @@ static const struct net_device_ops xenne
 	.ndo_stop            = xennet_close,
 	.ndo_start_xmit      = xennet_start_xmit,
 	.ndo_change_mtu	     = xennet_change_mtu,
+	.ndo_get_stats64     = xennet_get_stats64,
 	.ndo_set_mac_address = eth_mac_addr,
 	.ndo_validate_addr   = eth_validate_addr,
 	.ndo_fix_features    = xennet_fix_features,
@@ -1216,6 +1265,11 @@ static struct net_device * __devinit xen
 	np->rx_refill_timer.data = (unsigned long)netdev;
 	np->rx_refill_timer.function = rx_refill_timeout;
 
+	err = -ENOMEM;
+	np->stats = alloc_percpu(struct netfront_stats);
+	if (np->stats == NULL)
+		goto exit;
+
 	/* Initialise tx_skbs as a free chain containing every entry. */
 	np->tx_skb_freelist = 0;
 	for (i = 0; i < NET_TX_RING_SIZE; i++) {
@@ -1234,7 +1288,7 @@ static struct net_device * __devinit xen
 					  &np->gref_tx_head) < 0) {
 		printk(KERN_ALERT "#### netfront can't alloc tx grant refs\n");
 		err = -ENOMEM;
-		goto exit;
+		goto exit_free_stats;
 	}
 	/* A grant for every rx ring slot */
 	if (gnttab_alloc_grant_references(RX_MAX_TARGET,
@@ -1270,6 +1324,8 @@ static struct net_device * __devinit xen
 
  exit_free_tx:
 	gnttab_free_grant_references(np->gref_tx_head);
+ exit_free_stats:
+	free_percpu(np->stats);
  exit:
 	free_netdev(netdev);
 	return ERR_PTR(err);
@@ -1869,6 +1925,8 @@ static int __devexit xennet_remove(struc
 
 	xennet_sysfs_delif(info->netdev);
 
+	free_percpu(info->stats);
+
 	free_netdev(info->netdev);
 
 	return 0;
>From shemminger@vyatta.com Mon Jun 20 13:36:03 2011
Message-Id: <20110620203603.019928129@vyatta.com>
User-Agent: quilt/0.48-1
Date: Mon, 20 Jun 2011 13:35:11 -0700
From: Stephen Hemminger <shemminger@vyatta.com>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org
Subject: [PATCH net-next 5/5] ifb: convert to 64 bit stats
References: <20110620203506.363818794@vyatta.com>
Content-Disposition: inline; filename=ifb-stats64.patch

Convert input functional block device to use 64 bit stats.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>

---
v2 - add stats_sync


--- a/drivers/net/ifb.c	2011-06-09 14:39:25.000000000 -0700
+++ b/drivers/net/ifb.c	2011-06-20 13:30:30.135992612 -0700
@@ -41,8 +41,18 @@
 struct ifb_private {
 	struct tasklet_struct   ifb_tasklet;
 	int     tasklet_pending;
+
 	struct sk_buff_head     rq;
+	u64 rx_packets;
+	u64 rx_bytes;
+	unsigned long rx_dropped;
+
 	struct sk_buff_head     tq;
+	u64 tx_packets;
+	u64 tx_bytes;
+	unsigned long tx_dropped;
+
+	struct u64_stats_sync	stats_sync;
 };
 
 static int numifbs = 2;
@@ -57,7 +67,6 @@ static void ri_tasklet(unsigned long dev
 
 	struct net_device *_dev = (struct net_device *)dev;
 	struct ifb_private *dp = netdev_priv(_dev);
-	struct net_device_stats *stats = &_dev->stats;
 	struct netdev_queue *txq;
 	struct sk_buff *skb;
 
@@ -77,15 +86,18 @@ static void ri_tasklet(unsigned long dev
 
 		skb->tc_verd = 0;
 		skb->tc_verd = SET_TC_NCLS(skb->tc_verd);
-		stats->tx_packets++;
-		stats->tx_bytes +=skb->len;
+
+		u64_stats_update_begin(&dp->stats_sync);
+		dp->tx_packets++;
+		dp->tx_bytes += skb->len;
+		u64_stats_update_end(&dp->stats_sync);
 
 		rcu_read_lock();
 		skb->dev = dev_get_by_index_rcu(&init_net, skb->skb_iif);
 		if (!skb->dev) {
 			rcu_read_unlock();
 			dev_kfree_skb(skb);
-			stats->tx_dropped++;
+			dp->tx_dropped++;
 			if (skb_queue_len(&dp->tq) != 0)
 				goto resched;
 			break;
@@ -120,9 +132,33 @@ resched:
 
 }
 
+static struct rtnl_link_stats64 *ifb_stats64(struct net_device *dev,
+					     struct rtnl_link_stats64 *stats)
+{
+	struct ifb_private *dp = netdev_priv(dev);
+	unsigned int start;
+
+	do {
+		start = u64_stats_fetch_begin_bh(&dp->stats_sync);
+
+		stats->rx_packets = dp->rx_packets;
+		stats->rx_bytes = dp->rx_bytes;
+		stats->tx_packets = dp->tx_packets;
+		stats->tx_bytes = dp->tx_bytes;
+
+	} while (u64_stats_fetch_retry_bh(&dp->stats_sync, start));
+
+	stats->rx_dropped = dp->rx_dropped;
+	stats->tx_dropped = dp->tx_dropped;
+
+	return stats;
+}
+
+
 static const struct net_device_ops ifb_netdev_ops = {
 	.ndo_open	= ifb_open,
 	.ndo_stop	= ifb_close,
+	.ndo_get_stats64 = ifb_stats64,
 	.ndo_start_xmit	= ifb_xmit,
 	.ndo_validate_addr = eth_validate_addr,
 };
@@ -153,15 +189,16 @@ static void ifb_setup(struct net_device
 static netdev_tx_t ifb_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct ifb_private *dp = netdev_priv(dev);
-	struct net_device_stats *stats = &dev->stats;
 	u32 from = G_TC_FROM(skb->tc_verd);
 
-	stats->rx_packets++;
-	stats->rx_bytes+=skb->len;
+	u64_stats_update_begin(&dp->stats_sync);
+	dp->rx_packets++;
+	dp->rx_bytes += skb->len;
+	u64_stats_update_end(&dp->stats_sync);
 
 	if (!(from & (AT_INGRESS|AT_EGRESS)) || !skb->skb_iif) {
 		dev_kfree_skb(skb);
-		stats->rx_dropped++;
+		dp->rx_dropped++;
 		return NETDEV_TX_OK;
 	}

^ permalink raw reply

* [PATCH net-next 2/5] niu: fix 64 bit statistics on 32 bit platform
From: Stephen Hemminger @ 2011-06-20 20:35 UTC (permalink / raw)
  To: davem; +Cc: netdev
In-Reply-To: <20110620203506.363818794@vyatta.com>

[-- Attachment #1: niu-stats-sync.patch --]
[-- Type: text/plain, Size: 4481 bytes --]

This resolves issues with NIU driver statistics wrapping on 32 bit SMP.
Use stats_sync wrapper for bytes and packets, and change error counters
to natural word size (unsigned long).

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>


--- a/drivers/net/niu.c	2011-06-20 12:27:58.015994716 -0700
+++ b/drivers/net/niu.c	2011-06-20 12:40:21.239994298 -0700
@@ -3512,8 +3512,10 @@ static int niu_process_rx_pkt(struct nap
 			       (u32)rh->hashval1_2 << 0);
 	skb_pull(skb, sizeof(*rh));
 
+	u64_stats_update_begin(&rp->syncp);
 	rp->rx_packets++;
 	rp->rx_bytes += skb->len;
+	u64_stats_update_end(&rp->syncp);
 
 	skb->protocol = eth_type_trans(skb, np->dev);
 	skb_record_rx_queue(skb, rp->rx_channel);
@@ -6252,59 +6254,59 @@ static void niu_sync_mac_stats(struct ni
 static void niu_get_rx_stats(struct niu *np,
 			     struct rtnl_link_stats64 *stats)
 {
-	u64 pkts, dropped, errors, bytes;
 	struct rx_ring_info *rx_rings;
 	int i;
 
-	pkts = dropped = errors = bytes = 0;
-
 	rx_rings = ACCESS_ONCE(np->rx_rings);
 	if (!rx_rings)
-		goto no_rings;
+		return;
 
 	for (i = 0; i < np->num_rx_rings; i++) {
 		struct rx_ring_info *rp = &rx_rings[i];
+		unsigned int start;
+		u64 pkts, bytes;
 
 		niu_sync_rx_discard_stats(np, rp, 0);
 
-		pkts += rp->rx_packets;
-		bytes += rp->rx_bytes;
-		dropped += rp->rx_dropped;
-		errors += rp->rx_errors;
-	}
+		do {
+			start = u64_stats_fetch_begin(&rp->syncp);
 
-no_rings:
-	stats->rx_packets = pkts;
-	stats->rx_bytes = bytes;
-	stats->rx_dropped = dropped;
-	stats->rx_errors = errors;
+			pkts    = rp->rx_packets;
+			bytes   = rp->rx_bytes;
+		} while (u64_stats_fetch_retry(&rp->syncp, start));
+
+		stats->rx_packets += pkts;
+		stats->rx_bytes   += bytes;
+		stats->rx_dropped += rp->rx_dropped;
+		stats->rx_errors  += rp->rx_errors;
+	}
 }
 
 static void niu_get_tx_stats(struct niu *np,
 			     struct rtnl_link_stats64 *stats)
 {
-	u64 pkts, errors, bytes;
 	struct tx_ring_info *tx_rings;
 	int i;
 
-	pkts = errors = bytes = 0;
-
 	tx_rings = ACCESS_ONCE(np->tx_rings);
 	if (!tx_rings)
-		goto no_rings;
+		return;
 
 	for (i = 0; i < np->num_tx_rings; i++) {
 		struct tx_ring_info *rp = &tx_rings[i];
+		unsigned int start;
+		u64 pkts, bytes;
 
-		pkts += rp->tx_packets;
-		bytes += rp->tx_bytes;
-		errors += rp->tx_errors;
+		do {
+			start = u64_stats_fetch_begin(&rp->syncp);
+			pkts   = rp->tx_packets;
+			bytes  = rp->tx_bytes;
+		} while (u64_stats_fetch_retry(&rp->syncp, start));
+
+		stats->tx_packets += pkts;
+		stats->tx_bytes   += bytes;
+		stats->tx_errors  += rp->tx_errors;
 	}
-
-no_rings:
-	stats->tx_packets = pkts;
-	stats->tx_bytes = bytes;
-	stats->tx_errors = errors;
 }
 
 static struct rtnl_link_stats64 *niu_get_stats(struct net_device *dev,
@@ -7818,6 +7820,7 @@ static void niu_get_ethtool_stats(struct
 				  struct ethtool_stats *stats, u64 *data)
 {
 	struct niu *np = netdev_priv(dev);
+	unsigned int start;
 	int i;
 
 	niu_sync_mac_stats(np);
@@ -7836,8 +7839,13 @@ static void niu_get_ethtool_stats(struct
 		niu_sync_rx_discard_stats(np, rp, 0);
 
 		data[0] = rp->rx_channel;
-		data[1] = rp->rx_packets;
-		data[2] = rp->rx_bytes;
+		do {
+			start = u64_stats_fetch_begin(&rp->syncp);
+
+			data[1] = rp->rx_packets;
+			data[2] = rp->rx_bytes;
+		} while (u64_stats_fetch_retry(&rp->syncp, start));
+
 		data[3] = rp->rx_dropped;
 		data[4] = rp->rx_errors;
 		data += 5;
@@ -7846,8 +7854,11 @@ static void niu_get_ethtool_stats(struct
 		struct tx_ring_info *rp = &np->tx_rings[i];
 
 		data[0] = rp->tx_channel;
-		data[1] = rp->tx_packets;
-		data[2] = rp->tx_bytes;
+		do {
+			start = u64_stats_fetch_begin(&rp->syncp);
+			data[1] = rp->tx_packets;
+			data[2] = rp->tx_bytes;
+		} while (u64_stats_fetch_retry(&rp->syncp, start));
 		data[3] = rp->tx_errors;
 		data += 4;
 	}
--- a/drivers/net/niu.h	2011-06-20 12:27:57.043994716 -0700
+++ b/drivers/net/niu.h	2011-06-20 12:35:41.343994455 -0700
@@ -2866,9 +2866,10 @@ struct tx_ring_info {
 	struct txdma_mailbox	*mbox;
 	__le64			*descr;
 
+	struct u64_stats_sync	syncp;
 	u64			tx_packets;
 	u64			tx_bytes;
-	u64			tx_errors;
+	unsigned long		tx_errors;
 
 	u64			mbox_dma;
 	u64			descr_dma;
@@ -2922,10 +2923,11 @@ struct rx_ring_info {
 	__le32			*rbr;
 #define RBR_DESCR_ADDR_SHIFT	12
 
+	struct u64_stats_sync	syncp;
 	u64			rx_packets;
 	u64			rx_bytes;
-	u64			rx_dropped;
-	u64			rx_errors;
+	unsigned long		rx_dropped;
+	unsigned long		rx_errors;
 
 	u64			mbox_dma;
 	u64			rcr_dma;



^ permalink raw reply

* [PATCH net-next 0/5] more statistics updates
From: Stephen Hemminger @ 2011-06-20 20:35 UTC (permalink / raw)
  To: davem; +Cc: netdev

Fix drivers that are using 64 bit statistics with unsafe access on 32 bit.
These are compile tested only, because the hardware to test it is not
easily available.


^ permalink raw reply

* [PATCH net-next 3/5] netxen: make 64 bit stats safe on 32 bit platform
From: Stephen Hemminger @ 2011-06-20 20:35 UTC (permalink / raw)
  To: davem, Amit Kumar Salecha; +Cc: netdev
In-Reply-To: <20110620203506.363818794@vyatta.com>

[-- Attachment #1: netxen-stats-sync.patch --]
[-- Type: text/plain, Size: 2491 bytes --]

Use stats_update wrapper to avoid problems where 64 bit statistic update
is not atomic on 32 bit platform.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>


---
 drivers/net/netxen/netxen_nic.h      |    1 +
 drivers/net/netxen/netxen_nic_init.c |    2 ++
 drivers/net/netxen/netxen_nic_main.c |   16 ++++++++++++----
 3 files changed, 15 insertions(+), 4 deletions(-)

--- a/drivers/net/netxen/netxen_nic.h	2011-06-20 12:42:05.035994241 -0700
+++ b/drivers/net/netxen/netxen_nic.h	2011-06-20 12:51:27.727993925 -0700
@@ -607,6 +607,7 @@ struct netxen_hardware_context {
 #define ETHERNET_FCS_SIZE		4
 
 struct netxen_adapter_stats {
+	struct u64_stats_sync syncp;
 	u64  xmitcalled;
 	u64  xmitfinished;
 	u64  rxdropped;
--- a/drivers/net/netxen/netxen_nic_init.c	2011-06-20 12:48:02.963994039 -0700
+++ b/drivers/net/netxen/netxen_nic_init.c	2011-06-20 12:50:27.887993959 -0700
@@ -1616,8 +1616,10 @@ netxen_process_lro(struct netxen_adapter
 
 	netif_receive_skb(skb);
 
+	u64_stats_update_begin(&adapter->stats.syncp);
 	adapter->stats.lro_pkts++;
 	adapter->stats.rxbytes += length;
+	u64_stats_update_end(&adapter->stats.syncp);
 
 	return buffer;
 }
--- a/drivers/net/netxen/netxen_nic_main.c	2011-06-20 12:41:47.739994250 -0700
+++ b/drivers/net/netxen/netxen_nic_main.c	2011-06-20 12:52:49.255993879 -0700
@@ -1968,8 +1968,10 @@ netxen_nic_xmit_frame(struct sk_buff *sk
 
 	netxen_nic_update_cmd_producer(adapter, tx_ring);
 
+	u64_stats_update_begin(&adapter->stats.syncp);
 	adapter->stats.txbytes += skb->len;
 	adapter->stats.xmitcalled++;
+	u64_stats_update_end(&adapter->stats.syncp);
 
 	return NETDEV_TX_OK;
 
@@ -2115,11 +2117,17 @@ static struct rtnl_link_stats64 *netxen_
 						      struct rtnl_link_stats64 *stats)
 {
 	struct netxen_adapter *adapter = netdev_priv(netdev);
+	unsigned int start;
+
+	do {
+		start = u64_stats_fetch_begin(&adapter->stats.syncp);
+
+		stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts;
+		stats->tx_packets = adapter->stats.xmitfinished;
+		stats->rx_bytes = adapter->stats.rxbytes;
+		stats->tx_bytes = adapter->stats.txbytes;
+	} while (u64_stats_fetch_retry(&adapter->stats.syncp, start));
 
-	stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts;
-	stats->tx_packets = adapter->stats.xmitfinished;
-	stats->rx_bytes = adapter->stats.rxbytes;
-	stats->tx_bytes = adapter->stats.txbytes;
 	stats->rx_dropped = adapter->stats.rxdropped;
 	stats->tx_dropped = adapter->stats.txdropped;
 



^ permalink raw reply

* [PATCH net-next 1/5] vxge: fix 64 bit access on 32 bit platforms
From: Stephen Hemminger @ 2011-06-20 20:35 UTC (permalink / raw)
  To: davem, Jon Mason; +Cc: netdev
In-Reply-To: <20110620203506.363818794@vyatta.com>

[-- Attachment #1: vxge-stats-sync.patch --]
[-- Type: text/plain, Size: 5420 bytes --]

Need to add stat_sync wrapper around 64 bit statistic values.
Fix wraparound bug in lockup detector where it is unsafely comparing
64 bit value that is not atomic. Since only care about detecting activity
just looking at current low order bits will work.

Remove unused entries in old vxge_sw_stats structure.
Change the error counters to unsigned long since they won't grow so large
as to have to be 64 bits.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>

--- a/drivers/net/vxge/vxge-main.c	2011-06-20 11:46:03.811996124 -0700
+++ b/drivers/net/vxge/vxge-main.c	2011-06-20 12:19:42.023994994 -0700
@@ -296,11 +296,13 @@ vxge_rx_complete(struct vxge_ring *ring,
 	skb_record_rx_queue(skb, ring->driver_id);
 	skb->protocol = eth_type_trans(skb, ring->ndev);
 
+	u64_stats_update_begin(&ring->stats.syncp);
 	ring->stats.rx_frms++;
 	ring->stats.rx_bytes += pkt_length;
 
 	if (skb->pkt_type == PACKET_MULTICAST)
 		ring->stats.rx_mcast++;
+	u64_stats_update_end(&ring->stats.syncp);
 
 	vxge_debug_rx(VXGE_TRACE,
 		"%s: %s:%d  skb protocol = %d",
@@ -592,8 +594,10 @@ vxge_xmit_compl(struct __vxge_hw_fifo *f
 		vxge_hw_fifo_txdl_free(fifo_hw, dtr);
 
 		/* Updating the statistics block */
+		u64_stats_update_begin(&fifo->stats.syncp);
 		fifo->stats.tx_frms++;
 		fifo->stats.tx_bytes += skb->len;
+		u64_stats_update_end(&fifo->stats.syncp);
 
 		*done_skb++ = skb;
 
@@ -2630,11 +2634,16 @@ static void vxge_poll_vp_lockup(unsigned
 	struct vxge_vpath *vpath;
 	struct vxge_ring *ring;
 	int i;
+	unsigned long rx_frms;
 
 	for (i = 0; i < vdev->no_of_vpath; i++) {
 		ring = &vdev->vpaths[i].ring;
+
+		/* Truncated to machine word size number of frames */
+		rx_frms = ACCESS_ONCE(ring->stats.rx_frms);
+
 		/* Did this vpath received any packets */
-		if (ring->stats.prev_rx_frms == ring->stats.rx_frms) {
+		if (ring->stats.prev_rx_frms == rx_frms) {
 			status = vxge_hw_vpath_check_leak(ring->handle);
 
 			/* Did it received any packets last time */
@@ -2654,7 +2663,7 @@ static void vxge_poll_vp_lockup(unsigned
 				}
 			}
 		}
-		ring->stats.prev_rx_frms = ring->stats.rx_frms;
+		ring->stats.prev_rx_frms = rx_frms;
 		ring->last_status = status;
 	}
 
@@ -3125,14 +3134,36 @@ vxge_get_stats64(struct net_device *dev,
 
 	/* net_stats already zeroed by caller */
 	for (k = 0; k < vdev->no_of_vpath; k++) {
-		net_stats->rx_packets += vdev->vpaths[k].ring.stats.rx_frms;
-		net_stats->rx_bytes += vdev->vpaths[k].ring.stats.rx_bytes;
-		net_stats->rx_errors += vdev->vpaths[k].ring.stats.rx_errors;
-		net_stats->multicast += vdev->vpaths[k].ring.stats.rx_mcast;
-		net_stats->rx_dropped += vdev->vpaths[k].ring.stats.rx_dropped;
-		net_stats->tx_packets += vdev->vpaths[k].fifo.stats.tx_frms;
-		net_stats->tx_bytes += vdev->vpaths[k].fifo.stats.tx_bytes;
-		net_stats->tx_errors += vdev->vpaths[k].fifo.stats.tx_errors;
+		struct vxge_ring_stats *rxstats = &vdev->vpaths[k].ring.stats;
+		struct vxge_fifo_stats *txstats = &vdev->vpaths[k].fifo.stats;
+		unsigned int start;
+		u64 packets, bytes, multicast;
+
+		do {
+			start = u64_stats_fetch_begin(&rxstats->syncp);
+
+			packets   = rxstats->rx_frms;
+			multicast = rxstats->rx_mcast;
+			bytes     = rxstats->rx_bytes;
+		} while (u64_stats_fetch_retry(&rxstats->syncp, start));
+
+		net_stats->rx_packets += packets;
+		net_stats->rx_bytes += bytes;
+		net_stats->multicast += multicast;
+
+		net_stats->rx_errors += rxstats->rx_errors;
+		net_stats->rx_dropped += rxstats->rx_dropped;
+
+		do {
+			start = u64_stats_fetch_begin(&txstats->syncp);
+
+			packets = txstats->tx_frms;
+			bytes   = txstats->tx_bytes;
+		} while (u64_stats_fetch_retry(&txstats->syncp, start));
+
+		net_stats->tx_packets += packets;
+		net_stats->tx_bytes += bytes;
+		net_stats->tx_errors += txstats->tx_errors;
 	}
 
 	return net_stats;
--- a/drivers/net/vxge/vxge-main.h	2011-06-20 11:46:33.195996108 -0700
+++ b/drivers/net/vxge/vxge-main.h	2011-06-20 12:16:35.527995099 -0700
@@ -201,30 +201,14 @@ struct vxge_msix_entry {
 /* Software Statistics */
 
 struct vxge_sw_stats {
-	/* Network Stats (interface stats) */
-
-	/* Tx */
-	u64 tx_frms;
-	u64 tx_errors;
-	u64 tx_bytes;
-	u64 txd_not_free;
-	u64 txd_out_of_desc;
 
 	/* Virtual Path */
-	u64 vpaths_open;
-	u64 vpath_open_fail;
-
-	/* Rx */
-	u64 rx_frms;
-	u64 rx_errors;
-	u64 rx_bytes;
-	u64 rx_mcast;
+	unsigned long vpaths_open;
+	unsigned long vpath_open_fail;
 
 	/* Misc. */
-	u64 link_up;
-	u64 link_down;
-	u64 pci_map_fail;
-	u64 skb_alloc_fail;
+	unsigned long link_up;
+	unsigned long link_down;
 };
 
 struct vxge_mac_addrs {
@@ -237,12 +221,14 @@ struct vxge_mac_addrs {
 struct vxgedev;
 
 struct vxge_fifo_stats {
+	struct u64_stats_sync	syncp;
 	u64 tx_frms;
-	u64 tx_errors;
 	u64 tx_bytes;
-	u64 txd_not_free;
-	u64 txd_out_of_desc;
-	u64 pci_map_fail;
+
+	unsigned long tx_errors;
+	unsigned long txd_not_free;
+	unsigned long txd_out_of_desc;
+	unsigned long pci_map_fail;
 };
 
 struct vxge_fifo {
@@ -264,14 +250,16 @@ struct vxge_fifo {
 } ____cacheline_aligned;
 
 struct vxge_ring_stats {
-	u64 prev_rx_frms;
+	struct u64_stats_sync syncp;
 	u64 rx_frms;
-	u64 rx_errors;
-	u64 rx_dropped;
-	u64 rx_bytes;
 	u64 rx_mcast;
-	u64 pci_map_fail;
-	u64 skb_alloc_fail;
+	u64 rx_bytes;
+
+	unsigned long rx_errors;
+	unsigned long rx_dropped;
+	unsigned long prev_rx_frms;
+	unsigned long pci_map_fail;
+	unsigned long skb_alloc_fail;
 };
 
 struct vxge_ring {



^ permalink raw reply

* Re: [PATCH][Trivial]: ipv4, ping: Remove duplicate icmp.h include
From: Vitaliy Ivanov @ 2011-06-20 20:50 UTC (permalink / raw)
  To: David Miller
  Cc: jj@chaosbits.net, netdev@vger.kernel.org, segoon@openwall.com,
	linux-kernel@vger.kernel.org, trivial@kernel.org
In-Reply-To: <20110620.130515.1956879930278498236.davem@davemloft.net>

David,

It's already in Jiri's trivial tree.

Vitaliy

Sent from my iPhone

On Jun 20, 2011, at 23:05, David Miller <davem@davemloft.net> wrote:

> From: Jesper Juhl <jj@chaosbits.net>
> Date: Mon, 20 Jun 2011 10:31:20 +0200 (CEST)
>
>> Remove the duplicate inclusion of net/icmp.h from net/ipv4/ping.c
>>
>> Signed-off-by: Jesper Juhl <jj@chaosbits.net>
>
> Applied.
> --
> To unsubscribe from this list: send the line "unsubscribe linux- 
> kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

^ permalink raw reply

* Re: [RFT PATCH 3/9] net: ethtool: break association of ETH_FLAG_* with NETIF_F_*
From: Stephen Hemminger @ 2011-06-20 20:51 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: Michał Mirosław, netdev, David S. Miller
In-Reply-To: <1308600681.2701.159.camel@bwh-desktop>

On Mon, 20 Jun 2011 21:11:21 +0100
Ben Hutchings <bhutchings@solarflare.com> wrote:

> On Mon, 2011-06-20 at 21:14 +0200, Michał Mirosław wrote:
> > This is the only place where NETIF_F_* feature flags are exposed
> > to userspace.
> 
> Except sysfs.
> 
> > After this patch feature flags may be changed/reordered freely.
> [...]
> 
> Really, what do you think was the point of exposing features through
> sysfs if they are going to be changed?
> 
> Oh, but they have been changed already:
> 
> v2.5.70
> net-sysfs added
> 
> v2.6.15
> +#define NETIF_F_UFO             8192    /* Can offload UDP Large Send*/
> 
> v2.6.18
> -#define NETIF_F_TSO            2048    /* Can offload TCP/IP segmentation */
> -#define NETIF_F_UFO             8192    /* Can offload UDP Large Send*/
> +#define NETIF_F_GSO            2048    /* Enable software GSO. */
> +#define NETIF_F_GSO_SHIFT      16
> +#define NETIF_F_TSO            (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
> +#define NETIF_F_UFO            (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
> +#define NETIF_F_GSO_ROBUST     (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
> +#define NETIF_F_TSO_ECN                (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
> +#define NETIF_F_TSO6           (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
> 
> v2.6.23
> +#define NETIF_F_IPV6_CSUM      16      /* Can checksum TCP/UDP over IPV6 */
> +#define NETIF_F_MULTI_QUEUE    16384   /* Has multiple TX/RX queues */
> 
> v2.6.24
> +#define NETIF_F_NETNS_LOCAL    8192    /* Does not change network namespaces */
> 
> v2.6.27
> -#define NETIF_F_MULTI_QUEUE    16384   /* Has multiple TX/RX queues */
> 
> v2.6.29
> +#define NETIF_F_GRO            16384   /* Generic receive offload */
> 
> (I've omitted changes that use previously unused bits.)
> 
> If we're going to keep changing features (maybe even more often) then we
> have to do something about this sysfs attribute.  Maybe get rid of it
> (as it seems not to be widely used, thankfully).  Maybe fix it to use
> the same feature values as today, but no new features.  But certainly
> don't pretend that feature flags are not exposed.
> 
> Ben.
> 


I have no problem with dropping or changing the sysfs feature output.
It is useful to have a way to check if device supports something. Sysfs
predates the feature support bits of ethtool. As long as ethtool supports
it then I am fine with that.

It would be nice to have a non-grotty way of doing something like:
  if ethtool eth0 --supports gro 
  then
       ...
  fi


^ permalink raw reply

* Re: [RFT PATCH 3/9] net: ethtool: break association of ETH_FLAG_* with NETIF_F_*
From: David Miller @ 2011-06-20 20:52 UTC (permalink / raw)
  To: shemminger; +Cc: bhutchings, mirq-linux, netdev
In-Reply-To: <20110620135109.63d81d83@nehalam.ftrdhcpuser.net>

From: Stephen Hemminger <shemminger@vyatta.com>
Date: Mon, 20 Jun 2011 13:51:09 -0700

> I have no problem with dropping or changing the sysfs feature output.
> It is useful to have a way to check if device supports something.

These days that's not even where we store the "capabilities" of the
device.

That happens in ->hw_features now.

^ permalink raw reply

* Re: [PATCH][Trivial]: ipv4, ping: Remove duplicate icmp.h include
From: David Miller @ 2011-06-20 20:52 UTC (permalink / raw)
  To: vitalivanov; +Cc: jj, netdev, segoon, linux-kernel, trivial
In-Reply-To: <415E440A-6C7F-4ADB-AE81-05AEAD5C3269@gmail.com>

From: Vitaliy Ivanov <vitalivanov@gmail.com>
Date: Mon, 20 Jun 2011 23:50:38 +0300

> It's already in Jiri's trivial tree.

And now it's in mine, no harm :-)

^ permalink raw reply

* Re: [PATCH][Trivial]: ipv4, ping: Remove duplicate icmp.h include
From: Jiri Kosina @ 2011-06-20 20:53 UTC (permalink / raw)
  To: Vitaliy Ivanov
  Cc: David Miller, jj@chaosbits.net, netdev@vger.kernel.org,
	segoon@openwall.com, linux-kernel@vger.kernel.org
In-Reply-To: <415E440A-6C7F-4ADB-AE81-05AEAD5C3269@gmail.com>

On Mon, 20 Jun 2011, Vitaliy Ivanov wrote:

> David,
> 
> It's already in Jiri's trivial tree.

Yeah, it's in my tree as part of larger tree-wide patch.

But that's not a problem really, git can handle that just perfectly well.

-- 
Jiri Kosina
SUSE Labs

^ permalink raw reply

* Re: [PATCH V3 10/11] mv643xx_eth: enable transmit time stamping.
From: David Miller @ 2011-06-20 20:55 UTC (permalink / raw)
  To: buytenh; +Cc: richardcochran, netdev, eric.dumazet
In-Reply-To: <20110620163524.GD994@wantstofly.org>

From: Lennert Buytenhek <buytenh@wantstofly.org>
Date: Mon, 20 Jun 2011 18:35:24 +0200

> On Mon, Jun 20, 2011 at 09:51:32AM +0200, Richard Cochran wrote:
> 
>> This patch enables software (and phy device) transmit time stamping.
>> Compile tested only.
>> 
>> Cc: Lennert Buytenhek <buytenh@wantstofly.org>
>> Signed-off-by: Richard Cochran <richard.cochran@omicron.at>
>> ---
>>  drivers/net/mv643xx_eth.c |    2 ++
>>  1 files changed, 2 insertions(+), 0 deletions(-)
>> 
>> diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
>> index 1b7d2c1..3671714 100644
>> --- a/drivers/net/mv643xx_eth.c
>> +++ b/drivers/net/mv643xx_eth.c
>> @@ -847,6 +847,8 @@ no_csum:
>>  	/* clear TX_END status */
>>  	mp->work_tx_end &= ~(1 << txq->index);
>>  
>> +	skb_tx_timestamp(skb);
>> +
>>  	/* ensure all descriptors are written before poking hardware */
>>  	wmb();
>>  	txq_enable(txq);
> 
> This only timestamps the skb _after_ writing the final (cmd_sts) HW TX
> descriptor word, and so if your previous patch is correct (which I don't
> think it is), this would be buggy as well.

Agreed.

I'll apply the other patches and leave this one for now.

^ permalink raw reply

* Re: [PATCH net-next 0/5] more statistics updates
From: David Miller @ 2011-06-20 20:56 UTC (permalink / raw)
  To: shemminger; +Cc: netdev
In-Reply-To: <20110620203506.363818794@vyatta.com>

From: Stephen Hemminger <shemminger@vyatta.com>
Date: Mon, 20 Jun 2011 13:35:06 -0700

> Fix drivers that are using 64 bit statistics with unsafe access on 32 bit.
> These are compile tested only, because the hardware to test it is not
> easily available.

Where is patch #5?

^ permalink raw reply

* Re: [PATCH V3 00/11] net: expand time stamping, batch #2
From: David Miller @ 2011-06-20 20:57 UTC (permalink / raw)
  To: richardcochran; +Cc: netdev, eric.dumazet
In-Reply-To: <cover.1308556146.git.richard.cochran@omicron.at>

From: Richard Cochran <richardcochran@gmail.com>
Date: Mon, 20 Jun 2011 09:51:22 +0200

> This patch series represents a continuation of the effort to get
> better coverage of the SO_TIMESTAMPING socket API in the Ethernet
> drivers.  Adding time stamping support to a given driver solves two
> separate issues, namely software transmit time stamping and hardware
> time stamping in PHY devices.
> 
> This second batch adds the hooks into all remaining (?) arm and
> powerpc MAC drivers using phylib. The first patch exports the receive
> hook for use by non-NAPI drivers when compiled as modules. Patch #5
> has been tested on real hardware, but the rest have only been compile
> tested.

All except patch #10 applied, thanks.

^ permalink raw reply

* Re: [PATCH] gianfar v5: implement nfc
From: David Miller @ 2011-06-20 20:58 UTC (permalink / raw)
  To: sebastian.belden; +Cc: netdev, sebastian.poehn, joe
In-Reply-To: <1308562782.12794.6.camel@DENEC1DT0191>

From: "Sebastian Pöhn" <sebastian.belden@googlemail.com>
Date: Mon, 20 Jun 2011 11:39:42 +0200

> This patch adds all missing functionalities for nfc except GRXFH. There is so much code because hardware has not a TCAM.
> Further hardware rule space is very limited. So I had to extensively use
> optimization features. Both reasons lead to the necessity to hold all
> online flows in a linked-list.
> 
> Change-log:
> # Some suggestions by Joe Perches applied (thanks!)
> # Shorted some logs
> # Use memcmp() for comparing
> 
> Signed-off-by: Sebastian Poehn <sebastian.poehn@belden.com>

Applied, thanks.

^ permalink raw reply

* Re: [RFT PATCH 4/9] net: introduce and use netdev_features_t for device features sets
From: Ben Hutchings @ 2011-06-20 21:01 UTC (permalink / raw)
  To: Michał Mirosław; +Cc: netdev, David S. Miller
In-Reply-To: <24e8026de1130f193dc82315f83ad64fcce771d8.1308596963.git.mirq-linux@rere.qmqm.pl>

On Mon, 2011-06-20 at 21:14 +0200, Michał Mirosław wrote:
> The type and bits definitions are moved to separate header so that
> linux/skbuff.h won't need to include linux/netdevice.h.
[...]
> diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c
> index c914729..ca869c0 100644
> --- a/drivers/net/sfc/efx.c
> +++ b/drivers/net/sfc/efx.c
> @@ -1883,7 +1883,7 @@ static void efx_set_multicast_list(struct net_device *net_dev)
>  	/* Otherwise efx_start_port() will do this */
>  }
>  
> -static int efx_set_features(struct net_device *net_dev, u32 data)
> +static int efx_set_features(struct net_device *net_dev, netdev_features_t data)
>  {
>  	struct efx_nic *efx = netdev_priv(net_dev);
>  

The type of efx_nic_type::offload_features, defined in
drivers/net/sfc/net_driver.h, will also need to be changed.

[...]
> --- /dev/null
> +++ b/include/linux/netdev_features.h
[...]
> +	/* Segmentation offload features */
[...]
> +	/* Features valid for ethtool to change */
> +	/* = all defined minus driver/device-class-related */
[...]
> +	/* List of features with software fallbacks. */
[...]
> +	/*
> +	 * If one device supports one of these features, then enable them
> +	 * for all in netdev_increment_features.
> +	 */
[...]
> +	/*
> +	 * If one device doesn't support one of these features, then disable it
> +	 * for all in netdev_increment_features.
> +	 */
[...]
> +	/* changeable features with no special hardware requirements */
[...]

A cosmetic detail: these comments should no longer be indented.

[...]
> diff --git a/net/core/dev.c b/net/core/dev.c
> index 3041b6ae..a5a0e76 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
[...]
> @@ -1872,8 +1872,8 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features)
>  		if (dev && dev->ethtool_ops && dev->ethtool_ops->get_drvinfo)
>  			dev->ethtool_ops->get_drvinfo(dev, &info);
>  
> -		WARN(1, "%s: caps=(0x%lx, 0x%lx) len=%d data_len=%d ip_summed=%d\n",
> -		     info.driver, dev ? dev->features : 0L,
> +		WARN(1, "%s: caps=(0x%llx, 0x%lx) len=%d data_len=%d ip_summed=%d\n",
> +		     info.driver, dev ? (long long)dev->features : 0LL,
> 		     skb->sk ? skb->sk->sk_route_caps : 0L,
> 		     skb->len, skb->data_len, skb->ip_summed);

The types of sock::sk_route_caps and sock::sk_route_nocaps also need to
be fixed (they are still int and not even unsigned!).

[...]
> @@ -5250,11 +5252,10 @@ u32 netdev_fix_features(struct net_device *dev, u32 features)
>  
>  	return features;
>  }
> -EXPORT_SYMBOL(netdev_fix_features);

I don't think that change belongs in this patch!

[...]
> @@ -5270,8 +5271,10 @@ int __netdev_update_features(struct net_device *dev)
>  	if (dev->features == features)
>  		return 0;
>  
> +	BUILD_BUG_ON(sizeof(features) != sizeof(u32));	/* XXX: need: %Fx */
> +
>  	netdev_dbg(dev, "Features changed: 0x%08x -> 0x%08x\n",
> -		dev->features, features);
> +		(u32)dev->features, (u32)features);
[...]

You could either define macros for this:

#define NETDEV_FEATURES_FMT			"0x%08x"
#define NETDEV_FEATURES_FMT_ARG(features)	features

or follow the current trend of extending %p and passing a pointer to the
value.

Ben.

-- 
Ben Hutchings, Senior Software Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.


^ permalink raw reply

* Re: [PATCH 1/2] pxa168_eth: fix race in transmit path.
From: David Miller @ 2011-06-20 21:02 UTC (permalink / raw)
  To: eric.dumazet; +Cc: richardcochran, netdev, stable, ssanap, zgao6, prakity
In-Reply-To: <1308584957.26922.7.camel@edumazet-HP-Compaq-6005-Pro-SFF-PC>

From: Eric Dumazet <eric.dumazet@gmail.com>
Date: Mon, 20 Jun 2011 17:49:17 +0200

> Le lundi 20 juin 2011 à 09:48 +0200, Richard Cochran a écrit :
>> Because the socket buffer is freed in the completion interrupt, it is not
>> safe to access it after submitting it to the hardware.
>> 
>> Cc: stable@kernel.org
>> Cc: Sachin Sanap <ssanap@marvell.com>
>> Cc: Zhangfei Gao <zgao6@marvell.com>
>> Cc: Philip Rakity <prakity@marvell.com>
>> Signed-off-by: Richard Cochran <richard.cochran@omicron.at>
> 
> Acked-by: Eric Dumazet <eric.dumazet@gmail.com>

Applied.

^ permalink raw reply

* Re: [PATCH] netlink: advertise incomplete dumps
From: David Miller @ 2011-06-20 20:59 UTC (permalink / raw)
  To: johannes; +Cc: netdev, linux-wireless, samuel, aloisio.almeida, linville, tgraf
In-Reply-To: <1308570046.4322.5.camel@jlt3.sipsolutions.net>

From: Johannes Berg <johannes@sipsolutions.net>
Date: Mon, 20 Jun 2011 13:40:46 +0200

> Should we merge this through wireless? From wireless-next it'll go into
> net-next quickly, but the converse isn't true, so using it in wireless
> would be harder if it was merged through net-next I think? Or John can
> cherry-pick into wireless-testing?

I'm fine with this going in via the wireless tree, that way we'll
see a real user when it merged into net-next-2.6

Acked-by: David S. Miller <davem@davemloft.net>

^ permalink raw reply

* [PATCH 0/1] DSA: Enable cascading for multiple 6131 chips
From: Barry Grussling @ 2011-06-20 20:40 UTC (permalink / raw)
  To: netdev; +Cc: buytenh, Barry Grussling

I found that the Cascade Port field of the 6131 was always set
to 0xe which results in from_cpu frames being discarded.  This
means cascading style multi chip DSA configuration didn't work
for me.  I am a little confused by this since we configure the 
DSA routing table a little further down in the function.  

It seems like we need to enable cascading by setting the 
Cascade Port field to 0xf if we are in a multi-chip scenario.

Barry Grussling (1):
  Allow cascading to work with 6131 chip

 net/dsa/mv88e6131.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)


^ permalink raw reply

* [PATCH net-next 5/5] ifb: convert to 64 bit stats
From: Stephen Hemminger @ 2011-06-20 21:12 UTC (permalink / raw)
  To: David Miller, jamal; +Cc: netdev
In-Reply-To: <20110620.135607.2158729745388010853.davem@davemloft.net>

Convert input functional block device to use 64 bit stats.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>

---
v2 - add stats_sync


--- a/drivers/net/ifb.c	2011-06-20 13:38:54.271992329 -0700
+++ b/drivers/net/ifb.c	2011-06-20 14:11:30.935991232 -0700
@@ -41,8 +41,16 @@
 struct ifb_private {
 	struct tasklet_struct   ifb_tasklet;
 	int     tasklet_pending;
+
+	struct u64_stats_sync	stats_sync;
+
 	struct sk_buff_head     rq;
+	u64 rx_packets;
+	u64 rx_bytes;
+
 	struct sk_buff_head     tq;
+	u64 tx_packets;
+	u64 tx_bytes;
 };
 
 static int numifbs = 2;
@@ -54,10 +62,8 @@ static int ifb_close(struct net_device *
 
 static void ri_tasklet(unsigned long dev)
 {
-
 	struct net_device *_dev = (struct net_device *)dev;
 	struct ifb_private *dp = netdev_priv(_dev);
-	struct net_device_stats *stats = &_dev->stats;
 	struct netdev_queue *txq;
 	struct sk_buff *skb;
 
@@ -77,15 +83,18 @@ static void ri_tasklet(unsigned long dev
 
 		skb->tc_verd = 0;
 		skb->tc_verd = SET_TC_NCLS(skb->tc_verd);
-		stats->tx_packets++;
-		stats->tx_bytes +=skb->len;
+
+		u64_stats_update_begin(&dp->stats_sync);
+		dp->tx_packets++;
+		dp->tx_bytes += skb->len;
+		u64_stats_update_end(&dp->stats_sync);
 
 		rcu_read_lock();
 		skb->dev = dev_get_by_index_rcu(&init_net, skb->skb_iif);
 		if (!skb->dev) {
 			rcu_read_unlock();
 			dev_kfree_skb(skb);
-			stats->tx_dropped++;
+			_dev->stats.tx_dropped++;
 			if (skb_queue_len(&dp->tq) != 0)
 				goto resched;
 			break;
@@ -120,9 +129,33 @@ resched:
 
 }
 
+static struct rtnl_link_stats64 *ifb_stats64(struct net_device *dev,
+					     struct rtnl_link_stats64 *stats)
+{
+	struct ifb_private *dp = netdev_priv(dev);
+	unsigned int start;
+
+	do {
+		start = u64_stats_fetch_begin_bh(&dp->stats_sync);
+
+		stats->rx_packets = dp->rx_packets;
+		stats->rx_bytes = dp->rx_bytes;
+		stats->tx_packets = dp->tx_packets;
+		stats->tx_bytes = dp->tx_bytes;
+
+	} while (u64_stats_fetch_retry_bh(&dp->stats_sync, start));
+
+	stats->rx_dropped = dev->stats.rx_dropped;
+	stats->tx_dropped = dev->stats.tx_dropped;
+
+	return stats;
+}
+
+
 static const struct net_device_ops ifb_netdev_ops = {
 	.ndo_open	= ifb_open,
 	.ndo_stop	= ifb_close,
+	.ndo_get_stats64 = ifb_stats64,
 	.ndo_start_xmit	= ifb_xmit,
 	.ndo_validate_addr = eth_validate_addr,
 };
@@ -153,15 +186,16 @@ static void ifb_setup(struct net_device
 static netdev_tx_t ifb_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct ifb_private *dp = netdev_priv(dev);
-	struct net_device_stats *stats = &dev->stats;
 	u32 from = G_TC_FROM(skb->tc_verd);
 
-	stats->rx_packets++;
-	stats->rx_bytes+=skb->len;
+	u64_stats_update_begin(&dp->stats_sync);
+	dp->rx_packets++;
+	dp->rx_bytes += skb->len;
+	u64_stats_update_end(&dp->stats_sync);
 
 	if (!(from & (AT_INGRESS|AT_EGRESS)) || !skb->skb_iif) {
 		dev_kfree_skb(skb);
-		stats->rx_dropped++;
+		dev->stats.rx_dropped++;
 		return NETDEV_TX_OK;
 	}
 

^ permalink raw reply

* [PATCH 1/1] Allow cascading to work with 6131 chip
From: Barry Grussling @ 2011-06-20 20:40 UTC (permalink / raw)
  To: netdev; +Cc: buytenh, Barry Grussling
In-Reply-To: <1308602433-31320-1-git-send-email-barry@grussling.com>

---
 net/dsa/mv88e6131.c |    8 ++++++--
 1 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/net/dsa/mv88e6131.c b/net/dsa/mv88e6131.c
index 45f7411..1a1d1d1 100644
--- a/net/dsa/mv88e6131.c
+++ b/net/dsa/mv88e6131.c
@@ -118,10 +118,14 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)
 	REG_WRITE(REG_GLOBAL, 0x1a, (dsa_upstream_port(ds) * 0x1100) | 0x00f0);
 
 	/*
-	 * Disable cascade port functionality, and set the switch's
+	 * Disable cascade port functionality unless this device is
+    * used in a cascade configuration, and set the switch's
 	 * DSA device number.
 	 */
-	REG_WRITE(REG_GLOBAL, 0x1c, 0xe000 | (ds->index & 0x1f));
+   if (ds->dst->pd->nr_chips > 1)
+      REG_WRITE(REG_GLOBAL, 0x1c, 0xf000 | (ds->index & 0x1f));
+   else
+      REG_WRITE(REG_GLOBAL, 0x1c, 0xe000 | (ds->index & 0x1f));
 
 	/*
 	 * Send all frames with destination addresses matching
-- 
1.7.0.4


^ permalink raw reply related

* Re: [RFT PATCH 7/9] ethtool: prepare for larger netdev_features_t type
From: Ben Hutchings @ 2011-06-20 21:16 UTC (permalink / raw)
  To: Michał Mirosław; +Cc: netdev, David S. Miller
In-Reply-To: <852a74b9068b3be7413a65023f6096f142dfd805.1308596963.git.mirq-linux@rere.qmqm.pl>

On Mon, 2011-06-20 at 21:14 +0200, Michał Mirosław wrote:
[...]
> @@ -125,19 +131,26 @@ static int ethtool_set_features(struct net_device *dev, void __user *useraddr)
>  	if (copy_from_user(features, useraddr, sizeof(features)))
>  		return -EFAULT;
>  
> -	if (features[0].valid & ~NETIF_F_ETHTOOL_BITS)
> +	/* I wonder if the compiler will be smart enough to loop-unroll
> +	 * and optimize this... (no worries if not) --mq */
> +	for (i = ETHTOOL_DEV_FEATURE_WORDS; i-- > 0; ) {
> +		valid = (valid << 32)|features[i].valid;
> +		wanted = (wanted << 32)|features[i].requested;
> +	}
[...]

I don't know (or care) about optimisation of this, but I would expect
gcc to complain about shifting a 32-bit value by 32 bits.  I suggest you
write this as:

	for (i = 0; i < ETHTOOL_DEV_FEATURE_WORDS; ++i) {
		valid |= (netdev_features_t)features[i].valid << 32 *i;
		wanted |= (netdev_features_t)features[i].requested << 32 *i;
	}

Ben.

-- 
Ben Hutchings, Senior Software Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.


^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox