aboutsummaryrefslogtreecommitdiffstats
path: root/include/net
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-01-28 01:01:53 -0500
committerDavid S. Miller <davem@davemloft.net>2011-01-28 01:01:53 -0500
commita4daad6b0923030fbd3b00a01f570e4c3eef446b (patch)
treeb8e5b9a2110628503e57149f0bb2a4bb1bf3f027 /include/net
parent8571a19c4ac140f1a507f3e7eb716892afa27109 (diff)
net: Pre-COW metrics for TCP.
TCP is going to record metrics for the connection, so pre-COW the route metrics at route cache entry creation time. This avoids several atomic operations that have to occur if we COW the metrics after the entry reaches global visibility. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r--include/net/flow.h3
-rw-r--r--include/net/inet_sock.h8
-rw-r--r--include/net/route.h4
3 files changed, 13 insertions, 2 deletions
diff --git a/include/net/flow.h b/include/net/flow.h
index 240b7f356c71..1ae901f24436 100644
--- a/include/net/flow.h
+++ b/include/net/flow.h
@@ -48,7 +48,8 @@ struct flowi {
48 48
49 __u8 proto; 49 __u8 proto;
50 __u8 flags; 50 __u8 flags;
51#define FLOWI_FLAG_ANYSRC 0x01 51#define FLOWI_FLAG_ANYSRC 0x01
52#define FLOWI_FLAG_PRECOW_METRICS 0x02
52 union { 53 union {
53 struct { 54 struct {
54 __be16 sport; 55 __be16 sport;
diff --git a/include/net/inet_sock.h b/include/net/inet_sock.h
index 8181498fa96c..6e6dfd757682 100644
--- a/include/net/inet_sock.h
+++ b/include/net/inet_sock.h
@@ -219,7 +219,13 @@ static inline struct request_sock *inet_reqsk_alloc(struct request_sock_ops *ops
219 219
220static inline __u8 inet_sk_flowi_flags(const struct sock *sk) 220static inline __u8 inet_sk_flowi_flags(const struct sock *sk)
221{ 221{
222 return inet_sk(sk)->transparent ? FLOWI_FLAG_ANYSRC : 0; 222 __u8 flags = 0;
223
224 if (inet_sk(sk)->transparent)
225 flags |= FLOWI_FLAG_ANYSRC;
226 if (sk->sk_protocol == IPPROTO_TCP)
227 flags |= FLOWI_FLAG_PRECOW_METRICS;
228 return flags;
223} 229}
224 230
225#endif /* _INET_SOCK_H */ 231#endif /* _INET_SOCK_H */
diff --git a/include/net/route.h b/include/net/route.h
index 5677cbf0c6e6..e5864658dc76 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -182,6 +182,8 @@ static inline int ip_route_connect(struct rtable **rp, __be32 dst,
182 182
183 if (inet_sk(sk)->transparent) 183 if (inet_sk(sk)->transparent)
184 fl.flags |= FLOWI_FLAG_ANYSRC; 184 fl.flags |= FLOWI_FLAG_ANYSRC;
185 if (protocol == IPPROTO_TCP)
186 fl.flags |= FLOWI_FLAG_PRECOW_METRICS;
185 187
186 if (!dst || !src) { 188 if (!dst || !src) {
187 err = __ip_route_output_key(net, rp, &fl); 189 err = __ip_route_output_key(net, rp, &fl);
@@ -209,6 +211,8 @@ static inline int ip_route_newports(struct rtable **rp, u8 protocol,
209 fl.proto = protocol; 211 fl.proto = protocol;
210 if (inet_sk(sk)->transparent) 212 if (inet_sk(sk)->transparent)
211 fl.flags |= FLOWI_FLAG_ANYSRC; 213 fl.flags |= FLOWI_FLAG_ANYSRC;
214 if (protocol == IPPROTO_TCP)
215 fl.flags |= FLOWI_FLAG_PRECOW_METRICS;
212 ip_rt_put(*rp); 216 ip_rt_put(*rp);
213 *rp = NULL; 217 *rp = NULL;
214 security_sk_classify_flow(sk, &fl); 218 security_sk_classify_flow(sk, &fl);