pipeline: enable persistent instruction meta-data
authorCristian Dumitrescu <cristian.dumitrescu@intel.com>
Mon, 13 Sep 2021 16:44:35 +0000 (17:44 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 27 Sep 2021 10:03:23 +0000 (12:03 +0200)
Save the instruction meta-data for later use instead of freeing it up
once the instruction translation is completed.

Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
lib/pipeline/rte_swx_pipeline.c
lib/pipeline/rte_swx_pipeline_internal.h

index 8b64c57..4099e36 100644 (file)
@@ -6456,13 +6456,14 @@ instruction_config(struct rte_swx_pipeline *p,
 
        if (a) {
                a->instructions = instr;
+               a->instruction_data = data;
                a->n_instructions = n_instructions;
        } else {
                p->instructions = instr;
+               p->instruction_data = data;
                p->n_instructions = n_instructions;
        }
 
-       free(data);
        return 0;
 
 error:
@@ -6811,8 +6812,8 @@ action_build(struct rte_swx_pipeline *p)
 {
        struct action *action;
 
-       p->action_instructions = calloc(p->n_actions,
-                                       sizeof(struct instruction *));
+       /* p->action_instructions. */
+       p->action_instructions = calloc(p->n_actions, sizeof(struct instruction *));
        CHECK(p->action_instructions, ENOMEM);
 
        TAILQ_FOREACH(action, &p->actions, node)
@@ -6841,6 +6842,7 @@ action_free(struct rte_swx_pipeline *p)
                        break;
 
                TAILQ_REMOVE(&p->actions, action, node);
+               free(action->instruction_data);
                free(action->instructions);
                free(action);
        }
@@ -8777,6 +8779,7 @@ rte_swx_pipeline_free(struct rte_swx_pipeline *p)
        if (!p)
                return;
 
+       free(p->instruction_data);
        free(p->instructions);
 
        metarray_free(p);
index efd1361..7a02d6c 100644 (file)
@@ -693,6 +693,7 @@ struct action {
        struct struct_type *st;
        int *args_endianness; /* 0 = Host Byte Order (HBO); 1 = Network Byte Order (NBO). */
        struct instruction *instructions;
+       struct instruction_data *instruction_data;
        uint32_t n_instructions;
        uint32_t id;
 };
@@ -1388,6 +1389,7 @@ struct rte_swx_pipeline {
        struct regarray_runtime *regarray_runtime;
        struct metarray_runtime *metarray_runtime;
        struct instruction *instructions;
+       struct instruction_data *instruction_data;
        struct thread threads[RTE_SWX_PIPELINE_THREADS_MAX];
 
        uint32_t n_structs;