Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Simon Horman and committed by
David S. Miller
1a37e412 50ab731e

+6 -113
+6 -113
include/linux/skbuff.h
··· 509 509 __u32 reserved_tailroom; 510 510 }; 511 511 512 - sk_buff_data_t inner_transport_header; 513 - sk_buff_data_t inner_network_header; 514 - sk_buff_data_t inner_mac_header; 515 - sk_buff_data_t transport_header; 516 - sk_buff_data_t network_header; 517 - sk_buff_data_t mac_header; 512 + __u16 inner_transport_header; 513 + __u16 inner_network_header; 514 + __u16 inner_mac_header; 515 + __u16 transport_header; 516 + __u16 network_header; 517 + __u16 mac_header; 518 518 /* These elements must be at the end, see alloc_skb() for details. */ 519 519 sk_buff_data_t tail; 520 520 sk_buff_data_t end; ··· 1527 1527 skb->mac_len = skb->network_header - skb->mac_header; 1528 1528 } 1529 1529 1530 - #ifdef NET_SKBUFF_DATA_USES_OFFSET 1531 1530 static inline unsigned char *skb_inner_transport_header(const struct sk_buff 1532 1531 *skb) 1533 1532 { ··· 1636 1637 skb_reset_mac_header(skb); 1637 1638 skb->mac_header += offset; 1638 1639 } 1639 - 1640 - #else /* NET_SKBUFF_DATA_USES_OFFSET */ 1641 - static inline unsigned char *skb_inner_transport_header(const struct sk_buff 1642 - *skb) 1643 - { 1644 - return skb->inner_transport_header; 1645 - } 1646 - 1647 - static inline void skb_reset_inner_transport_header(struct sk_buff *skb) 1648 - { 1649 - skb->inner_transport_header = skb->data; 1650 - } 1651 - 1652 - static inline void skb_set_inner_transport_header(struct sk_buff *skb, 1653 - const int offset) 1654 - { 1655 - skb->inner_transport_header = skb->data + offset; 1656 - } 1657 - 1658 - static inline unsigned char *skb_inner_network_header(const struct sk_buff *skb) 1659 - { 1660 - return skb->inner_network_header; 1661 - } 1662 - 1663 - static inline void skb_reset_inner_network_header(struct sk_buff *skb) 1664 - { 1665 - skb->inner_network_header = skb->data; 1666 - } 1667 - 1668 - static inline void skb_set_inner_network_header(struct sk_buff *skb, 1669 - const int offset) 1670 - { 1671 - skb->inner_network_header = skb->data + offset; 1672 - } 1673 - 1674 - static inline unsigned char *skb_inner_mac_header(const struct sk_buff *skb) 1675 - { 1676 - return skb->inner_mac_header; 1677 - } 1678 - 1679 - static inline void skb_reset_inner_mac_header(struct sk_buff *skb) 1680 - { 1681 - skb->inner_mac_header = skb->data; 1682 - } 1683 - 1684 - static inline void skb_set_inner_mac_header(struct sk_buff *skb, 1685 - const int offset) 1686 - { 1687 - skb->inner_mac_header = skb->data + offset; 1688 - } 1689 - static inline bool skb_transport_header_was_set(const struct sk_buff *skb) 1690 - { 1691 - return skb->transport_header != NULL; 1692 - } 1693 - 1694 - static inline unsigned char *skb_transport_header(const struct sk_buff *skb) 1695 - { 1696 - return skb->transport_header; 1697 - } 1698 - 1699 - static inline void skb_reset_transport_header(struct sk_buff *skb) 1700 - { 1701 - skb->transport_header = skb->data; 1702 - } 1703 - 1704 - static inline void skb_set_transport_header(struct sk_buff *skb, 1705 - const int offset) 1706 - { 1707 - skb->transport_header = skb->data + offset; 1708 - } 1709 - 1710 - static inline unsigned char *skb_network_header(const struct sk_buff *skb) 1711 - { 1712 - return skb->network_header; 1713 - } 1714 - 1715 - static inline void skb_reset_network_header(struct sk_buff *skb) 1716 - { 1717 - skb->network_header = skb->data; 1718 - } 1719 - 1720 - static inline void skb_set_network_header(struct sk_buff *skb, const int offset) 1721 - { 1722 - skb->network_header = skb->data + offset; 1723 - } 1724 - 1725 - static inline unsigned char *skb_mac_header(const struct sk_buff *skb) 1726 - { 1727 - return skb->mac_header; 1728 - } 1729 - 1730 - static inline int skb_mac_header_was_set(const struct sk_buff *skb) 1731 - { 1732 - return skb->mac_header != NULL; 1733 - } 1734 - 1735 - static inline void skb_reset_mac_header(struct sk_buff *skb) 1736 - { 1737 - skb->mac_header = skb->data; 1738 - } 1739 - 1740 - static inline void skb_set_mac_header(struct sk_buff *skb, const int offset) 1741 - { 1742 - skb->mac_header = skb->data + offset; 1743 - } 1744 - #endif /* NET_SKBUFF_DATA_USES_OFFSET */ 1745 1640 1746 1641 static inline void skb_probe_transport_header(struct sk_buff *skb, 1747 1642 const int offset_hint)