From 1c213bd24ad04f4430031d20d740d7783162b099 Mon Sep 17 00:00:00 2001 From: WANG Cong Date: Thu, 13 Feb 2014 11:46:28 -0800 Subject: net: introduce netdev_alloc_pcpu_stats() for drivers There are many drivers calling alloc_percpu() to allocate pcpu stats and then initializing ->syncp. So just introduce a helper function for them. Cc: David S. Miller Signed-off-by: Cong Wang Signed-off-by: David S. Miller --- drivers/net/nlmon.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) (limited to 'drivers/net/nlmon.c') diff --git a/drivers/net/nlmon.c b/drivers/net/nlmon.c index d2bb12bfabd5..14ce7de6a933 100644 --- a/drivers/net/nlmon.c +++ b/drivers/net/nlmon.c @@ -47,16 +47,7 @@ static int nlmon_change_mtu(struct net_device *dev, int new_mtu) static int nlmon_dev_init(struct net_device *dev) { - int i; - - dev->lstats = alloc_percpu(struct pcpu_lstats); - - for_each_possible_cpu(i) { - struct pcpu_lstats *nlmstats; - nlmstats = per_cpu_ptr(dev->lstats, i); - u64_stats_init(&nlmstats->syncp); - } - + dev->lstats = netdev_alloc_pcpu_stats(struct pcpu_lstats); return dev->lstats == NULL ? -ENOMEM : 0; } -- cgit v1.2.3 From 57a7744e09867ebcfa0ccf1d6d529caa7728d552 Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Thu, 13 Mar 2014 21:26:42 -0700 Subject: net: Replace u64_stats_fetch_begin_bh to u64_stats_fetch_begin_irq Replace the bh safe variant with the hard irq safe variant. We need a hard irq safe variant to deal with netpoll transmitting packets from hard irq context, and we need it in most if not all of the places using the bh safe variant. Except on 32bit uni-processor the code is exactly the same so don't bother with a bh variant, just have a hard irq safe variant that everyone can use. Signed-off-by: "Eric W. Biederman" Signed-off-by: David S. Miller --- drivers/net/nlmon.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/net/nlmon.c') diff --git a/drivers/net/nlmon.c b/drivers/net/nlmon.c index 14ce7de6a933..6929b03ec638 100644 --- a/drivers/net/nlmon.c +++ b/drivers/net/nlmon.c @@ -90,10 +90,10 @@ nlmon_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) nl_stats = per_cpu_ptr(dev->lstats, i); do { - start = u64_stats_fetch_begin_bh(&nl_stats->syncp); + start = u64_stats_fetch_begin_irq(&nl_stats->syncp); tbytes = nl_stats->bytes; tpackets = nl_stats->packets; - } while (u64_stats_fetch_retry_bh(&nl_stats->syncp, start)); + } while (u64_stats_fetch_retry_irq(&nl_stats->syncp, start)); packets += tpackets; bytes += tbytes; -- cgit v1.2.3 From b7d47ca2fdfd3b613b800c923553a8437dd8da40 Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Thu, 27 Mar 2014 16:34:59 +0100 Subject: net: nlmon: flag nlmon devs with LLTX/SG As in xmit path we merely update statistics and free the skb, we can mark the device with LLTX feature, so that upper layers can avoid taking the single txq lock on xmit. While at it, also add missing NETIF_F_SG. Signed-off-by: Daniel Borkmann Acked-by: Eric Dumazet Signed-off-by: David S. Miller --- drivers/net/nlmon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/net/nlmon.c') diff --git a/drivers/net/nlmon.c b/drivers/net/nlmon.c index 6929b03ec638..34924dfadd00 100644 --- a/drivers/net/nlmon.c +++ b/drivers/net/nlmon.c @@ -136,7 +136,8 @@ static void nlmon_setup(struct net_device *dev) dev->ethtool_ops = &nlmon_ethtool_ops; dev->destructor = free_netdev; - dev->features = NETIF_F_FRAGLIST | NETIF_F_HIGHDMA; + dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | + NETIF_F_HIGHDMA | NETIF_F_LLTX; dev->flags = IFF_NOARP; /* That's rather a softlimit here, which, of course, -- cgit v1.2.3