On Wed, Apr 27, 2016 at 4:13 AM, Maxim Uvarov <[email protected]> wrote:
> Signed-off-by: Maxim Uvarov <[email protected]> > Reviewed-and-tested-by: Bill Fischofer <[email protected]> > --- > Note: by default ipc_pkt is turned on. But examples compilation and > execution > is turned off. You need to add --enable-pktio_ipc-support to > ./configure > I think there will be separate patch to finally enable it after > several > loops in CI. > > Maxim. > > .../include/odp/api/plat/init_types.h | 1 + > platform/linux-generic/include/odp_internal.h | 1 + > platform/linux-generic/include/odp_shm_internal.h | 5 ++++ > platform/linux-generic/odp_init.c | 5 +++- > platform/linux-generic/odp_shared_memory.c | 12 ++++++--- > platform/linux-generic/pktio/ipc.c | 28 > ++++++++++++++------- > platform/linux-generic/test/pktio_ipc/ipc_common.c | 20 ++++++++++++--- > platform/linux-generic/test/pktio_ipc/ipc_common.h | 3 +++ > platform/linux-generic/test/pktio_ipc/pktio_ipc1.c | 29 > +++++++++++++--------- > platform/linux-generic/test/pktio_ipc/pktio_ipc2.c | 24 +++++++++++------- > .../linux-generic/test/pktio_ipc/pktio_ipc_run | 17 ++++++------- > 11 files changed, 96 insertions(+), 49 deletions(-) > > diff --git a/platform/linux-generic/include/odp/api/plat/init_types.h > b/platform/linux-generic/include/odp/api/plat/init_types.h > index 6a1052d..888b04a 100644 > --- a/platform/linux-generic/include/odp/api/plat/init_types.h > +++ b/platform/linux-generic/include/odp/api/plat/init_types.h > @@ -25,6 +25,7 @@ typedef uint64_t odp_instance_t; > * @internal platform specific data > */ > typedef struct odp_platform_init_t { > + int ipc_ns; /**< Name space for ipc shared objects. */ > } odp_platform_init_t; > > #ifdef __cplusplus > diff --git a/platform/linux-generic/include/odp_internal.h > b/platform/linux-generic/include/odp_internal.h > index d8aa7af..28a4fc4 100644 > --- a/platform/linux-generic/include/odp_internal.h > +++ b/platform/linux-generic/include/odp_internal.h > @@ -46,6 +46,7 @@ struct odp_global_data_s { > odp_cpumask_t control_cpus; > odp_cpumask_t worker_cpus; > int num_cpus_installed; > + int ipc_ns; > }; > > enum init_stage { > diff --git a/platform/linux-generic/include/odp_shm_internal.h > b/platform/linux-generic/include/odp_shm_internal.h > index 1fd7a3c..30e60f7 100644 > --- a/platform/linux-generic/include/odp_shm_internal.h > +++ b/platform/linux-generic/include/odp_shm_internal.h > @@ -11,6 +11,11 @@ > extern "C" { > #endif > > +#include <odp/api/shared_memory.h> > + > +#define SHM_DEVNAME_MAXLEN (ODP_SHM_NAME_LEN + 16) > +#define SHM_DEVNAME_FORMAT "/odp-%d-%s" /* /dev/shm/odp-<pid>-<name> */ > + > #define _ODP_SHM_PROC_NOCREAT 0x4 /**< Do not create shm if not exist */ > #define _ODP_SHM_O_EXCL 0x8 /**< Do not create shm if exist > */ > > diff --git a/platform/linux-generic/odp_init.c > b/platform/linux-generic/odp_init.c > index 51aaa9a..e8d12c9 100644 > --- a/platform/linux-generic/odp_init.c > +++ b/platform/linux-generic/odp_init.c > @@ -12,9 +12,12 @@ struct odp_global_data_s odp_global_data; > > int odp_init_global(odp_instance_t *instance, > const odp_init_t *params, > - const odp_platform_init_t *platform_params ODP_UNUSED) > + const odp_platform_init_t *platform_params) > { > + memset(&odp_global_data, 0, sizeof(struct odp_global_data_s)); > odp_global_data.main_pid = getpid(); > + if (platform_params) > + odp_global_data.ipc_ns = platform_params->ipc_ns; > > enum init_stage stage = NO_INIT; > odp_global_data.log_fn = odp_override_log; > diff --git a/platform/linux-generic/odp_shared_memory.c > b/platform/linux-generic/odp_shared_memory.c > index 276a785..568711a 100644 > --- a/platform/linux-generic/odp_shared_memory.c > +++ b/platform/linux-generic/odp_shared_memory.c > @@ -27,9 +27,6 @@ > #include <string.h> > #include <errno.h> > > -#define SHM_DEVNAME_MAXLEN (ODP_SHM_NAME_LEN + 16) > -#define SHM_DEVNAME_FORMAT "/odp-%d-%s" /* /dev/shm/odp-<pid>-<name> */ > - > ODP_STATIC_ASSERT(ODP_CONFIG_SHM_BLOCKS >= ODP_CONFIG_POOLS, > "ODP_CONFIG_SHM_BLOCKS < ODP_CONFIG_POOLS"); > > @@ -231,11 +228,18 @@ odp_shm_t odp_shm_reserve(const char *name, uint64_t > size, uint64_t align, > oflag |= O_EXCL; > > if (flags & (ODP_SHM_PROC | _ODP_SHM_PROC_NOCREAT)) { > + int shm_ns_id; > + > + if (odp_global_data.ipc_ns) > + shm_ns_id = odp_global_data.ipc_ns; > + else > + shm_ns_id = odp_global_data.main_pid; > + > need_huge_page = 0; > > /* Creates a file to /dev/shm/odp */ > snprintf(shm_devname, SHM_DEVNAME_MAXLEN, > - SHM_DEVNAME_FORMAT, odp_global_data.main_pid, > name); > + SHM_DEVNAME_FORMAT, shm_ns_id, name); > fd = shm_open(shm_devname, oflag, > S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); > if (fd == -1) { > diff --git a/platform/linux-generic/pktio/ipc.c > b/platform/linux-generic/pktio/ipc.c > index 4a17e36..b16c611 100644 > --- a/platform/linux-generic/pktio/ipc.c > +++ b/platform/linux-generic/pktio/ipc.c > @@ -45,13 +45,23 @@ static const char > *_ipc_odp_buffer_pool_shm_name(odp_pool_t pool_hdl) > static int _ipc_shm_lookup(const char *name) > { > int shm; > + char shm_devname[SHM_DEVNAME_MAXLEN]; > > - shm = shm_open(name, O_RDWR, S_IRUSR | S_IWUSR); > + if (!odp_global_data.ipc_ns) > + ODP_ABORT("ipc_ns not set\n"); > + > + snprintf(shm_devname, SHM_DEVNAME_MAXLEN, > + SHM_DEVNAME_FORMAT, > + odp_global_data.ipc_ns, name); > + > + shm = shm_open(shm_devname, O_RDWR, S_IRUSR | S_IWUSR); > if (shm == -1) { > - if (errno == ENOENT) > + if (errno == ENOENT) { > + ODP_DBG("no file %s\n", shm_devname); > return -1; > + } > ODP_ABORT("shm_open for %s err %s\n", > - name, strerror(errno)); > + shm_devname, strerror(errno)); > } > close(shm); > return 0; > @@ -583,6 +593,8 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry, > int ret; > unsigned i; > uint32_t ready = odp_atomic_load_u32(&pktio_entry->s.ipc.ready); > + odp_packet_t pkt_table_mapped[len]; /**< Ready to send packet has > to be > + * in memory mapped pool. */ > > if (odp_unlikely(!ready)) > return 0; > @@ -610,8 +622,9 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry, > ODP_ABORT("Unable to copy packet\n"); > > odp_packet_free(pkt); > - /* Cannot do this. Packet table is const. */ > - /*pkt_table[i] = newpkt;*/ > + pkt_table_mapped[i] = newpkt; > + } else { > + pkt_table_mapped[i] = pkt; > } > > rbuf_p = (void *)&pkt; > @@ -626,10 +639,7 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry, > } > > /* Put packets to ring to be processed by other process. */ > - /* BUG: Cannot store pointer to user provided memory, > - which is likely allocated from the stack and will be overwritten > - after this function returns. */ > -/* rbuf_p = (void *)&pkt_table[0]; */ > + rbuf_p = (void *)&pkt_table_mapped[0]; > r = pktio_entry->s.ipc.tx.send; > ret = _ring_mp_enqueue_burst(r, rbuf_p, len); > if (odp_unlikely(ret < 0)) { > diff --git a/platform/linux-generic/test/pktio_ipc/ipc_common.c > b/platform/linux-generic/test/pktio_ipc/ipc_common.c > index 101f597..34d2632 100644 > --- a/platform/linux-generic/test/pktio_ipc/ipc_common.c > +++ b/platform/linux-generic/test/pktio_ipc/ipc_common.c > @@ -8,6 +8,7 @@ > > /** Run time in seconds */ > int run_time_sec; > +int ipc_name_space; > > int ipc_odp_packet_sendall(odp_pktio_t pktio, > odp_packet_t pkt_tbl[], int num) > @@ -80,14 +81,16 @@ void parse_args(int argc, char *argv[]) > int long_index; > static struct option longopts[] = { > {"time", required_argument, NULL, 't'}, > - {"help", no_argument, NULL, 'h'}, /* return > 'h' */ > + {"ns", required_argument, NULL, 'n'}, /* ipc name space */ > + {"help", no_argument, NULL, 'h'}, /* return 'h' */ > {NULL, 0, NULL, 0} > }; > > run_time_sec = 0; /* loop forever if time to run is 0 */ > + ipc_name_space = 0; > > while (1) { > - opt = getopt_long(argc, argv, "+t:h", > + opt = getopt_long(argc, argv, "+t:n:h", > longopts, &long_index); > > if (opt == -1) > @@ -97,17 +100,24 @@ void parse_args(int argc, char *argv[]) > case 't': > run_time_sec = atoi(optarg); > break; > + case 'n': > + ipc_name_space = atoi(optarg); > + break; > case 'h': > usage(argv[0]); > exit(EXIT_SUCCESS); > break; > - > default: > break; > } > } > > optind = 1; /* reset 'extern optind' from the getopt > lib */ > + > + if (!ipc_name_space) { > + usage(argv[0]); > + exit(1); > + } > } > > /** > @@ -138,10 +148,12 @@ void usage(char *progname) > { > printf("\n" > "Usage: %s OPTIONS\n" > - " E.g. %s -t seconds\n" > + " E.g. -n ipc_name_space %s -t seconds\n" > "\n" > "OpenDataPlane linux-generic ipc test application.\n" > "\n" > + "Mandatory OPTIONS:\n" > + " -n, --ns IPC name space ID > /dev/shm/odp-<ns>-objname.\n" > "Optional OPTIONS\n" > " -h, --help Display help and exit.\n" > " -t, --time Time to run in seconds.\n" > diff --git a/platform/linux-generic/test/pktio_ipc/ipc_common.h > b/platform/linux-generic/test/pktio_ipc/ipc_common.h > index c5e3eb7..7bc483f 100644 > --- a/platform/linux-generic/test/pktio_ipc/ipc_common.h > +++ b/platform/linux-generic/test/pktio_ipc/ipc_common.h > @@ -62,6 +62,9 @@ char *pktio_name; > /** Run time in seconds */ > int run_time_sec; > > +/** IPC name space id /dev/shm/odp-nsid-objname */ > +int ipc_name_space; > + > /* helper funcs */ > void parse_args(int argc, char *argv[]); > void print_info(char *progname); > diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c > b/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c > index cec2b07..a4eed88 100644 > --- a/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c > +++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc1.c > @@ -113,9 +113,9 @@ static int pktio_run_loop(odp_pool_t pool) > EXAMPLE_ABORT("invalid l4 > offset\n"); > > off += ODPH_UDPHDR_LEN; > - ret = odp_packet_copydata_out(pkt, off, > - sizeof(head), > - &head); > + ret = odp_packet_copy_to_mem(pkt, off, > + sizeof(head), > + &head); > if (ret) { > stat_errors++; > odp_packet_free(pkt); > @@ -137,9 +137,9 @@ static int pktio_run_loop(odp_pool_t pool) > } > > off = odp_packet_len(pkt) - > sizeof(pkt_tail_t); > - ret = odp_packet_copydata_out(pkt, off, > - sizeof(tail), > - &tail); > + ret = odp_packet_copy_to_mem(pkt, off, > + sizeof(tail), > + &tail); > if (ret) { > stat_errors++; > odp_packet_free(pkt); > @@ -210,15 +210,15 @@ static int pktio_run_loop(odp_pool_t pool) > head.seq = cnt++; > > off += ODPH_UDPHDR_LEN; > - ret = odp_packet_copydata_in(pkt, off, > sizeof(head), > - &head); > + ret = odp_packet_copy_from_mem(pkt, off, > sizeof(head), > + &head); > if (ret) > EXAMPLE_ABORT("unable to copy in head > data"); > > tail.magic = TEST_SEQ_MAGIC; > off = odp_packet_len(pkt) - sizeof(pkt_tail_t); > - ret = odp_packet_copydata_in(pkt, off, > sizeof(tail), > - &tail); > + ret = odp_packet_copy_from_mem(pkt, off, > sizeof(tail), > + &tail); > if (ret) > EXAMPLE_ABORT("unable to copy in tail > data"); > } > @@ -280,19 +280,24 @@ int main(int argc, char *argv[]) > { > odp_pool_t pool; > odp_pool_param_t params; > + odp_instance_t instance; > + odp_platform_init_t plat_idata; > int ret; > > /* Parse and store the application arguments */ > parse_args(argc, argv); > > + memset(&plat_idata, 0, sizeof(odp_platform_init_t)); > + plat_idata.ipc_ns = ipc_name_space; > + > /* Init ODP before calling anything else */ > - if (odp_init_global(NULL, NULL)) { > + if (odp_init_global(&instance, NULL, &plat_idata)) { > EXAMPLE_ERR("Error: ODP global init failed.\n"); > exit(EXIT_FAILURE); > } > > /* Init this thread */ > - if (odp_init_local(ODP_THREAD_CONTROL)) { > + if (odp_init_local(instance, ODP_THREAD_CONTROL)) { > EXAMPLE_ERR("Error: ODP local init failed.\n"); > exit(EXIT_FAILURE); > } > diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c > b/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c > index a133d8b..c0c6ff5 100644 > --- a/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c > +++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc2.c > @@ -101,8 +101,8 @@ static int ipc_second_process(void) > EXAMPLE_ABORT("invalid l4 offset\n"); > > off += ODPH_UDPHDR_LEN; > - ret = odp_packet_copydata_out(pkt, off, > sizeof(head), > - &head); > + ret = odp_packet_copy_to_mem(pkt, off, > sizeof(head), > + &head); > if (ret) > EXAMPLE_ABORT("unable copy out head data"); > > @@ -111,8 +111,8 @@ static int ipc_second_process(void) > > /* Modify magic number in packet */ > head.magic = TEST_SEQ_MAGIC_2; > - ret = odp_packet_copydata_in(pkt, off, > sizeof(head), > - &head); > + ret = odp_packet_copy_from_mem(pkt, off, > sizeof(head), > + &head); > if (ret) > EXAMPLE_ABORT("unable to copy in head > data"); > } > @@ -136,9 +136,9 @@ static int ipc_second_process(void) > > off = odp_packet_l4_offset(alloc_pkt); > off += ODPH_UDPHDR_LEN; > - ret = odp_packet_copydata_in(alloc_pkt, off, > - sizeof(head), > - &head); > + ret = odp_packet_copy_from_mem(alloc_pkt, off, > + sizeof(head), > + &head); > if (ret) > EXAMPLE_ABORT("unable to copy in head > data"); > > @@ -173,16 +173,22 @@ exit: > > int main(int argc, char *argv[]) > { > + odp_instance_t instance; > + odp_platform_init_t plat_idata; > + > /* Parse and store the application arguments */ > parse_args(argc, argv); > > - if (odp_init_global(NULL, NULL)) { > + memset(&plat_idata, 0, sizeof(odp_platform_init_t)); > + plat_idata.ipc_ns = ipc_name_space; > + > + if (odp_init_global(&instance, NULL, &plat_idata)) { > EXAMPLE_ERR("Error: ODP global init failed.\n"); > exit(EXIT_FAILURE); > } > > /* Init this thread */ > - if (odp_init_local(ODP_THREAD_CONTROL)) { > + if (odp_init_local(instance, ODP_THREAD_CONTROL)) { > EXAMPLE_ERR("Error: ODP local init failed.\n"); > exit(EXIT_FAILURE); > } > diff --git a/platform/linux-generic/test/pktio_ipc/pktio_ipc_run > b/platform/linux-generic/test/pktio_ipc/pktio_ipc_run > index 08a7457..1128002 100755 > --- a/platform/linux-generic/test/pktio_ipc/pktio_ipc_run > +++ b/platform/linux-generic/test/pktio_ipc/pktio_ipc_run > @@ -20,18 +20,17 @@ PATH=.:$PATH > run() > { > local ret=0 > + IPC_NS=$$ > > #if test was interrupted with CTRL+c than files > #might remain in shm. Needed cleanely delete them. > - rm -rf /dev/shm/ipc_pktio_* 2>&1 > /dev/null > - rm -rf /dev/shm/packet_pool1 2>&1 > /dev/null > - rm -rf /dev/shm/packet_pool2 2>&1 > /dev/null > + rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null > > echo "==== run pktio_ipc1 then pktio_ipc2 ====" > - pktio_ipc1${EXEEXT} -t 30 & > + pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 30 & > IPC_PID=$! > > - pktio_ipc2${EXEEXT} -t 10 > + pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10 > ret=$? > # pktio_ipc1 should do clean up and exit just > # after pktio_ipc2 exited. If it does not happen > @@ -39,9 +38,7 @@ run() > sleep 1 > kill ${IPC_PID} 2>&1 > /dev/null > if [ $? -eq 0 ]; then > - rm -rf /dev/shm/ipc_pktio_* 2>&1 > /dev/null > - rm -rf /dev/shm/packet_pool1 2>&1 > /dev/null > - rm -rf /dev/shm/packet_pool2 2>&1 > /dev/null > + rm -rf /dev/shm/odp-${IPC_NS}* 2>&1 > /dev/null > fi > > if [ $ret -ne 0 ]; then > @@ -52,10 +49,10 @@ run() > fi > > echo "==== run pktio_ipc2 then pktio_ipc1 ====" > - pktio_ipc2${EXEEXT} -t 10 & > + pktio_ipc2${EXEEXT} -n ${IPC_NS} -t 10 & > IPC_PID=$! > > - pktio_ipc1${EXEEXT} -t 20 > + pktio_ipc1${EXEEXT} -n ${IPC_NS} -t 20 > ret=$? > (kill ${IPC_PID} 2>&1 > /dev/null) > /dev/null || true > > -- > 2.7.1.250.gff4ea60 > > _______________________________________________ > lng-odp mailing list > [email protected] > https://lists.linaro.org/mailman/listinfo/lng-odp >
_______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
