sctp: deduplicate identical skb_checksum_ops
authorMatteo Croce <mcroce@redhat.com>
Wed, 29 May 2019 15:39:41 +0000 (17:39 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 May 2019 21:35:44 +0000 (14:35 -0700)
The same skb_checksum_ops struct is defined twice in two different places,
leading to code duplication. Declare it as a global variable into a common
header instead of allocating it on the stack on each function call.
bloat-o-meter reports a slight code shrink.

add/remove: 1/1 grow/shrink: 0/10 up/down: 128/-1282 (-1154)
Function                                     old     new   delta
sctp_csum_ops                                  -     128    +128
crc32c_csum_ops                               16       -     -16
sctp_rcv                                    6616    6583     -33
sctp_packet_pack                            4542    4504     -38
nf_conntrack_sctp_packet                    4980    4926     -54
execute_masked_set_action                   6453    6389     -64
tcf_csum_sctp                                575     428    -147
sctp_gso_segment                            1292    1126    -166
sctp_csum_check                              579     412    -167
sctp_snat_handler                            957     772    -185
sctp_dnat_handler                           1321    1132    -189
l4proto_manip_pkt                           2536    2313    -223
Total: Before=359297613, After=359296459, chg -0.00%

Reviewed-by: Xin Long <lucien.xin@gmail.com>
Signed-off-by: Matteo Croce <mcroce@redhat.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sctp/checksum.h
net/sctp/offload.c

index 1c6e6c0766ca09b771d865883c7c4daf390215c6..1b74af2477d1021b42fc116c03e118913f82c6b6 100644 (file)
@@ -58,19 +58,21 @@ static inline __wsum sctp_csum_combine(__wsum csum, __wsum csum2,
                                                   (__force __u32)csum2, len);
 }
 
+static const struct skb_checksum_ops sctp_csum_ops = {
+       .update  = sctp_csum_update,
+       .combine = sctp_csum_combine,
+};
+
 static inline __le32 sctp_compute_cksum(const struct sk_buff *skb,
                                        unsigned int offset)
 {
        struct sctphdr *sh = (struct sctphdr *)(skb->data + offset);
-       const struct skb_checksum_ops ops = {
-               .update  = sctp_csum_update,
-               .combine = sctp_csum_combine,
-       };
        __le32 old = sh->checksum;
        __wsum new;
 
        sh->checksum = 0;
-       new = ~__skb_checksum(skb, offset, skb->len - offset, ~(__wsum)0, &ops);
+       new = ~__skb_checksum(skb, offset, skb->len - offset, ~(__wsum)0,
+                             &sctp_csum_ops);
        sh->checksum = old;
 
        return cpu_to_le32((__force __u32)new);
index edfcf16e704c4e02a93a13e2bdd507e91658ba0f..dac46dfadab53c3bfdee413511b3888cf0ae636c 100644 (file)
@@ -103,11 +103,6 @@ static const struct net_offload sctp6_offload = {
        },
 };
 
-static const struct skb_checksum_ops crc32c_csum_ops = {
-       .update  = sctp_csum_update,
-       .combine = sctp_csum_combine,
-};
-
 int __init sctp_offload_init(void)
 {
        int ret;
@@ -120,7 +115,7 @@ int __init sctp_offload_init(void)
        if (ret)
                goto ipv4;
 
-       crc32c_csum_stub = &crc32c_csum_ops;
+       crc32c_csum_stub = &sctp_csum_ops;
        return ret;
 
 ipv4: