Merged,
Maxim.

On 04/27/16 16:33, Bill Fischofer wrote:


On Wed, Apr 27, 2016 at 4:13 AM, Maxim Uvarov <[email protected] <mailto:[email protected]>> wrote:

    Signed-off-by: Maxim Uvarov <[email protected]
    <mailto:[email protected]>>


Reviewed-and-tested-by: Bill Fischofer <[email protected] <mailto:[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] <mailto:[email protected]>
    https://lists.linaro.org/mailman/listinfo/lng-odp



_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to