Re: [PATCH net-next] sctp: deduplicate identical skb_checksum_ops

From: Neil Horman
Date: Wed May 29 2019 - 13:03:12 EST


On Wed, May 29, 2019 at 05:39:41PM +0200, Matteo Croce wrote:
> 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@xxxxxxxxx>
> Signed-off-by: Matteo Croce <mcroce@xxxxxxxxxx>
> ---
> include/net/sctp/checksum.h | 12 +++++++-----
> net/sctp/offload.c | 7 +------
> 2 files changed, 8 insertions(+), 11 deletions(-)
>
> diff --git a/include/net/sctp/checksum.h b/include/net/sctp/checksum.h
> index 314699333bec..5a9bb09f32b6 100644
> --- a/include/net/sctp/checksum.h
> +++ b/include/net/sctp/checksum.h
> @@ -43,19 +43,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);
> diff --git a/net/sctp/offload.c b/net/sctp/offload.c
> index edfcf16e704c..dac46dfadab5 100644
> --- a/net/sctp/offload.c
> +++ b/net/sctp/offload.c
> @@ -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:
> --
> 2.21.0
>
>
Acked-by: Neil Horman <nhorman@xxxxxxxxxxxxx>