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: Simon Horman <horms@verge.net.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
50ab731e96
Коммит
1a37e412a0
|
@ -509,12 +509,12 @@ struct sk_buff {
|
|||
__u32 reserved_tailroom;
|
||||
};
|
||||
|
||||
sk_buff_data_t inner_transport_header;
|
||||
sk_buff_data_t inner_network_header;
|
||||
sk_buff_data_t inner_mac_header;
|
||||
sk_buff_data_t transport_header;
|
||||
sk_buff_data_t network_header;
|
||||
sk_buff_data_t mac_header;
|
||||
__u16 inner_transport_header;
|
||||
__u16 inner_network_header;
|
||||
__u16 inner_mac_header;
|
||||
__u16 transport_header;
|
||||
__u16 network_header;
|
||||
__u16 mac_header;
|
||||
/* These elements must be at the end, see alloc_skb() for details. */
|
||||
sk_buff_data_t tail;
|
||||
sk_buff_data_t end;
|
||||
|
@ -1527,7 +1527,6 @@ static inline void skb_reset_mac_len(struct sk_buff *skb)
|
|||
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
|
||||
*skb)
|
||||
{
|
||||
|
@ -1638,112 +1637,6 @@ static inline void skb_set_mac_header(struct sk_buff *skb, const int 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,
|
||||
const int offset_hint)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче