gro: optimize skb_gro_postpull_rcsum()
authorEric Dumazet <edumazet@google.com>
Wed, 24 Nov 2021 20:24:45 +0000 (12:24 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 26 Nov 2021 05:03:31 +0000 (21:03 -0800)
We can leverage third argument to csum_partial():

  X = csum_sub(X, csum_partial(start, len, 0));

  -->

  X = csum_add(X, ~csum_partial(start, len, 0));

  -->

  X = ~csum_partial(start, len, ~X);

This removes one add/adc pair and its dependency against the carry flag.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/gro.h

index 9c22a01..b1139fc 100644 (file)
@@ -173,8 +173,8 @@ static inline void skb_gro_postpull_rcsum(struct sk_buff *skb,
                                        const void *start, unsigned int len)
 {
        if (NAPI_GRO_CB(skb)->csum_valid)
-               NAPI_GRO_CB(skb)->csum = csum_sub(NAPI_GRO_CB(skb)->csum,
-                                                 csum_partial(start, len, 0));
+               NAPI_GRO_CB(skb)->csum = ~csum_partial(start, len,
+                                                      ~NAPI_GRO_CB(skb)->csum);
 }
 
 /* GRO checksum functions. These are logical equivalents of the normal