Eric Dumazet
2f970d8357
[IPV4]: rt_cache_stat can be statically defined
...
Using __get_cpu_var(obj) is slightly faster than per_cpu_ptr(obj,
raw_smp_processor_id()).
1) Smaller code and memory use
For static and small objects, DEFINE_PER_CPU(type, object) is preferred over a
alloc_percpu() : Better and smaller code to access them, and no extra memory
(storing the pointer, and the percpu array of pointers)
x86_64 code before patch
mov 1237577(%rip),%rax # ffffffff803e5990 <rt_cache_stat>
not %rax # part of per_cpu machinery
mov %gs:0x3c,%edx # get cpu number
movslq %edx,%rdx # extend 32 bits cpu number to 64 bits
mov (%rax,%rdx,8),%rax # get the pointer for this cpu
incl 0x38(%rax)
x86_64 code after patch
mov $per_cpu__rt_cache_stat,%rdx
mov %gs:0x48,%rax # get percpu data offset
incl 0x38(%rax,%rdx,1)
2) False sharing avoidance for SMP :
For a small NR_CPUS, the array of per cpu pointers allocated in alloc_percpu()
can be <= 32 bytes. This let slab code gives a part of a cache line. If the
other part of this 64 bytes (or 128 bytes) cache line is used by a mostly
written object, we can have false sharing and expensive per_cpu_ptr() operations.
Size of rt_cache_stat is 64 bytes, so this patch is not a danger of a too big
increase of bss (in UP mode) or static per_cpu data for SMP
(PERCPU_ENOUGH_ROOM is currently 32768 bytes)
Signed-off-by: Eric Dumazet <[email protected] >
Signed-off-by: David S. Miller <[email protected] >
2006-01-17 02:54:36 -08:00
..
ipvs
[PATCH] capable/capability.h (net/)
2006-01-11 18:42:14 -08:00
netfilter
[NETFILTER]: ip_conntrack_proto_gre.c needs linux/interrupt.h
2006-01-17 02:42:02 -08:00
af_inet.c
[PATCH] capable/capability.h (net/)
2006-01-11 18:42:14 -08:00
ah4.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
arp.c
[PATCH] capable/capability.h (net/)
2006-01-11 18:42:14 -08:00
datagram.c
devinet.c
[PATCH] capable/capability.h (net/)
2006-01-11 18:42:14 -08:00
esp4.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
fib_frontend.c
x86: Work around compiler code generation bug with -Os
2006-01-14 22:08:28 -08:00
fib_hash.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
fib_lookup.h
fib_rules.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
fib_semantics.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
fib_trie.c
[IPV4] fib_trie: build fix
2006-01-03 14:38:34 -08:00
icmp.c
[NET]: Change some "if (x) BUG();" to "BUG_ON(x);"
2006-01-09 14:16:18 -08:00
igmp.c
[NET]: Remove more unneeded typecasts on *malloc()
2006-01-11 16:32:14 -08:00
inet_connection_sock.c
[ICSK]: Move v4_addr2sockaddr from TCP to icsk
2006-01-03 13:10:39 -08:00
inet_diag.c
[INET_DIAG]: Introduce sk_diag_fill
2006-01-09 14:56:56 -08:00
inet_hashtables.c
[INET]: Generalise tcp_v4_hash_connect
2006-01-03 13:10:55 -08:00
inet_timewait_sock.c
[TWSK]: Introduce struct timewait_sock_ops
2006-01-03 13:10:54 -08:00
inetpeer.c
[NET]: Change some "if (x) BUG();" to "BUG_ON(x);"
2006-01-09 14:16:18 -08:00
ip_forward.c
ip_fragment.c
[NET]: Endian-annotate struct iphdr
2006-01-06 13:24:29 -08:00
ip_gre.c
[PATCH] capable/capability.h (net/)
2006-01-11 18:42:14 -08:00
ip_input.c
[NETFILTER]: Keep conntrack reference until IPsec policy checks are done
2006-01-07 12:57:36 -08:00
ip_options.c
[PATCH] capable/capability.h (net/)
2006-01-11 18:42:14 -08:00
ip_output.c
[IPV4]: ip_output.c needs xfrm.h
2006-01-09 14:16:28 -08:00
ip_sockglue.c
[NET]: Remove more unneeded typecasts on *malloc()
2006-01-11 16:32:14 -08:00
ipcomp.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
ipconfig.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
ipip.c
[PATCH] capable/capability.h (net/)
2006-01-11 18:42:14 -08:00
ipmr.c
[PATCH] capable/capability.h (net/)
2006-01-11 18:42:14 -08:00
Kconfig
[TCP] BIC: CUBIC window growth (2.0)
2006-01-03 13:10:28 -08:00
Makefile
[NETFILTER]: net/ipv[46]/netfilter.c cleanups
2006-01-10 12:54:29 -08:00
multipath.c
multipath_drr.c
multipath_random.c
multipath_rr.c
multipath_wrandom.c
netfilter.c
[NETFILTER]: net/ipv[46]/netfilter.c cleanups
2006-01-10 12:54:29 -08:00
proc.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
protocol.c
raw.c
[NETFILTER]: Keep conntrack reference until IPsec policy checks are done
2006-01-07 12:57:36 -08:00
route.c
[IPV4]: rt_cache_stat can be statically defined
2006-01-17 02:54:36 -08:00
syncookies.c
[ICSK]: Rename struct tcp_func to struct inet_connection_sock_af_ops
2006-01-03 13:10:38 -08:00
sysctl_net_ipv4.c
[INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.h
2006-01-03 13:11:21 -08:00
tcp.c
[IP_SOCKGLUE]: Remove most of the tcp specific calls
2006-01-03 13:10:58 -08:00
tcp_bic.c
tcp_cong.c
[TCP]: less inline's
2006-01-03 16:03:49 -08:00
tcp_cubic.c
[TCP] cubic: use Newton-Raphson
2006-01-03 13:11:09 -08:00
tcp_diag.c
tcp_highspeed.c
tcp_htcp.c
tcp_hybla.c
tcp_input.c
[NET]: Change some "if (x) BUG();" to "BUG_ON(x);"
2006-01-09 14:16:18 -08:00
tcp_ipv4.c
[NETFILTER]: Keep conntrack reference until IPsec policy checks are done
2006-01-07 12:57:36 -08:00
tcp_minisocks.c
[IPV6]: Introduce inet6_timewait_sock
2006-01-03 13:10:47 -08:00
tcp_output.c
[TCP]: less inline's
2006-01-03 16:03:49 -08:00
tcp_scalable.c
tcp_timer.c
tcp_vegas.c
[TCP] tcp_vegas: Fix slow start
2006-01-04 13:59:32 -08:00
tcp_westwood.c
udp.c
[NETFILTER]: Keep conntrack reference until IPsec policy checks are done
2006-01-07 12:57:36 -08:00
xfrm4_input.c
[IPV4/6]: Netfilter IPsec input hooks
2006-01-07 12:57:31 -08:00
xfrm4_output.c
[NETFILTER]: Redo policy lookups after NAT when neccessary
2006-01-07 12:57:35 -08:00
xfrm4_policy.c
xfrm4_state.c
[XFRM]: IPsec tunnel wildcard address support
2006-01-13 14:34:36 -08:00
xfrm4_tunnel.c