| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *		SNMP MIB entries for the IP subsystem. | 
					
						
							|  |  |  |  *		 | 
					
						
							|  |  |  |  *		Alan Cox <gw4pts@gw4pts.ampr.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *		We don't chose to implement SNMP in the kernel (this would | 
					
						
							|  |  |  |  *		be silly as SNMP is a pain in the backside in places). We do | 
					
						
							|  |  |  |  *		however need to collect the MIB statistics and export them | 
					
						
							|  |  |  |  *		out of /proc (eventually) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *		This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  *		modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  *		as published by the Free Software Foundation; either version | 
					
						
							|  |  |  |  *		2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  |   | 
					
						
							|  |  |  | #ifndef _SNMP_H
 | 
					
						
							|  |  |  | #define _SNMP_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/cache.h>
 | 
					
						
							|  |  |  | #include <linux/snmp.h>
 | 
					
						
							| 
									
										
										
										
											2007-12-20 04:13:21 -08:00
										 |  |  | #include <linux/smp.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Mibs are stored in array of unsigned long. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * struct snmp_mib{} | 
					
						
							|  |  |  |  *  - list of entries for particular API (such as /proc/net/snmp) | 
					
						
							|  |  |  |  *  - name of entries. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct snmp_mib { | 
					
						
							| 
									
										
										
										
											2010-01-22 10:17:26 +00:00
										 |  |  | 	const char *name; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	int entry; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SNMP_MIB_ITEM(_name,_entry)	{	\
 | 
					
						
							|  |  |  | 	.name = _name,				\ | 
					
						
							|  |  |  | 	.entry = _entry,			\ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SNMP_MIB_SENTINEL {	\
 | 
					
						
							|  |  |  | 	.name = NULL,		\ | 
					
						
							|  |  |  | 	.entry = 0,		\ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  |  * We use unsigned longs for most mibs but u64 for ipstats. | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | #include <linux/u64_stats_sync.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* IPstats */ | 
					
						
							|  |  |  | #define IPSTATS_MIB_MAX	__IPSTATS_MIB_MAX
 | 
					
						
							|  |  |  | struct ipstats_mib { | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | 	/* mibs[] must be first field of struct ipstats_mib */ | 
					
						
							|  |  |  | 	u64		mibs[IPSTATS_MIB_MAX]; | 
					
						
							|  |  |  | 	struct u64_stats_sync syncp; | 
					
						
							| 
									
										
										
										
											2010-03-18 20:36:06 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ICMP */ | 
					
						
							| 
									
										
										
										
											2010-12-01 18:04:43 +00:00
										 |  |  | #define ICMP_MIB_MAX	__ICMP_MIB_MAX
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | struct icmp_mib { | 
					
						
							|  |  |  | 	unsigned long	mibs[ICMP_MIB_MAX]; | 
					
						
							| 
									
										
										
										
											2010-03-18 20:36:06 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-17 09:57:33 -07:00
										 |  |  | #define ICMPMSG_MIB_MAX	__ICMPMSG_MIB_MAX
 | 
					
						
							|  |  |  | struct icmpmsg_mib { | 
					
						
							| 
									
										
										
										
											2011-11-08 13:04:43 +00:00
										 |  |  | 	atomic_long_t	mibs[ICMPMSG_MIB_MAX]; | 
					
						
							| 
									
										
										
										
											2010-03-18 20:36:06 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2007-09-17 09:57:33 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* ICMP6 (IPv6-ICMP) */ | 
					
						
							|  |  |  | #define ICMP6_MIB_MAX	__ICMP6_MIB_MAX
 | 
					
						
							| 
									
										
										
										
											2011-05-19 01:14:23 +00:00
										 |  |  | /* per network ns counters */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | struct icmpv6_mib { | 
					
						
							|  |  |  | 	unsigned long	mibs[ICMP6_MIB_MAX]; | 
					
						
							| 
									
										
										
										
											2010-03-18 20:36:06 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2011-05-19 01:14:23 +00:00
										 |  |  | /* per device counters, (shared on all cpus) */ | 
					
						
							|  |  |  | struct icmpv6_mib_device { | 
					
						
							|  |  |  | 	atomic_long_t	mibs[ICMP6_MIB_MAX]; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-16 16:52:35 -07:00
										 |  |  | #define ICMP6MSG_MIB_MAX  __ICMP6MSG_MIB_MAX
 | 
					
						
							| 
									
										
										
										
											2011-05-19 01:14:23 +00:00
										 |  |  | /* per network ns counters */ | 
					
						
							| 
									
										
										
										
											2007-09-16 16:52:35 -07:00
										 |  |  | struct icmpv6msg_mib { | 
					
						
							| 
									
										
										
										
											2011-11-13 01:24:04 +00:00
										 |  |  | 	atomic_long_t	mibs[ICMP6MSG_MIB_MAX]; | 
					
						
							| 
									
										
										
										
											2010-03-18 20:36:06 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2011-05-19 01:14:23 +00:00
										 |  |  | /* per device counters, (shared on all cpus) */ | 
					
						
							|  |  |  | struct icmpv6msg_mib_device { | 
					
						
							|  |  |  | 	atomic_long_t	mibs[ICMP6MSG_MIB_MAX]; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2007-09-16 16:52:35 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* TCP */ | 
					
						
							|  |  |  | #define TCP_MIB_MAX	__TCP_MIB_MAX
 | 
					
						
							|  |  |  | struct tcp_mib { | 
					
						
							|  |  |  | 	unsigned long	mibs[TCP_MIB_MAX]; | 
					
						
							| 
									
										
										
										
											2010-03-18 20:36:06 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* UDP */ | 
					
						
							|  |  |  | #define UDP_MIB_MAX	__UDP_MIB_MAX
 | 
					
						
							|  |  |  | struct udp_mib { | 
					
						
							|  |  |  | 	unsigned long	mibs[UDP_MIB_MAX]; | 
					
						
							| 
									
										
										
										
											2010-03-18 20:36:06 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Linux */ | 
					
						
							|  |  |  | #define LINUX_MIB_MAX	__LINUX_MIB_MAX
 | 
					
						
							|  |  |  | struct linux_mib { | 
					
						
							|  |  |  | 	unsigned long	mibs[LINUX_MIB_MAX]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-20 20:42:57 -08:00
										 |  |  | /* Linux Xfrm */ | 
					
						
							|  |  |  | #define LINUX_MIB_XFRMMAX	__LINUX_MIB_XFRMMAX
 | 
					
						
							|  |  |  | struct linux_xfrm_mib { | 
					
						
							|  |  |  | 	unsigned long	mibs[LINUX_MIB_XFRMMAX]; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define DEFINE_SNMP_STAT(type, name)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 	__typeof__(type) __percpu *name | 
					
						
							| 
									
										
										
										
											2011-05-19 01:14:23 +00:00
										 |  |  | #define DEFINE_SNMP_STAT_ATOMIC(type, name)	\
 | 
					
						
							|  |  |  | 	__typeof__(type) *name | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #define DECLARE_SNMP_STAT(type, name)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 	extern __typeof__(type) __percpu *name | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 19:48:22 +09:00
										 |  |  | #define SNMP_INC_STATS_BH(mib, field)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 			__this_cpu_inc(mib->mibs[field]) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 19:48:22 +09:00
										 |  |  | #define SNMP_INC_STATS_USER(mib, field)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 			this_cpu_inc(mib->mibs[field]) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-19 01:14:23 +00:00
										 |  |  | #define SNMP_INC_STATS_ATOMIC_LONG(mib, field)	\
 | 
					
						
							|  |  |  | 			atomic_long_inc(&mib->mibs[field]) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 19:48:22 +09:00
										 |  |  | #define SNMP_INC_STATS(mib, field)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 			this_cpu_inc(mib->mibs[field]) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 19:48:22 +09:00
										 |  |  | #define SNMP_DEC_STATS(mib, field)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 			this_cpu_dec(mib->mibs[field]) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 19:48:22 +09:00
										 |  |  | #define SNMP_ADD_STATS_BH(mib, field, addend)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 			__this_cpu_add(mib->mibs[field], addend) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-03 19:48:22 +09:00
										 |  |  | #define SNMP_ADD_STATS_USER(mib, field, addend)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 			this_cpu_add(mib->mibs[field], addend) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-22 07:00:24 +00:00
										 |  |  | #define SNMP_ADD_STATS(mib, field, addend)	\
 | 
					
						
							| 
									
										
										
										
											2014-05-05 15:55:55 -07:00
										 |  |  | 			this_cpu_add(mib->mibs[field], addend) | 
					
						
							| 
									
										
										
										
											2009-04-27 02:45:02 -07:00
										 |  |  | #define SNMP_UPD_PO_STATS(mib, basefield, addend)	\
 | 
					
						
							|  |  |  | 	do { \ | 
					
						
							| 
									
										
										
										
											2014-09-17 23:23:12 +02:00
										 |  |  | 		__typeof__((mib->mibs) + 0) ptr = mib->mibs;	\ | 
					
						
							| 
									
										
										
										
											2012-08-04 20:26:13 +00:00
										 |  |  | 		this_cpu_inc(ptr[basefield##PKTS]);		\ | 
					
						
							|  |  |  | 		this_cpu_add(ptr[basefield##OCTETS], addend);	\ | 
					
						
							| 
									
										
										
										
											2009-04-27 02:45:02 -07:00
										 |  |  | 	} while (0) | 
					
						
							|  |  |  | #define SNMP_UPD_PO_STATS_BH(mib, basefield, addend)	\
 | 
					
						
							|  |  |  | 	do { \ | 
					
						
							| 
									
										
										
										
											2014-09-17 23:23:12 +02:00
										 |  |  | 		__typeof__((mib->mibs) + 0) ptr = mib->mibs;	\ | 
					
						
							| 
									
										
										
										
											2012-08-04 20:26:13 +00:00
										 |  |  | 		__this_cpu_inc(ptr[basefield##PKTS]);		\ | 
					
						
							|  |  |  | 		__this_cpu_add(ptr[basefield##OCTETS], addend);	\ | 
					
						
							| 
									
										
										
										
											2009-04-27 02:45:02 -07:00
										 |  |  | 	} while (0) | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if BITS_PER_LONG==32
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define SNMP_ADD_STATS64_BH(mib, field, addend) 			\
 | 
					
						
							|  |  |  | 	do {								\ | 
					
						
							| 
									
										
										
										
											2014-08-17 12:30:35 -05:00
										 |  |  | 		__typeof__(*mib) *ptr = raw_cpu_ptr(mib);		\ | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | 		u64_stats_update_begin(&ptr->syncp);			\ | 
					
						
							|  |  |  | 		ptr->mibs[field] += addend;				\ | 
					
						
							|  |  |  | 		u64_stats_update_end(&ptr->syncp);			\ | 
					
						
							|  |  |  | 	} while (0) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | #define SNMP_ADD_STATS64_USER(mib, field, addend) 			\
 | 
					
						
							|  |  |  | 	do {								\ | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 		local_bh_disable();					\ | 
					
						
							|  |  |  | 		SNMP_ADD_STATS64_BH(mib, field, addend);		\ | 
					
						
							|  |  |  | 		local_bh_enable();					\ | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | 	} while (0) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | #define SNMP_ADD_STATS64(mib, field, addend)				\
 | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | 		SNMP_ADD_STATS64_USER(mib, field, addend) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | #define SNMP_INC_STATS64_BH(mib, field) SNMP_ADD_STATS64_BH(mib, field, 1)
 | 
					
						
							|  |  |  | #define SNMP_INC_STATS64_USER(mib, field) SNMP_ADD_STATS64_USER(mib, field, 1)
 | 
					
						
							|  |  |  | #define SNMP_INC_STATS64(mib, field) SNMP_ADD_STATS64(mib, field, 1)
 | 
					
						
							|  |  |  | #define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend)			\
 | 
					
						
							|  |  |  | 	do {								\ | 
					
						
							| 
									
										
										
										
											2014-08-17 12:30:35 -05:00
										 |  |  | 		__typeof__(*mib) *ptr;				\ | 
					
						
							|  |  |  | 		ptr = raw_cpu_ptr((mib));				\ | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | 		u64_stats_update_begin(&ptr->syncp);			\ | 
					
						
							|  |  |  | 		ptr->mibs[basefield##PKTS]++;				\ | 
					
						
							|  |  |  | 		ptr->mibs[basefield##OCTETS] += addend;			\ | 
					
						
							|  |  |  | 		u64_stats_update_end(&ptr->syncp);			\ | 
					
						
							|  |  |  | 	} while (0) | 
					
						
							| 
									
										
											  
											
												snmp: reduce percpu needs by 50%
SNMP mibs use two percpu arrays, one used in BH context, another in USER
context. With increasing number of cpus in machines, and fact that ipv6
uses per network device ipstats_mib, this is consuming a lot of memory
if many network devices are registered.
commit be281e554e2a (ipv6: reduce per device ICMP mib sizes) shrinked
percpu needs for ipv6, but we can reduce memory use a bit more.
With recent percpu infrastructure (irqsafe_cpu_inc() ...), we no longer
need this BH/USER separation since we can update counters in a single
x86 instruction, regardless of the BH/USER context.
Other arches than x86 might need to disable irq in their
irqsafe_cpu_inc() implementation : If this happens to be a problem, we
can make SNMP_ARRAY_SZ arch dependent, but a previous poll
( https://lkml.org/lkml/2011/3/17/174 ) to arch maintainers did not
raise strong opposition.
Only on 32bit arches, we need to disable BH for 64bit counters updates
done from USER context (currently used for IP MIB)
This also reduces vmlinux size :
1) x86_64 build
$ size vmlinux.before vmlinux.after
   text	   data	    bss	    dec	    hex	filename
7853650	1293772	1896448	11043870	 a8841e	vmlinux.before
7850578	1293772	1896448	11040798	 a8781e	vmlinux.after
2) i386  build
$ size vmlinux.before vmlinux.afterpatch
   text	   data	    bss	    dec	    hex	filename
6039335	 635076	3670016	10344427	 9dd7eb	vmlinux.before
6037342	 635076	3670016	10342434	 9dd022	vmlinux.afterpatch
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Tejun Heo <tj@kernel.org>
CC: Christoph Lameter <cl@linux-foundation.org>
CC: Benjamin Herrenschmidt <benh@kernel.crashing.org
CC: linux-arch@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
											
										 
											2011-06-10 19:45:51 +00:00
										 |  |  | #define SNMP_UPD_PO_STATS64(mib, basefield, addend)			\
 | 
					
						
							|  |  |  | 	do {								\ | 
					
						
							|  |  |  | 		local_bh_disable();					\ | 
					
						
							|  |  |  | 		SNMP_UPD_PO_STATS64_BH(mib, basefield, addend);		\ | 
					
						
							|  |  |  | 		local_bh_enable();					\ | 
					
						
							|  |  |  | 	} while (0) | 
					
						
							| 
									
										
										
										
											2010-06-30 13:31:19 -07:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define SNMP_INC_STATS64_BH(mib, field)		SNMP_INC_STATS_BH(mib, field)
 | 
					
						
							|  |  |  | #define SNMP_INC_STATS64_USER(mib, field)	SNMP_INC_STATS_USER(mib, field)
 | 
					
						
							|  |  |  | #define SNMP_INC_STATS64(mib, field)		SNMP_INC_STATS(mib, field)
 | 
					
						
							|  |  |  | #define SNMP_DEC_STATS64(mib, field)		SNMP_DEC_STATS(mib, field)
 | 
					
						
							|  |  |  | #define SNMP_ADD_STATS64_BH(mib, field, addend) SNMP_ADD_STATS_BH(mib, field, addend)
 | 
					
						
							|  |  |  | #define SNMP_ADD_STATS64_USER(mib, field, addend) SNMP_ADD_STATS_USER(mib, field, addend)
 | 
					
						
							|  |  |  | #define SNMP_ADD_STATS64(mib, field, addend)	SNMP_ADD_STATS(mib, field, addend)
 | 
					
						
							|  |  |  | #define SNMP_UPD_PO_STATS64(mib, basefield, addend) SNMP_UPD_PO_STATS(mib, basefield, addend)
 | 
					
						
							|  |  |  | #define SNMP_UPD_PO_STATS64_BH(mib, basefield, addend) SNMP_UPD_PO_STATS_BH(mib, basefield, addend)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 |