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 /include/linux | |
| 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 'include/linux')
| -rw-r--r-- | include/linux/netfilter/nfnetlink.h | 4 | ||||
| -rw-r--r-- | include/linux/netlink.h | 2 | ||||
| -rw-r--r-- | include/linux/rtnetlink.h | 6 | ||||
| -rw-r--r-- | include/linux/skbuff.h | 57 |
4 files changed, 51 insertions, 18 deletions
diff --git a/include/linux/netfilter/nfnetlink.h b/include/linux/netfilter/nfnetlink.h index 6179648a014e..e1ea5dfbbbd4 100644 --- a/include/linux/netfilter/nfnetlink.h +++ b/include/linux/netfilter/nfnetlink.h | |||
| @@ -62,11 +62,11 @@ struct nfattr | |||
| 62 | #define NFA_DATA(nfa) ((void *)(((char *)(nfa)) + NFA_LENGTH(0))) | 62 | #define NFA_DATA(nfa) ((void *)(((char *)(nfa)) + NFA_LENGTH(0))) |
| 63 | #define NFA_PAYLOAD(nfa) ((int)((nfa)->nfa_len) - NFA_LENGTH(0)) | 63 | #define NFA_PAYLOAD(nfa) ((int)((nfa)->nfa_len) - NFA_LENGTH(0)) |
| 64 | #define NFA_NEST(skb, type) \ | 64 | #define NFA_NEST(skb, type) \ |
| 65 | ({ struct nfattr *__start = (struct nfattr *) (skb)->tail; \ | 65 | ({ struct nfattr *__start = (struct nfattr *)skb_tail_pointer(skb); \ |
| 66 | NFA_PUT(skb, (NFNL_NFA_NEST | type), 0, NULL); \ | 66 | NFA_PUT(skb, (NFNL_NFA_NEST | type), 0, NULL); \ |
| 67 | __start; }) | 67 | __start; }) |
| 68 | #define NFA_NEST_END(skb, start) \ | 68 | #define NFA_NEST_END(skb, start) \ |
| 69 | ({ (start)->nfa_len = ((skb)->tail - (unsigned char *) (start)); \ | 69 | ({ (start)->nfa_len = skb_tail_pointer(skb) - (unsigned char *)(start); \ |
| 70 | (skb)->len; }) | 70 | (skb)->len; }) |
| 71 | #define NFA_NEST_CANCEL(skb, start) \ | 71 | #define NFA_NEST_CANCEL(skb, start) \ |
| 72 | ({ if (start) \ | 72 | ({ if (start) \ |
diff --git a/include/linux/netlink.h b/include/linux/netlink.h index a9d3ad5bc80f..68a632b372ec 100644 --- a/include/linux/netlink.h +++ b/include/linux/netlink.h | |||
| @@ -229,7 +229,7 @@ __nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len, int flags) | |||
| 229 | (cb)->nlh->nlmsg_seq, type, len, flags) | 229 | (cb)->nlh->nlmsg_seq, type, len, flags) |
| 230 | 230 | ||
| 231 | #define NLMSG_END(skb, nlh) \ | 231 | #define NLMSG_END(skb, nlh) \ |
| 232 | ({ (nlh)->nlmsg_len = (skb)->tail - (unsigned char *) (nlh); \ | 232 | ({ (nlh)->nlmsg_len = skb_tail_pointer(skb) - (unsigned char *)(nlh); \ |
| 233 | (skb)->len; }) | 233 | (skb)->len; }) |
| 234 | 234 | ||
| 235 | #define NLMSG_CANCEL(skb, nlh) \ | 235 | #define NLMSG_CANCEL(skb, nlh) \ |
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 4a629ea70cc4..3a4cb242ecd2 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h | |||
| @@ -605,7 +605,7 @@ extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const voi | |||
| 605 | 605 | ||
| 606 | #define RTA_PUT_NOHDR(skb, attrlen, data) \ | 606 | #define RTA_PUT_NOHDR(skb, attrlen, data) \ |
| 607 | ({ RTA_APPEND(skb, RTA_ALIGN(attrlen), data); \ | 607 | ({ RTA_APPEND(skb, RTA_ALIGN(attrlen), data); \ |
| 608 | memset(skb->tail - (RTA_ALIGN(attrlen) - attrlen), 0, \ | 608 | memset(skb_tail_pointer(skb) - (RTA_ALIGN(attrlen) - attrlen), 0, \ |
| 609 | RTA_ALIGN(attrlen) - attrlen); }) | 609 | RTA_ALIGN(attrlen) - attrlen); }) |
| 610 | 610 | ||
| 611 | #define RTA_PUT_U8(skb, attrtype, value) \ | 611 | #define RTA_PUT_U8(skb, attrtype, value) \ |
| @@ -637,12 +637,12 @@ extern void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const voi | |||
| 637 | RTA_PUT(skb, attrtype, 0, NULL); | 637 | RTA_PUT(skb, attrtype, 0, NULL); |
| 638 | 638 | ||
| 639 | #define RTA_NEST(skb, type) \ | 639 | #define RTA_NEST(skb, type) \ |
| 640 | ({ struct rtattr *__start = (struct rtattr *) (skb)->tail; \ | 640 | ({ struct rtattr *__start = (struct rtattr *)skb_tail_pointer(skb); \ |
| 641 | RTA_PUT(skb, type, 0, NULL); \ | 641 | RTA_PUT(skb, type, 0, NULL); \ |
| 642 | __start; }) | 642 | __start; }) |
| 643 | 643 | ||
| 644 | #define RTA_NEST_END(skb, start) \ | 644 | #define RTA_NEST_END(skb, start) \ |
| 645 | ({ (start)->rta_len = ((skb)->tail - (unsigned char *) (start)); \ | 645 | ({ (start)->rta_len = skb_tail_pointer(skb) - (unsigned char *)(start); \ |
| 646 | (skb)->len; }) | 646 | (skb)->len; }) |
| 647 | 647 | ||
| 648 | #define RTA_NEST_CANCEL(skb, start) \ | 648 | #define RTA_NEST_CANCEL(skb, start) \ |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 2e7405500626..e1c2392ecb56 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -246,9 +246,6 @@ struct sk_buff { | |||
| 246 | int iif; | 246 | int iif; |
| 247 | /* 4 byte hole on 64 bit*/ | 247 | /* 4 byte hole on 64 bit*/ |
| 248 | 248 | ||
| 249 | sk_buff_data_t transport_header; | ||
| 250 | sk_buff_data_t network_header; | ||
| 251 | sk_buff_data_t mac_header; | ||
| 252 | struct dst_entry *dst; | 249 | struct dst_entry *dst; |
| 253 | struct sec_path *sp; | 250 | struct sec_path *sp; |
| 254 | 251 | ||
| @@ -303,13 +300,16 @@ struct sk_buff { | |||
| 303 | 300 | ||
| 304 | __u32 mark; | 301 | __u32 mark; |
| 305 | 302 | ||
| 303 | sk_buff_data_t transport_header; | ||
| 304 | sk_buff_data_t network_header; | ||
| 305 | sk_buff_data_t mac_header; | ||
| 306 | /* These elements must be at the end, see alloc_skb() for details. */ | 306 | /* These elements must be at the end, see alloc_skb() for details. */ |
| 307 | unsigned int truesize; | 307 | sk_buff_data_t tail; |
| 308 | atomic_t users; | ||
| 309 | unsigned char *head, | 308 | unsigned char *head, |
| 310 | *data, | 309 | *data, |
| 311 | *tail, | ||
| 312 | *end; | 310 | *end; |
| 311 | unsigned int truesize; | ||
| 312 | atomic_t users; | ||
| 313 | }; | 313 | }; |
| 314 | 314 | ||
| 315 | #ifdef __KERNEL__ | 315 | #ifdef __KERNEL__ |
| @@ -812,12 +812,45 @@ static inline void skb_fill_page_desc(struct sk_buff *skb, int i, | |||
| 812 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_shinfo(skb)->frag_list) | 812 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_shinfo(skb)->frag_list) |
| 813 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) | 813 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) |
| 814 | 814 | ||
| 815 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | ||
| 816 | static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb) | ||
| 817 | { | ||
| 818 | return skb->head + skb->tail; | ||
| 819 | } | ||
| 820 | |||
| 821 | static inline void skb_reset_tail_pointer(struct sk_buff *skb) | ||
| 822 | { | ||
| 823 | skb->tail = skb->data - skb->head; | ||
| 824 | } | ||
| 825 | |||
| 826 | static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset) | ||
| 827 | { | ||
| 828 | skb_reset_tail_pointer(skb); | ||
| 829 | skb->tail += offset; | ||
| 830 | } | ||
| 831 | #else /* NET_SKBUFF_DATA_USES_OFFSET */ | ||
| 832 | static inline unsigned char *skb_tail_pointer(const struct sk_buff *skb) | ||
| 833 | { | ||
| 834 | return skb->tail; | ||
| 835 | } | ||
| 836 | |||
| 837 | static inline void skb_reset_tail_pointer(struct sk_buff *skb) | ||
| 838 | { | ||
| 839 | skb->tail = skb->data; | ||
| 840 | } | ||
| 841 | |||
| 842 | static inline void skb_set_tail_pointer(struct sk_buff *skb, const int offset) | ||
| 843 | { | ||
| 844 | skb->tail = skb->data + offset; | ||
| 845 | } | ||
| 846 | #endif /* NET_SKBUFF_DATA_USES_OFFSET */ | ||
| 847 | |||
| 815 | /* | 848 | /* |
| 816 | * Add data to an sk_buff | 849 | * Add data to an sk_buff |
| 817 | */ | 850 | */ |
| 818 | static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len) | 851 | static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len) |
| 819 | { | 852 | { |
| 820 | unsigned char *tmp = skb->tail; | 853 | unsigned char *tmp = skb_tail_pointer(skb); |
| 821 | SKB_LINEAR_ASSERT(skb); | 854 | SKB_LINEAR_ASSERT(skb); |
| 822 | skb->tail += len; | 855 | skb->tail += len; |
| 823 | skb->len += len; | 856 | skb->len += len; |
| @@ -835,11 +868,11 @@ static inline unsigned char *__skb_put(struct sk_buff *skb, unsigned int len) | |||
| 835 | */ | 868 | */ |
| 836 | static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len) | 869 | static inline unsigned char *skb_put(struct sk_buff *skb, unsigned int len) |
| 837 | { | 870 | { |
| 838 | unsigned char *tmp = skb->tail; | 871 | unsigned char *tmp = skb_tail_pointer(skb); |
| 839 | SKB_LINEAR_ASSERT(skb); | 872 | SKB_LINEAR_ASSERT(skb); |
| 840 | skb->tail += len; | 873 | skb->tail += len; |
| 841 | skb->len += len; | 874 | skb->len += len; |
| 842 | if (unlikely(skb->tail>skb->end)) | 875 | if (unlikely(skb_tail_pointer(skb) > skb->end)) |
| 843 | skb_over_panic(skb, len, current_text_addr()); | 876 | skb_over_panic(skb, len, current_text_addr()); |
| 844 | return tmp; | 877 | return tmp; |
| 845 | } | 878 | } |
| @@ -935,7 +968,7 @@ static inline int skb_headroom(const struct sk_buff *skb) | |||
| 935 | */ | 968 | */ |
| 936 | static inline int skb_tailroom(const struct sk_buff *skb) | 969 | static inline int skb_tailroom(const struct sk_buff *skb) |
| 937 | { | 970 | { |
| 938 | return skb_is_nonlinear(skb) ? 0 : skb->end - skb->tail; | 971 | return skb_is_nonlinear(skb) ? 0 : skb->end - skb_tail_pointer(skb); |
| 939 | } | 972 | } |
| 940 | 973 | ||
| 941 | /** | 974 | /** |
| @@ -1127,8 +1160,8 @@ static inline void __skb_trim(struct sk_buff *skb, unsigned int len) | |||
| 1127 | WARN_ON(1); | 1160 | WARN_ON(1); |
| 1128 | return; | 1161 | return; |
| 1129 | } | 1162 | } |
| 1130 | skb->len = len; | 1163 | skb->len = len; |
| 1131 | skb->tail = skb->data + len; | 1164 | skb_set_tail_pointer(skb, len); |
| 1132 | } | 1165 | } |
| 1133 | 1166 | ||
| 1134 | /** | 1167 | /** |
