diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2007-04-19 23:29:13 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-04-26 01:26:28 -0400 |
commit | 27a884dc3cb63b93c2b3b643f5b31eed5f8a4d26 (patch) | |
tree | 5a267e40f9b94014be38dad5de0a52b6628834e0 /net/ipv6/esp6.c | |
parent | be8bd86321fa7f06359d866ef61fb4d2f3e9dce9 (diff) |
[SK_BUFF]: Convert skb->tail to sk_buff_data_t
So that it is also an offset from skb->head, reduces its size from 8 to 4 bytes
on 64bit architectures, allowing us to combine the 4 bytes hole left by the
layer headers conversion, reducing struct sk_buff size to 256 bytes, i.e. 4
64byte cachelines, and since the sk_buff slab cache is SLAB_HWCACHE_ALIGN...
:-)
Many calculations that previously required that skb->{transport,network,
mac}_header be first converted to a pointer now can be done directly, being
meaningful as offsets or pointers.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/esp6.c')
-rw-r--r-- | net/ipv6/esp6.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 7fdf84dee73f..b8e8914cc002 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -51,6 +51,7 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
51 | int clen; | 51 | int clen; |
52 | int alen; | 52 | int alen; |
53 | int nfrags; | 53 | int nfrags; |
54 | u8 *tail; | ||
54 | struct esp_data *esp = x->data; | 55 | struct esp_data *esp = x->data; |
55 | int hdr_len = (skb_transport_offset(skb) + | 56 | int hdr_len = (skb_transport_offset(skb) + |
56 | sizeof(*esph) + esp->conf.ivlen); | 57 | sizeof(*esph) + esp->conf.ivlen); |
@@ -78,18 +79,19 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
78 | } | 79 | } |
79 | 80 | ||
80 | /* Fill padding... */ | 81 | /* Fill padding... */ |
82 | tail = skb_tail_pointer(trailer); | ||
81 | do { | 83 | do { |
82 | int i; | 84 | int i; |
83 | for (i=0; i<clen-skb->len - 2; i++) | 85 | for (i=0; i<clen-skb->len - 2; i++) |
84 | *(u8*)(trailer->tail + i) = i+1; | 86 | tail[i] = i + 1; |
85 | } while (0); | 87 | } while (0); |
86 | *(u8*)(trailer->tail + clen-skb->len - 2) = (clen - skb->len)-2; | 88 | tail[clen-skb->len - 2] = (clen - skb->len) - 2; |
87 | pskb_put(skb, trailer, clen - skb->len); | 89 | pskb_put(skb, trailer, clen - skb->len); |
88 | 90 | ||
89 | top_iph = (struct ipv6hdr *)__skb_push(skb, hdr_len); | 91 | top_iph = (struct ipv6hdr *)__skb_push(skb, hdr_len); |
90 | esph = (struct ipv6_esp_hdr *)skb_transport_header(skb); | 92 | esph = (struct ipv6_esp_hdr *)skb_transport_header(skb); |
91 | top_iph->payload_len = htons(skb->len + alen - sizeof(*top_iph)); | 93 | top_iph->payload_len = htons(skb->len + alen - sizeof(*top_iph)); |
92 | *(u8 *)(trailer->tail - 1) = *skb_network_header(skb); | 94 | *(skb_tail_pointer(skb) - 1) = *skb_network_header(skb); |
93 | *skb_network_header(skb) = IPPROTO_ESP; | 95 | *skb_network_header(skb) = IPPROTO_ESP; |
94 | 96 | ||
95 | esph->spi = x->id.spi; | 97 | esph->spi = x->id.spi; |