diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-06-16 00:52:13 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-16 14:55:39 -0400 |
commit | 317fe0e6c5dc9448bcef41a2e31fecfd3dba7f55 (patch) | |
tree | c2a042e1c8bb96b7fdeadf658309ead1b6e8dabc /net/ipv4 | |
parent | fdb93f8ac39aa5902f3d264edd50dffcabfdd13b (diff) |
inetpeer: restore small inet_peer structures
Addition of rcu_head to struct inet_peer added 16bytes on 64bit arches.
Thats a bit unfortunate, since old size was exactly 64 bytes.
This can be solved, using an union between this rcu_head an four fields,
that are normally used only when a refcount is taken on inet_peer.
rcu_head is used only when refcnt=-1, right before structure freeing.
Add a inet_peer_refcheck() function to check this assertion for a while.
We can bring back SLAB_HWCACHE_ALIGN qualifier in kmem cache creation.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/inetpeer.c | 4 | ||||
-rw-r--r-- | net/ipv4/route.c | 1 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 11 |
3 files changed, 10 insertions, 6 deletions
diff --git a/net/ipv4/inetpeer.c b/net/ipv4/inetpeer.c index 349249fad2db..9ffa24b9a804 100644 --- a/net/ipv4/inetpeer.c +++ b/net/ipv4/inetpeer.c | |||
@@ -64,7 +64,7 @@ | |||
64 | * usually under some other lock to prevent node disappearing | 64 | * usually under some other lock to prevent node disappearing |
65 | * dtime: unused node list lock | 65 | * dtime: unused node list lock |
66 | * v4daddr: unchangeable | 66 | * v4daddr: unchangeable |
67 | * ip_id_count: idlock | 67 | * ip_id_count: atomic value (no lock needed) |
68 | */ | 68 | */ |
69 | 69 | ||
70 | static struct kmem_cache *peer_cachep __read_mostly; | 70 | static struct kmem_cache *peer_cachep __read_mostly; |
@@ -129,7 +129,7 @@ void __init inet_initpeers(void) | |||
129 | 129 | ||
130 | peer_cachep = kmem_cache_create("inet_peer_cache", | 130 | peer_cachep = kmem_cache_create("inet_peer_cache", |
131 | sizeof(struct inet_peer), | 131 | sizeof(struct inet_peer), |
132 | 0, SLAB_PANIC, | 132 | 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, |
133 | NULL); | 133 | NULL); |
134 | 134 | ||
135 | /* All the timers, started at system startup tend | 135 | /* All the timers, started at system startup tend |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index a291edbbc97f..03430de46166 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2881,6 +2881,7 @@ static int rt_fill_info(struct net *net, | |||
2881 | error = rt->dst.error; | 2881 | error = rt->dst.error; |
2882 | expires = rt->dst.expires ? rt->dst.expires - jiffies : 0; | 2882 | expires = rt->dst.expires ? rt->dst.expires - jiffies : 0; |
2883 | if (rt->peer) { | 2883 | if (rt->peer) { |
2884 | inet_peer_refcheck(rt->peer); | ||
2884 | id = atomic_read(&rt->peer->ip_id_count) & 0xffff; | 2885 | id = atomic_read(&rt->peer->ip_id_count) & 0xffff; |
2885 | if (rt->peer->tcp_ts_stamp) { | 2886 | if (rt->peer->tcp_ts_stamp) { |
2886 | ts = rt->peer->tcp_ts; | 2887 | ts = rt->peer->tcp_ts; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 7f9515c0379f..2e41e6f92968 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -204,10 +204,12 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) | |||
204 | * TIME-WAIT * and initialize rx_opt.ts_recent from it, | 204 | * TIME-WAIT * and initialize rx_opt.ts_recent from it, |
205 | * when trying new connection. | 205 | * when trying new connection. |
206 | */ | 206 | */ |
207 | if (peer != NULL && | 207 | if (peer) { |
208 | (u32)get_seconds() - peer->tcp_ts_stamp <= TCP_PAWS_MSL) { | 208 | inet_peer_refcheck(peer); |
209 | tp->rx_opt.ts_recent_stamp = peer->tcp_ts_stamp; | 209 | if ((u32)get_seconds() - peer->tcp_ts_stamp <= TCP_PAWS_MSL) { |
210 | tp->rx_opt.ts_recent = peer->tcp_ts; | 210 | tp->rx_opt.ts_recent_stamp = peer->tcp_ts_stamp; |
211 | tp->rx_opt.ts_recent = peer->tcp_ts; | ||
212 | } | ||
211 | } | 213 | } |
212 | } | 214 | } |
213 | 215 | ||
@@ -1351,6 +1353,7 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1351 | (dst = inet_csk_route_req(sk, req)) != NULL && | 1353 | (dst = inet_csk_route_req(sk, req)) != NULL && |
1352 | (peer = rt_get_peer((struct rtable *)dst)) != NULL && | 1354 | (peer = rt_get_peer((struct rtable *)dst)) != NULL && |
1353 | peer->v4daddr == saddr) { | 1355 | peer->v4daddr == saddr) { |
1356 | inet_peer_refcheck(peer); | ||
1354 | if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL && | 1357 | if ((u32)get_seconds() - peer->tcp_ts_stamp < TCP_PAWS_MSL && |
1355 | (s32)(peer->tcp_ts - req->ts_recent) > | 1358 | (s32)(peer->tcp_ts - req->ts_recent) > |
1356 | TCP_PAWS_WINDOW) { | 1359 | TCP_PAWS_WINDOW) { |