Signed-off-by: Maxim Uvarov <[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

Reply via email to