Commit 1a37e412 authored by Simon Horman's avatar Simon Horman Committed by David S. Miller

net: Use 16bits for *_headers fields of struct skbuff

In order to mitigate ongoing incresase in the size of struct skbuff
use 16 bit integer offsets rather than pointers for inner_*_headers.

This appears to reduce the size of struct skbuff from 0xd0 to 0xc0
bytes on x86_64 with the following all unset.

	CONFIG_XFRM
	CONFIG_NF_CONNTRACK
	CONFIG_NF_CONNTRACK_MODULE
	NET_SKBUFF_NF_DEFRAG_NEEDED
	CONFIG_BRIDGE_NETFILTER
	CONFIG_NET_SCHED
	CONFIG_IPV6_NDISC_NODETYPE
	CONFIG_NET_DMA
	CONFIG_NETWORK_SECMARK
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 50ab731e
...@@ -509,12 +509,12 @@ struct sk_buff { ...@@ -509,12 +509,12 @@ struct sk_buff {
__u32 reserved_tailroom; __u32 reserved_tailroom;
}; };
sk_buff_data_t inner_transport_header; __u16 inner_transport_header;
sk_buff_data_t inner_network_header; __u16 inner_network_header;
sk_buff_data_t inner_mac_header; __u16 inner_mac_header;
sk_buff_data_t transport_header; __u16 transport_header;
sk_buff_data_t network_header; __u16 network_header;
sk_buff_data_t mac_header; __u16 mac_header;
/* These elements must be at the end, see alloc_skb() for details. */ /* These elements must be at the end, see alloc_skb() for details. */
sk_buff_data_t tail; sk_buff_data_t tail;
sk_buff_data_t end; sk_buff_data_t end;
...@@ -1527,7 +1527,6 @@ static inline void skb_reset_mac_len(struct sk_buff *skb) ...@@ -1527,7 +1527,6 @@ static inline void skb_reset_mac_len(struct sk_buff *skb)
skb->mac_len = skb->network_header - skb->mac_header; skb->mac_len = skb->network_header - skb->mac_header;
} }
#ifdef NET_SKBUFF_DATA_USES_OFFSET
static inline unsigned char *skb_inner_transport_header(const struct sk_buff static inline unsigned char *skb_inner_transport_header(const struct sk_buff
*skb) *skb)
{ {
...@@ -1638,112 +1637,6 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset) ...@@ -1638,112 +1637,6 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
skb->mac_header += offset; skb->mac_header += offset;
} }
#else /* NET_SKBUFF_DATA_USES_OFFSET */
static inline unsigned char *skb_inner_transport_header(const struct sk_buff
*skb)
{
return skb->inner_transport_header;
}
static inline void skb_reset_inner_transport_header(struct sk_buff *skb)
{
skb->inner_transport_header = skb->data;
}
static inline void skb_set_inner_transport_header(struct sk_buff *skb,
const int offset)
{
skb->inner_transport_header = skb->data + offset;
}
static inline unsigned char *skb_inner_network_header(const struct sk_buff *skb)
{
return skb->inner_network_header;
}
static inline void skb_reset_inner_network_header(struct sk_buff *skb)
{
skb->inner_network_header = skb->data;
}
static inline void skb_set_inner_network_header(struct sk_buff *skb,
const int offset)
{
skb->inner_network_header = skb->data + offset;
}
static inline unsigned char *skb_inner_mac_header(const struct sk_buff *skb)
{
return skb->inner_mac_header;
}
static inline void skb_reset_inner_mac_header(struct sk_buff *skb)
{
skb->inner_mac_header = skb->data;
}
static inline void skb_set_inner_mac_header(struct sk_buff *skb,
const int offset)
{
skb->inner_mac_header = skb->data + offset;
}
static inline bool skb_transport_header_was_set(const struct sk_buff *skb)
{
return skb->transport_header != NULL;
}
static inline unsigned char *skb_transport_header(const struct sk_buff *skb)
{
return skb->transport_header;
}
static inline void skb_reset_transport_header(struct sk_buff *skb)
{
skb->transport_header = skb->data;
}
static inline void skb_set_transport_header(struct sk_buff *skb,
const int offset)
{
skb->transport_header = skb->data + offset;
}
static inline unsigned char *skb_network_header(const struct sk_buff *skb)
{
return skb->network_header;
}
static inline void skb_reset_network_header(struct sk_buff *skb)
{
skb->network_header = skb->data;
}
static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
{
skb->network_header = skb->data + offset;
}
static inline unsigned char *skb_mac_header(const struct sk_buff *skb)
{
return skb->mac_header;
}
static inline int skb_mac_header_was_set(const struct sk_buff *skb)
{
return skb->mac_header != NULL;
}
static inline void skb_reset_mac_header(struct sk_buff *skb)
{
skb->mac_header = skb->data;
}
static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
{
skb->mac_header = skb->data + offset;
}
#endif /* NET_SKBUFF_DATA_USES_OFFSET */
static inline void skb_probe_transport_header(struct sk_buff *skb, static inline void skb_probe_transport_header(struct sk_buff *skb,
const int offset_hint) const int offset_hint)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment