pipeline: build shared object for pipeline
Build the generated C file into a shared object library. Signed-off-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com> Signed-off-by: Cunming Liang <cunming.liang@intel.com>
This commit is contained in:
parent
724f3ef422
commit
f898a475c3
@ -5,6 +5,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
#include "rte_swx_pipeline_internal.h"
|
#include "rte_swx_pipeline_internal.h"
|
||||||
|
|
||||||
@ -8968,9 +8969,13 @@ rte_swx_pipeline_config(struct rte_swx_pipeline **p, int numa_node)
|
|||||||
void
|
void
|
||||||
rte_swx_pipeline_free(struct rte_swx_pipeline *p)
|
rte_swx_pipeline_free(struct rte_swx_pipeline *p)
|
||||||
{
|
{
|
||||||
|
void *lib;
|
||||||
|
|
||||||
if (!p)
|
if (!p)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
lib = p->lib;
|
||||||
|
|
||||||
free(p->instruction_data);
|
free(p->instruction_data);
|
||||||
free(p->instructions);
|
free(p->instructions);
|
||||||
|
|
||||||
@ -8991,6 +8996,9 @@ rte_swx_pipeline_free(struct rte_swx_pipeline *p)
|
|||||||
struct_free(p);
|
struct_free(p);
|
||||||
|
|
||||||
free(p);
|
free(p);
|
||||||
|
|
||||||
|
if (lib)
|
||||||
|
dlclose(lib);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -12205,6 +12213,124 @@ pipeline_codegen(struct rte_swx_pipeline *p, struct instruction_group_list *igl)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef RTE_SWX_PIPELINE_CMD_MAX_SIZE
|
||||||
|
#define RTE_SWX_PIPELINE_CMD_MAX_SIZE 4096
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int
|
||||||
|
pipeline_libload(struct rte_swx_pipeline *p, struct instruction_group_list *igl)
|
||||||
|
{
|
||||||
|
struct action *a;
|
||||||
|
struct instruction_group *g;
|
||||||
|
char *dir_in, *buffer = NULL;
|
||||||
|
const char *dir_out;
|
||||||
|
int status = 0;
|
||||||
|
|
||||||
|
/* Get the environment variables. */
|
||||||
|
dir_in = getenv("RTE_INSTALL_DIR");
|
||||||
|
if (!dir_in) {
|
||||||
|
status = -EINVAL;
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
|
||||||
|
dir_out = "/tmp";
|
||||||
|
|
||||||
|
/* Memory allocation for the command buffer. */
|
||||||
|
buffer = malloc(RTE_SWX_PIPELINE_CMD_MAX_SIZE);
|
||||||
|
if (!buffer) {
|
||||||
|
status = -ENOMEM;
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(buffer,
|
||||||
|
RTE_SWX_PIPELINE_CMD_MAX_SIZE,
|
||||||
|
"gcc -c -O3 -fpic -Wno-deprecated-declarations -o %s/pipeline.o %s/pipeline.c "
|
||||||
|
"-I %s/lib/pipeline "
|
||||||
|
"-I %s/lib/eal/include "
|
||||||
|
"-I %s/lib/eal/x86/include "
|
||||||
|
"-I %s/lib/eal/include/generic "
|
||||||
|
"-I %s/lib/meter "
|
||||||
|
"-I %s/lib/port "
|
||||||
|
"-I %s/lib/table "
|
||||||
|
"-I %s/lib/pipeline "
|
||||||
|
"-I %s/config "
|
||||||
|
"-I %s/build "
|
||||||
|
"-I %s/lib/eal/linux/include "
|
||||||
|
">%s/pipeline.log 2>&1 "
|
||||||
|
"&& "
|
||||||
|
"gcc -shared %s/pipeline.o -o %s/libpipeline.so "
|
||||||
|
">>%s/pipeline.log 2>&1",
|
||||||
|
dir_out,
|
||||||
|
dir_out,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_in,
|
||||||
|
dir_out,
|
||||||
|
dir_out,
|
||||||
|
dir_out,
|
||||||
|
dir_out);
|
||||||
|
|
||||||
|
/* Build the shared object library. */
|
||||||
|
status = system(buffer);
|
||||||
|
if (status)
|
||||||
|
goto free;
|
||||||
|
|
||||||
|
/* Open library. */
|
||||||
|
snprintf(buffer,
|
||||||
|
RTE_SWX_PIPELINE_CMD_MAX_SIZE,
|
||||||
|
"%s/libpipeline.so",
|
||||||
|
dir_out);
|
||||||
|
|
||||||
|
p->lib = dlopen(buffer, RTLD_LAZY);
|
||||||
|
if (!p->lib) {
|
||||||
|
status = -EIO;
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the action function symbols. */
|
||||||
|
TAILQ_FOREACH(a, &p->actions, node) {
|
||||||
|
snprintf(buffer, RTE_SWX_PIPELINE_CMD_MAX_SIZE, "action_%s_run", a->name);
|
||||||
|
|
||||||
|
p->action_funcs[a->id] = dlsym(p->lib, buffer);
|
||||||
|
if (!p->action_funcs[a->id]) {
|
||||||
|
status = -EINVAL;
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the pipeline function symbols. */
|
||||||
|
TAILQ_FOREACH(g, igl, node) {
|
||||||
|
if (g->first_instr_id == g->last_instr_id)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
snprintf(buffer, RTE_SWX_PIPELINE_CMD_MAX_SIZE, "pipeline_func_%u", g->group_id);
|
||||||
|
|
||||||
|
g->func = dlsym(p->lib, buffer);
|
||||||
|
if (!g->func) {
|
||||||
|
status = -EINVAL;
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free:
|
||||||
|
if (status && p->lib) {
|
||||||
|
dlclose(p->lib);
|
||||||
|
p->lib = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
pipeline_compile(struct rte_swx_pipeline *p)
|
pipeline_compile(struct rte_swx_pipeline *p)
|
||||||
{
|
{
|
||||||
@ -12222,6 +12348,11 @@ pipeline_compile(struct rte_swx_pipeline *p)
|
|||||||
if (status)
|
if (status)
|
||||||
goto free;
|
goto free;
|
||||||
|
|
||||||
|
/* Build and load the shared object library. */
|
||||||
|
status = pipeline_libload(p, igl);
|
||||||
|
if (status)
|
||||||
|
goto free;
|
||||||
|
|
||||||
free:
|
free:
|
||||||
instruction_group_list_free(igl);
|
instruction_group_list_free(igl);
|
||||||
|
|
||||||
|
@ -1407,6 +1407,7 @@ struct rte_swx_pipeline {
|
|||||||
struct instruction_data *instruction_data;
|
struct instruction_data *instruction_data;
|
||||||
instr_exec_t *instruction_table;
|
instr_exec_t *instruction_table;
|
||||||
struct thread threads[RTE_SWX_PIPELINE_THREADS_MAX];
|
struct thread threads[RTE_SWX_PIPELINE_THREADS_MAX];
|
||||||
|
void *lib;
|
||||||
|
|
||||||
uint32_t n_structs;
|
uint32_t n_structs;
|
||||||
uint32_t n_ports_in;
|
uint32_t n_ports_in;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user