On 2 March 2016 at 09:52, Christophe Milard <[email protected]>
wrote:

> Adding a platform side test to test sharing memory between ODP and linux.
> Also tests that the shared memory device name (under /dev/shm/) is scoped.
>
> Signed-off-by: Christophe Milard <[email protected]>
> Reviewed-and-tested-by: Bill Fischofer <[email protected]>
> ---
>  platform/linux-generic/m4/configure.m4           |   1 +
>  platform/linux-generic/test/Makefile.am          |   4 +-
>  platform/linux-generic/test/shmem/.gitignore     |   2 +
>  platform/linux-generic/test/shmem/Makefile.am    |  18 +++
>  platform/linux-generic/test/shmem/shmem.h        |  21 +++
>  platform/linux-generic/test/shmem/shmem_common.h |  23 ++++
>  platform/linux-generic/test/shmem/shmem_linux.c  | 156
> +++++++++++++++++++++++
>  platform/linux-generic/test/shmem/shmem_linux.h  |   9 ++
>  platform/linux-generic/test/shmem/shmem_odp.c    |  74 +++++++++++
>  platform/linux-generic/test/shmem/shmem_odp.h    |   7 +
>  10 files changed, 314 insertions(+), 1 deletion(-)
>  create mode 100644 platform/linux-generic/test/shmem/.gitignore
>  create mode 100644 platform/linux-generic/test/shmem/Makefile.am
>  create mode 100644 platform/linux-generic/test/shmem/shmem.h
>  create mode 100644 platform/linux-generic/test/shmem/shmem_common.h
>  create mode 100644 platform/linux-generic/test/shmem/shmem_linux.c
>  create mode 100644 platform/linux-generic/test/shmem/shmem_linux.h
>  create mode 100644 platform/linux-generic/test/shmem/shmem_odp.c
>  create mode 100644 platform/linux-generic/test/shmem/shmem_odp.h
>
> diff --git a/platform/linux-generic/m4/configure.m4
> b/platform/linux-generic/m4/configure.m4
> index df6dc64..f24e0fb 100644
> --- a/platform/linux-generic/m4/configure.m4
> +++ b/platform/linux-generic/m4/configure.m4
> @@ -23,4 +23,5 @@ m4_include([platform/linux-generic/m4/odp_pcap.m4])
>
>  AC_CONFIG_FILES([platform/linux-generic/Makefile
>                  platform/linux-generic/test/Makefile
> +                platform/linux-generic/test/shmem/Makefile
>                  platform/linux-generic/test/pktio/Makefile])
> diff --git a/platform/linux-generic/test/Makefile.am
> b/platform/linux-generic/test/Makefile.am
> index db923b8..c24afe9 100644
> --- a/platform/linux-generic/test/Makefile.am
> +++ b/platform/linux-generic/test/Makefile.am
> @@ -1,11 +1,13 @@
>  include $(top_srcdir)/test/Makefile.inc
>  TESTS_ENVIRONMENT += TEST_DIR=${top_builddir}/test/validation
>
> -ODP_MODULES = pktio
> +ODP_MODULES = pktio \
> +             shmem
>
>  if test_vald
>  TESTS = pktio/pktio_run \
>         pktio/pktio_run_tap \
> +       shmem/shmem_linux \
>         ${top_builddir}/test/validation/atomic/atomic_main$(EXEEXT) \
>         ${top_builddir}/test/validation/barrier/barrier_main$(EXEEXT) \
>         ${top_builddir}/test/validation/buffer/buffer_main$(EXEEXT) \
> diff --git a/platform/linux-generic/test/shmem/.gitignore
> b/platform/linux-generic/test/shmem/.gitignore
> new file mode 100644
> index 0000000..7627079
> --- /dev/null
> +++ b/platform/linux-generic/test/shmem/.gitignore
> @@ -0,0 +1,2 @@
> +shmem_linux
> +shmem_odp
> diff --git a/platform/linux-generic/test/shmem/Makefile.am
> b/platform/linux-generic/test/shmem/Makefile.am
> new file mode 100644
> index 0000000..ffec6ee
> --- /dev/null
> +++ b/platform/linux-generic/test/shmem/Makefile.am
> @@ -0,0 +1,18 @@
> +include ../Makefile.inc
> +
> +#the main test program is shmem_linux, which, in turn, starts a shmem_odp:
> +test_PROGRAMS = shmem_linux$(EXEEXT)
> +test_extra_PROGRAMS = shmem_odp$(EXEEXT)
> +test_extradir = $(testdir)
> +
> +#shmem_linux is stand alone, pure linux (no ODP):
> +dist_shmem_linux_SOURCES = shmem_linux.c
> +shmem_linux_LDFLAGS = $(AM_LDFLAGS) -lrt
> +
> +#shmem_odp is the odp part:
> +dist_shmem_odp_SOURCES = shmem_odp.c
> +shmem_odp_CFLAGS = $(AM_CFLAGS) \
> +                  $(INCCUNIT_COMMON) \
> +                  $(INCODP)
> +shmem_odp_LDFLAGS = $(AM_LDFLAGS)
> +shmem_odp_LDADD = $(LIBCUNIT_COMMON) $(LIBODP)
> diff --git a/platform/linux-generic/test/shmem/shmem.h
> b/platform/linux-generic/test/shmem/shmem.h
> new file mode 100644
> index 0000000..2368a2e
> --- /dev/null
> +++ b/platform/linux-generic/test/shmem/shmem.h
> @@ -0,0 +1,21 @@
> +/* Copyright (c) 2016, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:     BSD-3-Clause
> + */
> +
> +#ifndef _ODP_LINUX_TEST_SHMEM_H_
> +#define _ODP_LINUX_TEST_SHMEM_H_
> +
> +#include <odp_cunit_common.h>
> +
> +/* test functions: */
> +void shmem_test_odp_shm_proc(void);
> +
> +/* test arrays: */
> +extern odp_testinfo_t shmem_linux_suite[];
> +
> +/* test registry: */
> +extern odp_suiteinfo_t shmem_linux_suites[];
> +
> +#endif
> diff --git a/platform/linux-generic/test/shmem/shmem_common.h
> b/platform/linux-generic/test/shmem/shmem_common.h
> new file mode 100644
> index 0000000..16227ec
> --- /dev/null
> +++ b/platform/linux-generic/test/shmem/shmem_common.h
> @@ -0,0 +1,23 @@
> +/* Copyright (c) 2016, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:     BSD-3-Clause
> + */
> +
> +#ifndef _COMMON_TEST_SHMEM_H_
> +#define _COMMON_TEST_SHMEM_H_
> +
> +#define ODP_SHM_NAME "odp_linux_shared_mem"
> +#define FIFO_NAME_FMT "/tmp/shmem_test_fifo-%d"
> +#define ALIGN_SIZE  (128)
> +#define TEST_SHARE_FOO (0xf0f0f0f0)
> +#define TEST_SHARE_BAR (0xf0f0f0f)
> +#define TEST_FAILURE 'F'
> +#define TEST_SUCCESS 'S'
> +
> +typedef struct {
> +       uint32_t foo;
> +       uint32_t bar;
> +} test_shared_linux_data_t;
> +
> +#endif
> diff --git a/platform/linux-generic/test/shmem/shmem_linux.c
> b/platform/linux-generic/test/shmem/shmem_linux.c
> new file mode 100644
> index 0000000..516bbe4
> --- /dev/null
> +++ b/platform/linux-generic/test/shmem/shmem_linux.c
> @@ -0,0 +1,156 @@
> +/* Copyright (c) 2014, Linaro Limited
>

2016 ?


> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:     BSD-3-Clause
> + */
> +
> +/* this test makes sure that odp shared memory created with the
> ODP_SHM_PROC
> + * flag is visible under linux. It therefore checks both that the device
> + * name under /dev/shm is correct, and also checks that the memory
> contents
> + * is indeed shared.
> + * we want:
> + * -the odp test to run using C UNIT
> + * -the main process to return the correct return code.
> + *  (for the autotools test harness)
> + *
> + * To achieve this, the flow of operations is as follows:
> + *
> + *   linux process (main, non odp)     |       ODP process
> + *   (shmem_linux.c)                   |       (shmem_odp.c)
> + *                                     |
> + *   main()                            |
> + *   forks odp process                 |  allocate shmem
> + *   wait for named pipe creation      |  populate shmem
> + *                                     |  create named pipe
> + *   read shared memory                        |  wait for test report in
> fifo
> + *   check if memory contents is OK    |
> + *   if OK, write "S" in fifo, else "F" |  report success or failure to
> C-Unit
> + *   wait for child terminaison & status|  terminate with usual F/S status
> + *   terminate with same status as child|
> + *                                     |
> + *                                    \|/
> + *                                   time
> + */
> +
> +#include <stdint.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <fcntl.h>
> +#include <sys/stat.h>
> +#include <sys/wait.h>
> +#include <linux/limits.h>
> +#include <stdio.h>
> +#include <errno.h>
> +#include <sys/mman.h>
> +#include <libgen.h>
> +#include <linux/limits.h>
> +#include "shmem_linux.h"
> +#include "shmem_common.h"
> +
> +#define ODP_APP_NAME "shmem_odp" /* name of the odp program, in this dir
> */
> +#define DEVNAME_FMT "odp-%d-%s"  /* shm device format: odp-<pid>-<name>
> */
> +
> +void test_success(char *fifo_name, int fd, pid_t odp_app)
> +{
> +       int status;
> +       int nb_char;
> +       char result = TEST_SUCCESS;
> +       /* write "Success" to the FIFO */
> +       nb_char = write(fd, &result, sizeof(char));
> +       close(fd);
> +       /* wait for the odp app to terminate */
> +       waitpid(odp_app, &status, 0);
> +       /* if the write failed, report an error anyway */
> +       if (nb_char != 1)
> +               status = 1;
> +       unlink(fifo_name);
> +       exit(status);   /* the status reported by the odp side is returned
> */
> +}
> +
> +void test_failure(char *fifo_name, int fd, pid_t odp_app)
> +{
> +       int status;
> +       char result;
> +
> +       int nb_char __attribute__((unused)); /*ignored: we fail anyway */
> +
> +       result = TEST_FAILURE;
> +       /* write "Success" to the FIFO */
> +       nb_char = write(fd, &result, sizeof(char));
> +       close(fd);
> +       /* wait for the odp app to terminate */
> +       waitpid(odp_app, &status, 0);
> +       unlink(fifo_name);
> +       exit(1); /* error */
> +}
> +
> +int main(int argc __attribute__((unused)), char *argv[])
> +{
> +       char prg_name[PATH_MAX];
> +       char odp_name[PATH_MAX];
> +       int nb_sec = 0;
> +       int size;
> +       pid_t odp_app;
> +       char *odp_params = NULL;
> +       char fifo_name[PATH_MAX];  /* fifo for linux->odp feedback */
> +       int fifo_fd;
> +       char shm_devname[PATH_MAX];/* shared mem device name, under
> /dev/shm */
> +       int shm_fd;
> +       test_shared_linux_data_t *addr;
> +
> +       /* odp app is in the same directory as this file: */
> +       strncpy(prg_name, argv[0], PATH_MAX);
> +       sprintf(odp_name, "%s/%s", dirname(prg_name), ODP_APP_NAME);
> +
> +       /* start the ODP application: */
> +       odp_app = fork();
> +       if (odp_app < 0)  /* error */
> +               exit(1);
> +
> +       if (odp_app == 0) /* child */
> +               execv(odp_name, &odp_params);
> +
> +       /* wait max 30 sec for the fifo to be created by the ODP side.
> +        * Just die if time expire as there is no fifo to communicate
> +        * through... */
> +       sprintf(fifo_name, FIFO_NAME_FMT, odp_app);
> +       while (access(fifo_name, W_OK) != 0) {
> +               sleep(1);
> +               if  (nb_sec++ == 30)
> +                       exit(1);
> +       }
> +       fifo_fd = open(fifo_name, O_WRONLY);
> +       printf("pipe found\n");
> +
> +       /* the linux named pipe has now been found, meaning that the
> +        * ODP application is up and running, and has allocated shmem.
> +        * check to see if linux can see the created shared memory: */
> +
> +       sprintf(shm_devname, DEVNAME_FMT, odp_app, ODP_SHM_NAME);
> +
> +       /* O_CREAT flag not given => failure if shm_devname does not
> already
> +        * exist */
> +       shm_fd = shm_open(shm_devname, O_RDONLY,
> +                         S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
> +       if (shm_fd == -1)
> +               test_failure(fifo_name, shm_fd, odp_app);
> +
> +       /* we know that the linux generic ODP actually allocates the
> required
> +        * size + alignment and aligns the returned address after.
> +        * we must do the same here: */
> +       size = sizeof(test_shared_linux_data_t) + ALIGN_SIZE;
> +       addr = mmap(NULL, size, PROT_READ, MAP_SHARED, shm_fd, 0);
> +       if (addr == MAP_FAILED)
> +               test_failure(fifo_name, shm_fd, odp_app);
> +
> +       /* perform manual alignment */
> +       addr = (test_shared_linux_data_t *)((((unsigned long int)addr +
> +                                ALIGN_SIZE - 1) / ALIGN_SIZE) *
> ALIGN_SIZE);
> +
> +       /* check that we see what the ODP application wrote in the memory
> */
> +       if ((addr->foo == TEST_SHARE_FOO) && (addr->bar == TEST_SHARE_BAR))
> +               test_success(fifo_name, fifo_fd, odp_app);
> +       else
> +               test_failure(fifo_name, fifo_fd, odp_app);
> +}
> diff --git a/platform/linux-generic/test/shmem/shmem_linux.h
> b/platform/linux-generic/test/shmem/shmem_linux.h
> new file mode 100644
> index 0000000..a07a775
> --- /dev/null
> +++ b/platform/linux-generic/test/shmem/shmem_linux.h
> @@ -0,0 +1,9 @@
> +/* Copyright (c) 2016, Linaro Limited
> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:    BSD-3-Clause
> + */
> +
> +void test_success(char *fifo_name, int fd, pid_t odp_app);
> +void test_failure(char *fifo_name, int fd, pid_t odp_app);
> +int main(int argc, char *argv[]);
> diff --git a/platform/linux-generic/test/shmem/shmem_odp.c
> b/platform/linux-generic/test/shmem/shmem_odp.c
> new file mode 100644
> index 0000000..df584e6
> --- /dev/null
> +++ b/platform/linux-generic/test/shmem/shmem_odp.c
> @@ -0,0 +1,74 @@
> +/* Copyright (c) 2014, Linaro Limited
>

2016 ?


> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:     BSD-3-Clause
> + */
> +
> +#include <odp.h>
> +#include <linux/limits.h>
> +#include <sys/types.h>
> +#include <unistd.h>
> +#include <stdio.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +
> +#include <odp_cunit_common.h>
> +#include "shmem_odp.h"
> +#include "shmem_common.h"
> +
> +#define TEST_SHARE_FOO (0xf0f0f0f0)
> +#define TEST_SHARE_BAR (0xf0f0f0f)
> +
> +void shmem_test_odp_shm_proc(void)
> +{
> +       char fifo_name[PATH_MAX];
> +       int fd;
> +       odp_shm_t shm;
> +       test_shared_data_t *test_shared_data;
> +       char test_result;
> +
> +       shm = odp_shm_reserve(ODP_SHM_NAME,
> +                             sizeof(test_shared_data_t),
> +                             ALIGN_SIZE, ODP_SHM_PROC);
> +       CU_ASSERT_FATAL(ODP_SHM_INVALID != shm);
> +       test_shared_data = odp_shm_addr(shm);
> +       CU_ASSERT_FATAL(NULL != test_shared_data);
> +       test_shared_data->foo = TEST_SHARE_FOO;
> +       test_shared_data->bar = TEST_SHARE_BAR;
> +
> +       odp_mb_full();
> +
> +       /* open the fifo: this will indicate to linux process that it can
> +        * start the shmem lookup and check if it sees the data */
> +       sprintf(fifo_name, FIFO_NAME_FMT, getpid());
> +       CU_ASSERT_FATAL(mkfifo(fifo_name, 0666) == 0);
> +
> +       /* read from the fifo: the linux process result: */
> +       fd = open(fifo_name, O_RDONLY);
> +       CU_ASSERT_FATAL(fd >= 0);
> +
> +       CU_ASSERT(read(fd, &test_result, sizeof(char)) == 1);
> +       CU_ASSERT_FATAL(test_result == TEST_SUCCESS);
> +
> +       CU_ASSERT(odp_shm_free(shm) == 0);
> +}
> +
> +odp_testinfo_t shmem_suite[] = {
> +       ODP_TEST_INFO(shmem_test_odp_shm_proc),
> +       ODP_TEST_INFO_NULL,
> +};
> +
> +odp_suiteinfo_t shmem_suites[] = {
> +       {"Shared Memory", NULL, NULL, shmem_suite},
> +       ODP_SUITE_INFO_NULL,
> +};
> +
> +int main(void)
> +{
> +       int ret = odp_cunit_register(shmem_suites);
> +
> +       if (ret == 0)
> +               ret = odp_cunit_run();
> +
> +       return ret;
> +}
> diff --git a/platform/linux-generic/test/shmem/shmem_odp.h
> b/platform/linux-generic/test/shmem/shmem_odp.h
> new file mode 100644
> index 0000000..6fed569
> --- /dev/null
> +++ b/platform/linux-generic/test/shmem/shmem_odp.h
> @@ -0,0 +1,7 @@
> +/* Copyright (c) 2014, Linaro Limited
>

2016 ?


> + * All rights reserved.
> + *
> + * SPDX-License-Identifier:     BSD-3-Clause
> + */
> +
> +void shmem_test_odp_shm_proc(void);
> --
> 2.1.4
>
>


-- 
Mike Holmes
Technical Manager - Linaro Networking Group
Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs
"Work should be fun and collaborative, the rest follows"
_______________________________________________
lng-odp mailing list
[email protected]
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to