From e2431ab955fe453b5fd25a3ab3090fbf4bf3e653 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Wed, 14 Jun 2023 17:40:02 +0200 Subject: evaluate: Cache looked up set for list commands Evaluation phase checks the given table and set exist in cache. Relieve execution phase from having to perform the lookup again by storing the set reference in cmd->set. Just have to increase the ref counter so cmd_free() does the right thing (which lacked handling of MAP and METER objects for some reason). Signed-off-by: Phil Sutter --- src/evaluate.c | 1 + src/json.c | 9 ++++++--- src/rule.c | 12 ++++++++---- 3 files changed, 15 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/evaluate.c b/src/evaluate.c index d4942e2b..3dc2be0d 100644 --- a/src/evaluate.c +++ b/src/evaluate.c @@ -5374,6 +5374,7 @@ static int cmd_evaluate_list(struct eval_ctx *ctx, struct cmd *cmd) return cmd_error(ctx, &ctx->cmd->handle.set.location, "%s", strerror(ENOENT)); + cmd->set = set_get(set); return 0; case CMD_OBJ_CHAIN: table = table_cache_find(&ctx->nft->cache.table_cache, diff --git a/src/json.c b/src/json.c index 21199ca4..a119dfc4 100644 --- a/src/json.c +++ b/src/json.c @@ -1799,10 +1799,13 @@ static json_t *do_list_chains_json(struct netlink_ctx *ctx, struct cmd *cmd) static json_t *do_list_set_json(struct netlink_ctx *ctx, struct cmd *cmd, struct table *table) { - struct set *set = set_cache_find(table, cmd->handle.set.name); + struct set *set = cmd->set; - if (set == NULL) - return json_null(); + if (!set) { + set = set_cache_find(table, cmd->handle.set.name); + if (set == NULL) + return json_null(); + } return json_pack("[o]", set_print_json(&ctx->nft->output, set)); } diff --git a/src/rule.c b/src/rule.c index 19d681bb..18a566f9 100644 --- a/src/rule.c +++ b/src/rule.c @@ -1356,6 +1356,8 @@ void cmd_free(struct cmd *cmd) set_free(cmd->elem.set); break; case CMD_OBJ_SET: + case CMD_OBJ_MAP: + case CMD_OBJ_METER: case CMD_OBJ_SETELEMS: set_free(cmd->set); break; @@ -2283,11 +2285,13 @@ static void __do_list_set(struct netlink_ctx *ctx, struct cmd *cmd, static int do_list_set(struct netlink_ctx *ctx, struct cmd *cmd, struct table *table) { - struct set *set; + struct set *set = cmd->set; - set = set_cache_find(table, cmd->handle.set.name); - if (set == NULL) - return -1; + if (!set) { + set = set_cache_find(table, cmd->handle.set.name); + if (set == NULL) + return -1; + } __do_list_set(ctx, cmd, set); -- cgit v1.2.3