mirror of https://gitee.com/openkylin/linux.git
nft_set_pipapo: Prepare for single ranged field usage
A few adjustments in nft_pipapo_init() are needed to allow usage of this set back-end for a single, ranged field. Provide a convenient NFT_PIPAPO_MIN_FIELDS definition that currently makes sure that the rbtree back-end is selected instead, for sets with a single field. This finally allows a fair comparison with rbtree sets, by defining NFT_PIPAPO_MIN_FIELDS as 0 and skipping rbtree back-end initialisation: ---------------.--------------------------.-------------------------. AMD Epyc 7402 | baselines, Mpps | Mpps, % over rbtree | 1 thread |__________________________|_________________________| 3.35GHz | | | | | | 768KiB L1D$ | netdev | hash | rbtree | | pipapo | ---------------| hook | no | single | pipapo |single field| type entries | drop | ranges | field |single field| AVX2 | ---------------|--------|--------|--------|------------|------------| net,port | | | | | | 1000 | 19.0 | 10.4 | 3.8 | 6.0 +58% | 9.6 +153% | ---------------|--------|--------|--------|------------|------------| port,net | | | | | | 100 | 18.8 | 10.3 | 5.8 | 9.1 +57% |11.6 +100% | ---------------|--------|--------|--------|------------|------------| net6,port | | | | | | 1000 | 16.4 | 7.6 | 1.8 | 2.8 +55% | 6.5 +261% | ---------------|--------|--------|--------|------------|------------| port,proto | | | | [1] | [1] | 30000 | 19.6 | 11.6 | 3.9 | 0.9 -77% | 2.7 -31% | ---------------|--------|--------|--------|------------|------------| port,proto | | | | | | 10000 | 19.6 | 11.6 | 4.4 | 2.1 -52% | 5.6 +27% | ---------------|--------|--------|--------|------------|------------| port,proto | | | | | | 4 threads 10000| 77.9 | 45.1 | 17.4 | 8.3 -52% |22.4 +29% | ---------------|--------|--------|--------|------------|------------| net6,port,mac | | | | | | 10 | 16.5 | 5.4 | 4.3 | 4.5 +5% | 8.2 +91% | ---------------|--------|--------|--------|------------|------------| net6,port,mac, | | | | | | proto 1000 | 16.5 | 5.7 | 1.9 | 2.8 +47% | 6.6 +247% | ---------------|--------|--------|--------|------------|------------| net,mac | | | | | | 1000 | 19.0 | 8.4 | 3.9 | 6.0 +54% | 9.9 +154% | ---------------'--------'--------'--------'------------'------------' [1] Causes switch of lookup table buckets for 'port' to 4-bit groups Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
7400b06396
commit
eb16933aa5
|
@ -1983,7 +1983,8 @@ static u64 nft_pipapo_privsize(const struct nlattr * const nla[],
|
|||
static bool nft_pipapo_estimate(const struct nft_set_desc *desc, u32 features,
|
||||
struct nft_set_estimate *est)
|
||||
{
|
||||
if (!(features & NFT_SET_INTERVAL) || desc->field_count <= 1)
|
||||
if (!(features & NFT_SET_INTERVAL) ||
|
||||
desc->field_count < NFT_PIPAPO_MIN_FIELDS)
|
||||
return false;
|
||||
|
||||
est->size = pipapo_estimate_size(desc);
|
||||
|
@ -2016,17 +2017,19 @@ static int nft_pipapo_init(const struct nft_set *set,
|
|||
struct nft_pipapo *priv = nft_set_priv(set);
|
||||
struct nft_pipapo_match *m;
|
||||
struct nft_pipapo_field *f;
|
||||
int err, i;
|
||||
int err, i, field_count;
|
||||
|
||||
if (desc->field_count > NFT_PIPAPO_MAX_FIELDS)
|
||||
field_count = desc->field_count ? : 1;
|
||||
|
||||
if (field_count > NFT_PIPAPO_MAX_FIELDS)
|
||||
return -EINVAL;
|
||||
|
||||
m = kmalloc(sizeof(*priv->match) + sizeof(*f) * desc->field_count,
|
||||
m = kmalloc(sizeof(*priv->match) + sizeof(*f) * field_count,
|
||||
GFP_KERNEL);
|
||||
if (!m)
|
||||
return -ENOMEM;
|
||||
|
||||
m->field_count = desc->field_count;
|
||||
m->field_count = field_count;
|
||||
m->bsize_max = 0;
|
||||
|
||||
m->scratch = alloc_percpu(unsigned long *);
|
||||
|
@ -2050,10 +2053,12 @@ static int nft_pipapo_init(const struct nft_set *set,
|
|||
rcu_head_init(&m->rcu);
|
||||
|
||||
nft_pipapo_for_each_field(f, i, m) {
|
||||
f->bb = NFT_PIPAPO_GROUP_BITS_INIT;
|
||||
f->groups = desc->field_len[i] * NFT_PIPAPO_GROUPS_PER_BYTE(f);
|
||||
int len = desc->field_len[i] ? : set->klen;
|
||||
|
||||
priv->width += round_up(desc->field_len[i], sizeof(u32));
|
||||
f->bb = NFT_PIPAPO_GROUP_BITS_INIT;
|
||||
f->groups = len * NFT_PIPAPO_GROUPS_PER_BYTE(f);
|
||||
|
||||
priv->width += round_up(len, sizeof(u32));
|
||||
|
||||
f->bsize = 0;
|
||||
f->rules = 0;
|
||||
|
|
|
@ -8,6 +8,9 @@
|
|||
/* Count of concatenated fields depends on count of 32-bit nftables registers */
|
||||
#define NFT_PIPAPO_MAX_FIELDS NFT_REG32_COUNT
|
||||
|
||||
/* Restrict usage to multiple fields, make sure rbtree is used otherwise */
|
||||
#define NFT_PIPAPO_MIN_FIELDS 2
|
||||
|
||||
/* Largest supported field size */
|
||||
#define NFT_PIPAPO_MAX_BYTES (sizeof(struct in6_addr))
|
||||
#define NFT_PIPAPO_MAX_BITS (NFT_PIPAPO_MAX_BYTES * BITS_PER_BYTE)
|
||||
|
|
|
@ -1087,7 +1087,8 @@ static int nft_pipapo_avx2_lookup_slow(unsigned long *map, unsigned long *fill,
|
|||
bool nft_pipapo_avx2_estimate(const struct nft_set_desc *desc, u32 features,
|
||||
struct nft_set_estimate *est)
|
||||
{
|
||||
if (!(features & NFT_SET_INTERVAL) || desc->field_count <= 1)
|
||||
if (!(features & NFT_SET_INTERVAL) ||
|
||||
desc->field_count < NFT_PIPAPO_MIN_FIELDS)
|
||||
return false;
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_AVX2) || !boot_cpu_has(X86_FEATURE_AVX))
|
||||
|
|
Loading…
Reference in New Issue