]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
netfilter: nft_set_pipapo_avx2: remove redundant loop in lookup_slow
authorFlorian Westphal <fw@strlen.de>
Tue, 17 Mar 2026 14:09:18 +0000 (15:09 +0100)
committerFlorian Westphal <fw@strlen.de>
Wed, 8 Apr 2026 05:51:31 +0000 (07:51 +0200)
nft_pipapo_avx2_lookup_slow will never be used in reality, because the
common sizes are handled by avx2 optimized versions.

However, nft_pipapo_avx2_lookup_slow loops over the data just like the
avx2 functions.  However, _slow doesn't need to do that.

As-is, first loop sets all the right result bits and the next iterations
boil down to 'x = x & x'.  Remove the loop.

Reviewed-by: Stefano Brivio <sbrivio@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
net/netfilter/nft_set_pipapo_avx2.c

index 6395982e4d95c5693bd19084f7d67872457e1855..dad265807b8b38948ed17f7b4feca6885530e95c 100644 (file)
@@ -1041,7 +1041,6 @@ nothing:
  * @map:       Previous match result, used as initial bitmap
  * @fill:      Destination bitmap to be filled with current match result
  * @f:         Field, containing lookup and mapping tables
- * @offset:    Ignore buckets before the given index, no bits are filled there
  * @pkt:       Packet data, pointer to input nftables register
  * @first:     If this is the first field, don't source previous result
  * @last:      Last field: stop at the first match and return bit index
@@ -1056,32 +1055,19 @@ nothing:
 static int nft_pipapo_avx2_lookup_slow(const struct nft_pipapo_match *mdata,
                                        unsigned long *map, unsigned long *fill,
                                        const struct nft_pipapo_field *f,
-                                       int offset, const u8 *pkt,
+                                       const u8 *pkt,
                                        bool first, bool last)
 {
-       unsigned long bsize = f->bsize;
-       int i, ret = -1, b;
-
        if (first)
                pipapo_resmap_init(mdata, map);
 
-       for (i = offset; i < bsize; i++) {
-               if (f->bb == 8)
-                       pipapo_and_field_buckets_8bit(f, map, pkt);
-               else
-                       pipapo_and_field_buckets_4bit(f, map, pkt);
-               NFT_PIPAPO_GROUP_BITS_ARE_8_OR_4;
-
-               b = pipapo_refill(map, bsize, f->rules, fill, f->mt, last);
+       if (f->bb == 8)
+               pipapo_and_field_buckets_8bit(f, map, pkt);
+       else
+               pipapo_and_field_buckets_4bit(f, map, pkt);
+       NFT_PIPAPO_GROUP_BITS_ARE_8_OR_4;
 
-               if (last)
-                       return b;
-
-               if (ret == -1)
-                       ret = b / XSAVE_YMM_SIZE;
-       }
-
-       return ret;
+       return pipapo_refill(map, f->bsize, f->rules, fill, f->mt, last);
 }
 
 /**
@@ -1201,7 +1187,7 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m,
                                NFT_SET_PIPAPO_AVX2_LOOKUP(8, 16);
                        } else {
                                ret = nft_pipapo_avx2_lookup_slow(m, res, fill, f,
-                                                                 ret, data,
+                                                                 data,
                                                                  first, last);
                        }
                } else {
@@ -1217,7 +1203,7 @@ struct nft_pipapo_elem *pipapo_get_avx2(const struct nft_pipapo_match *m,
                                NFT_SET_PIPAPO_AVX2_LOOKUP(4, 32);
                        } else {
                                ret = nft_pipapo_avx2_lookup_slow(m, res, fill, f,
-                                                                 ret, data,
+                                                                 data,
                                                                  first, last);
                        }
                }