Merge branch 'skbuff-bitfields'
authorDavid S. Miller <davem@davemloft.net>
Wed, 19 Apr 2023 12:04:31 +0000 (13:04 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 Apr 2023 12:04:31 +0000 (13:04 +0100)
Jakub Kicinski says:

====================
net: skbuff: hide some bitfield members

There is a number of protocol or subsystem specific fields
in struct sk_buff which are only accessed by one subsystem.
We can wrap them in ifdefs with minimal code impact.

This gives us a better chance to save a 2B and a 4B holes
resulting with the following savings (assuming a lucky
kernel config):

- /* size: 232, cachelines: 4, members: 28 */
- /* sum members: 227, holes: 1, sum holes: 4 */
- /* sum bitfield members: 8 bits (1 bytes) */
+ /* size: 224, cachelines: 4, members: 28 */
  /* forced alignments: 2 */
- /* last cacheline: 40 bytes */
+ /* last cacheline: 32 bytes */

I think that the changes shouldn't be too controversial.
The only one I'm not 100% sure of is the SCTP one,
12 extra LoC for one bit.. But it did fit squarely
in the "this bit has only one user" category.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
Acked-by: Simon Horman <horms@kernel.org>
include/linux/skbuff.h
include/net/sock.h
net/core/dev.c
net/core/skbuff.c
net/sched/act_csum.c
net/socket.c

index a823ec3..5f120bb 100644 (file)
@@ -934,7 +934,7 @@ struct sk_buff {
        /* public: */
        __u8                    pkt_type:3; /* see PKT_TYPE_MAX */
        __u8                    ignore_df:1;
-       __u8                    nf_trace:1;
+       __u8                    dst_pending_confirm:1;
        __u8                    ip_summed:2;
        __u8                    ooo_okay:1;
 
@@ -949,12 +949,14 @@ struct sk_buff {
        __u8                    remcsum_offload:1;
        __u8                    csum_complete_sw:1;
        __u8                    csum_level:2;
-       __u8                    dst_pending_confirm:1;
+       __u8                    inner_protocol_type:1;
 
        __u8                    l4_hash:1;
        __u8                    sw_hash:1;
+#ifdef CONFIG_WIRELESS
        __u8                    wifi_acked_valid:1;
        __u8                    wifi_acked:1;
+#endif
        __u8                    no_fcs:1;
        /* Indicates the inner headers are valid in the skbuff. */
        __u8                    encapsulation:1;
@@ -964,8 +966,12 @@ struct sk_buff {
        __u8                    ndisc_nodetype:2;
 #endif
 
+#if IS_ENABLED(CONFIG_IP_VS)
        __u8                    ipvs_property:1;
-       __u8                    inner_protocol_type:1;
+#endif
+#if IS_ENABLED(CONFIG_NETFILTER_XT_TARGET_TRACE) || IS_ENABLED(CONFIG_NF_TABLES)
+       __u8                    nf_trace:1;
+#endif
 #ifdef CONFIG_NET_SWITCHDEV
        __u8                    offload_fwd_mark:1;
        __u8                    offload_l3_fwd_mark:1;
@@ -981,12 +987,16 @@ struct sk_buff {
        __u8                    decrypted:1;
 #endif
        __u8                    slow_gro:1;
+#if IS_ENABLED(CONFIG_IP_SCTP)
        __u8                    csum_not_inet:1;
+#endif
 
 #ifdef CONFIG_NET_SCHED
        __u16                   tc_index;       /* traffic control index */
 #endif
 
+       u16                     alloc_cpu;
+
        union {
                __wsum          csum;
                struct {
@@ -1010,7 +1020,6 @@ struct sk_buff {
                unsigned int    sender_cpu;
        };
 #endif
-       u16                     alloc_cpu;
 #ifdef CONFIG_NETWORK_SECMARK
        __u32           secmark;
 #endif
@@ -1187,6 +1196,15 @@ static inline unsigned int skb_napi_id(const struct sk_buff *skb)
 #endif
 }
 
+static inline bool skb_wifi_acked_valid(const struct sk_buff *skb)
+{
+#ifdef CONFIG_WIRELESS
+       return skb->wifi_acked_valid;
+#else
+       return 0;
+#endif
+}
+
 /**
  * skb_unref - decrement the skb's reference count
  * @skb: buffer
@@ -5049,7 +5067,19 @@ static inline void skb_reset_redirect(struct sk_buff *skb)
 
 static inline bool skb_csum_is_sctp(struct sk_buff *skb)
 {
+#if IS_ENABLED(CONFIG_IP_SCTP)
        return skb->csum_not_inet;
+#else
+       return 0;
+#endif
+}
+
+static inline void skb_reset_csum_not_inet(struct sk_buff *skb)
+{
+       skb->ip_summed = CHECKSUM_NONE;
+#if IS_ENABLED(CONFIG_IP_SCTP)
+       skb->csum_not_inet = 0;
+#endif
 }
 
 static inline void skb_set_kcov_handle(struct sk_buff *skb,
index 5edf003..8b7ed71 100644 (file)
@@ -2697,7 +2697,7 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
        else
                sock_write_timestamp(sk, kt);
 
-       if (sock_flag(sk, SOCK_WIFI_STATUS) && skb->wifi_acked_valid)
+       if (sock_flag(sk, SOCK_WIFI_STATUS) && skb_wifi_acked_valid(skb))
                __sock_recv_wifi_status(msg, sk, skb);
 }
 
index 8aea682..3fc4dba 100644 (file)
@@ -3315,8 +3315,7 @@ int skb_crc32c_csum_help(struct sk_buff *skb)
                                                  skb->len - start, ~(__u32)0,
                                                  crc32c_csum_stub));
        *(__le32 *)(skb->data + offset) = crc32c_csum;
-       skb->ip_summed = CHECKSUM_NONE;
-       skb->csum_not_inet = 0;
+       skb_reset_csum_not_inet(skb);
 out:
        return ret;
 }
index ef81452..768f9d0 100644 (file)
@@ -5189,6 +5189,7 @@ void skb_tstamp_tx(struct sk_buff *orig_skb,
 }
 EXPORT_SYMBOL_GPL(skb_tstamp_tx);
 
+#ifdef CONFIG_WIRELESS
 void skb_complete_wifi_ack(struct sk_buff *skb, bool acked)
 {
        struct sock *sk = skb->sk;
@@ -5214,6 +5215,7 @@ void skb_complete_wifi_ack(struct sk_buff *skb, bool acked)
                kfree_skb(skb);
 }
 EXPORT_SYMBOL_GPL(skb_complete_wifi_ack);
+#endif /* CONFIG_WIRELESS */
 
 /**
  * skb_partial_csum_set - set up and verify partial csum values for packet
index 95e9304..8ed2850 100644 (file)
@@ -376,8 +376,7 @@ static int tcf_csum_sctp(struct sk_buff *skb, unsigned int ihl,
 
        sctph->checksum = sctp_compute_cksum(skb,
                                             skb_network_offset(skb) + ihl);
-       skb->ip_summed = CHECKSUM_NONE;
-       skb->csum_not_inet = 0;
+       skb_reset_csum_not_inet(skb);
 
        return 1;
 }
index 73e493d..a7b4b37 100644 (file)
@@ -957,6 +957,7 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
 }
 EXPORT_SYMBOL_GPL(__sock_recv_timestamp);
 
+#ifdef CONFIG_WIRELESS
 void __sock_recv_wifi_status(struct msghdr *msg, struct sock *sk,
        struct sk_buff *skb)
 {
@@ -972,6 +973,7 @@ void __sock_recv_wifi_status(struct msghdr *msg, struct sock *sk,
        put_cmsg(msg, SOL_SOCKET, SCM_WIFI_STATUS, sizeof(ack), &ack);
 }
 EXPORT_SYMBOL_GPL(__sock_recv_wifi_status);
+#endif
 
 static inline void sock_recv_drops(struct msghdr *msg, struct sock *sk,
                                   struct sk_buff *skb)