On 24/04/15 20:45, Bill Fischofer wrote:
There are two aspects to consider: 1. Configuration info that is needed by the underlying ODP implementation 2. ODP implementation-independent parameters that the application may wish to specify The latter can be handled via arguments to odp_global_init(), however the former should not be, as that would make the application implementation-aware. ODP-defined environment variables would seem to be a clean way to handle the former. So a wrapper script could export an ODP_PLATFORM_PARAMS string that is retrieved by odp_global_init() and passed to rte_eal_init() or other SDK being used by the implementation.
Sounds good. I guess it should be part of the API somehow, so I'm adding Petri and the main list. It would need at least some documentation in odp.git, something like this:
"The implementation may require additional configuration which can be passed in the ODP_PLATFORM_PARAMS enviromental parameter. The application code don't have to be aware of this, but the user who runs this should fill this in if the implementation requires this"
So rather than hard-coding this as ODP_DPDK_ARGS, why not make it more general and let each implementation interpret the env variable appropriately to the platform it's using? My guess is other platforms would find this useful in providing their own configuration info. On Fri, Apr 24, 2015 at 2:25 PM, Zoltan Kiss <[email protected] <mailto:[email protected]>> wrote: Indeed, I'm also struggling to figure out how to make this work with OVS: I think currently there is no sane way for the application to know what kind of implementation is running underneath. On 24/04/15 20:17, Bill Fischofer wrote: The fact that DPDK is being used under the covers is intended to be transparent to the ODP application, so we should avoid having the application do anything special for odp_global_init(). Environment vars may be a good means of communicating this info since that can be set by a launch script that wrappers the app without requiring changes to the app itself. Remember, many apps will be written for other platforms and will be porting to x86. Similarly, apps written for x86 need to be independent of DPDK so that they port easily to other ODP platforms. On Fri, Apr 24, 2015 at 2:02 PM, Zoltan Kiss <[email protected] <mailto:[email protected]> <mailto:[email protected] <mailto:[email protected]>>> wrote: On 15/04/15 14:07, Maxim Uvarov wrote: use ODP_DPDK_ARGS env variable to provide internal dpdk things. Signed-off-by: Maxim Uvarov <[email protected] <mailto:[email protected]> <mailto:[email protected] <mailto:[email protected]>>> --- platform/linux-dpdk/odp_init.c | 81 ++++++++++++++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 19 deletions(-) diff --git a/platform/linux-dpdk/odp_init.c b/platform/linux-dpdk/odp_init.c index fa10022..1f42976 100644 --- a/platform/linux-dpdk/odp_init.c +++ b/platform/linux-dpdk/odp_init.c @@ -9,33 +9,76 @@ #include <odp_debug.h> #include <odp_packet_dpdk.h> + +static int parse_dpdk_args(char *args, int *dst_argc, char ***dst_argv) { + char *buf = strdup(args); + int num = 1; + char *delim; + char **argv = calloc(num, sizeof (char *)); + + argv[0] = buf; + + while (1) { + delim = strchr(argv[num - 1], ' '); + if (delim == NULL) + break; + argv = realloc(argv, (num + 1) * sizeof (char *)); + argv[num] = delim + 1; + *delim = 0; + num++; + } + + *dst_argc = num; + *dst_argv = argv; + + return num; +} + + +static void print_dpdk_env_help(void) +{ + printf("use: export ODP_DPDK_ARGS=\"-c COREMASK -n NUM -- -p PORT\"\n"); rte_eal_init() needs the first word to be a the log facility name. Either we should add it during our init, or tell it here to the user that before coremask there should be a word, or at least a space. + printf("-c COREMASK : A hexadecimal bitmask of cores to run on\n"); + printf("-n NUM : Number of memory channels\n"); + printf("after -- specify standard DPDK environment\n"); +} + + int odp_init_dpdk(void) { - int test_argc = 5; - char *test_argv[6]; - int core_count, i, num_cores = 0; - char core_mask[8]; + char **dpdk_argv; + int dpdk_argc; + char *env; + int numargs; + int core_mask, i; - core_count = odp_sys_core_count(); - for (i = 0; i < core_count; i++) - num_cores += (0x1 << i); - sprintf(core_mask, "%x", num_cores); + env = getenv("ODP_DPDK_ARGS"); + if (env == NULL) { + print_dpdk_env_help(); + ODP_ERR("ODP_DPDK_ARGS has to be exported"); + return -1; + } - test_argv[0] = malloc(sizeof("odp_dpdk")); - strcpy(test_argv[0], "odp_dpdk"); - test_argv[1] = malloc(sizeof("-c")); - strcpy(test_argv[1], "-c"); - test_argv[2] = malloc(sizeof(core_mask)); - strcpy(test_argv[2], core_mask); - test_argv[3] = malloc(sizeof("-n")); - strcpy(test_argv[3], "-n"); - test_argv[4] = malloc(sizeof("3")); - strcpy(test_argv[4], "3"); + for (i = 0, core_mask = 0; i < odp_sys_core_count(); i++) + core_mask += (0x1 << i); - if (rte_eal_init(test_argc, (char **)test_argv) < 0) { + char *s= calloc(1, strlen(env) + strlen("progname -c ") + + sizeof(core_mask) + 1); + sprintf(s, "progname -c %x %s", core_mask, env); + + numargs = parse_dpdk_args(s, &dpdk_argc, &dpdk_argv); + while (numargs) { + int i = dpdk_argc - numargs; + ODP_DBG("arg[%d]: %s\n", i, dpdk_argv[i]); + numargs--; + }; + fflush(stdout); + + if (rte_eal_init(dpdk_argc, dpdk_argv) < 0) { ODP_ERR("Cannot init the Intel DPDK EAL!"); return -1; } + ODP_DBG("rte_eal_init OK\n"); if (rte_eal_pci_probe() < 0) { ODP_ERR("Cannot probe PCI\n"); _______________________________________________ lng-odp-dpdk mailing list [email protected] <mailto:[email protected]> <mailto:[email protected] <mailto:[email protected]>> https://lists.linaro.org/mailman/listinfo/lng-odp-dpdk
_______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
