[PATCH] acl: fix trie splitting
Arthur Leung
arcyleung at gmail.com
Wed Feb 1 20:34:26 CET 2023
When using a large number of ACL rules, the trie is supposed to split when there are over 2048 nodes.
However, node_count is negative, so node_count > context->cur_node_max never actually runs, so all the nodes created from the rules end up being in one trie.
Original PR with sample files and test output can be found here:
https://github.com/DPDK/dpdk/pull/50
Fixes: dc276b5780c2 ("acl: new library")
Signed-off-by: Arthur Leung <arcyleung at gmail.com>
---
app/test-acl/test-acl.sh | 2 +-
lib/acl/acl_bld.c | 9 +++------
2 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/app/test-acl/test-acl.sh b/app/test-acl/test-acl.sh
index 30814f3fe2..59bfa121cf 100644
--- a/app/test-acl/test-acl.sh
+++ b/app/test-acl/test-acl.sh
@@ -17,7 +17,7 @@
# <proto>'/'<mask>
# trace record format:
# <src_ip_addr><space><dst_ip_addr><space> \
-# <src_port><space<dst_port><space><proto>...<rule_id>
+# <src_port><space><dst_port><space><proto>...<rule_id>
#
# As an example:
# /bin/bash app/test-acl/test-acl.sh build/app/dpdk-test-acl \
diff --git a/lib/acl/acl_bld.c b/lib/acl/acl_bld.c
index 2816632803..6064a8103b 100644
--- a/lib/acl/acl_bld.c
+++ b/lib/acl/acl_bld.c
@@ -946,7 +946,7 @@ build_trie(struct acl_build_context *context, struct rte_acl_build_rule *head,
struct rte_acl_build_rule **last, uint32_t *count)
{
uint32_t n, m;
- int field_index, node_count;
+ int field_index;
struct rte_acl_node *trie;
struct rte_acl_build_rule *prev, *rule;
struct rte_acl_node *end, *merge, *root, *end_prev;
@@ -1048,15 +1048,13 @@ build_trie(struct acl_build_context *context, struct rte_acl_build_rule *head,
}
}
- node_count = context->num_nodes;
(*count)++;
/* merge this rule into the trie */
if (acl_merge_trie(context, trie, root, 0, NULL))
return NULL;
- node_count = context->num_nodes - node_count;
- if (node_count > context->cur_node_max) {
+ if (context->num_nodes > (context->cur_node_max * context->num_tries)) {
*last = prev;
return trie;
}
@@ -1368,6 +1366,7 @@ acl_build_tries(struct acl_build_context *context,
for (n = 0;; n = num_tries) {
num_tries = n + 1;
+ context->num_tries = num_tries;
last = build_one_trie(context, rule_sets, n, context->node_max);
if (context->bld_tries[n].trie == NULL) {
@@ -1411,8 +1410,6 @@ acl_build_tries(struct acl_build_context *context,
}
}
-
- context->num_tries = num_tries;
return 0;
}
--
2.25.1
More information about the dev
mailing list