Skip to content

Commit

Permalink
sctp: deduplicate identical skb_checksum_ops
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Matteo Croce <[email protected]>
Acked-by: Neil Horman <[email protected]>
Acked-by: Marcelo Ricardo Leitner <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
teknoraver authored and davem330 committed May 30, 2019
1 parent 2544af0 commit c3e933a
Showing 2 changed files with 8 additions and 11 deletions.
12 changes: 7 additions & 5 deletions include/net/sctp/checksum.h
Original file line number Diff line number Diff line change
@@ -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);
7 changes: 1 addition & 6 deletions net/sctp/offload.c
Original file line number Diff line number Diff line change
@@ -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:

0 comments on commit c3e933a

Please sign in to comment.