Message ID | 1432748352-13524-2-git-send-email-mike.holmes@linaro.org |
---|---|
State | New |
Headers | show |
It would be nice to remove this broken directory for 1.3, any review ? On 27 May 2015 at 13:39, Mike Holmes <mike.holmes@linaro.org> wrote: > Signed-off-by: Mike Holmes <mike.holmes@linaro.org> > --- > configure.ac | 1 - > test/Makefile.am | 2 +- > test/api_test/.gitignore | 2 - > test/api_test/Makefile.am | 13 -- > test/api_test/odp_common.c | 91 -------- > test/api_test/odp_common.h | 42 ---- > test/api_test/odp_ring_test.c | 470 > ------------------------------------------ > 7 files changed, 1 insertion(+), 620 deletions(-) > delete mode 100644 test/api_test/.gitignore > delete mode 100644 test/api_test/Makefile.am > delete mode 100644 test/api_test/odp_common.c > delete mode 100644 test/api_test/odp_common.h > delete mode 100644 test/api_test/odp_ring_test.c > > diff --git a/configure.ac b/configure.ac > index 59e9057..1d2a596 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -297,7 +297,6 @@ AC_CONFIG_FILES([Makefile > platform/Makefile > platform/linux-generic/Makefile > test/Makefile > - test/api_test/Makefile > test/performance/Makefile > test/validation/Makefile > test/miscellaneous/Makefile > diff --git a/test/Makefile.am b/test/Makefile.am > index 2ba8008..4a75364 100644 > --- a/test/Makefile.am > +++ b/test/Makefile.am > @@ -1,4 +1,4 @@ > -SUBDIRS = api_test performance miscellaneous > +SUBDIRS = performance miscellaneous > > if cunit_support > SUBDIRS += validation > diff --git a/test/api_test/.gitignore b/test/api_test/.gitignore > deleted file mode 100644 > index 950f443..0000000 > --- a/test/api_test/.gitignore > +++ /dev/null > @@ -1,2 +0,0 @@ > -odp_ring > -odp_shm > diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am > deleted file mode 100644 > index ddbac53..0000000 > --- a/test/api_test/Makefile.am > +++ /dev/null > @@ -1,13 +0,0 @@ > -include $(top_srcdir)/test/Makefile.inc > - > -bin_PROGRAMS = odp_ring > - > -odp_ring_CFLAGS = $(AM_CFLAGS) > - > -odp_ring_LDFLAGS = $(AM_LDFLAGS) -static > - > -noinst_HEADERS = \ > - $(top_srcdir)/test/api_test/odp_common.h \ > - $(top_srcdir)/test/test_debug.h > - > -dist_odp_ring_SOURCES = odp_ring_test.c odp_common.c > diff --git a/test/api_test/odp_common.c b/test/api_test/odp_common.c > deleted file mode 100644 > index 0677f9b..0000000 > --- a/test/api_test/odp_common.c > +++ /dev/null > @@ -1,91 +0,0 @@ > -/* Copyright (c) 2013, Linaro Limited > - * All rights reserved. > - * > - * SPDX-License-Identifier: BSD-3-Clause > - */ > - > -/** > - * @file > - * > - * ODP test application common > - */ > - > -#include <string.h> > -#include <odp.h> > -#include <odp/helper/linux.h> > -#include <odp_common.h> > -#include <test_debug.h> > - > -#define MAX_WORKERS 32 /**< Max worker threads */ > - > -/* Globals */ > -static odph_linux_pthread_t thread_tbl[MAX_WORKERS]; /**< worker threads > table*/ > -static int num_workers; /**< number of > workers */ > - > -/** > - * Print system information > - */ > -void odp_print_system_info(void) > -{ > - odp_cpumask_t cpumask; > - char str[ODP_CPUMASK_STR_SIZE]; > - > - memset(str, 1, sizeof(str)); > - > - odp_cpumask_zero(&cpumask); > - > - odp_cpumask_from_str(&cpumask, "0x1"); > - (void)odp_cpumask_to_str(&cpumask, str, sizeof(str)); > - > - printf("\n"); > - printf("ODP system info\n"); > - printf("---------------\n"); > - printf("ODP API version: %s\n", odp_version_api_str()); > - printf("CPU model: %s\n", odp_sys_cpu_model_str()); > - printf("CPU freq (hz): %"PRIu64"\n", odp_sys_cpu_hz()); > - printf("Cache line size: %i\n", odp_sys_cache_line_size()); > - printf("CPU count: %i\n", odp_cpu_count()); > - printf("CPU mask: %s\n", str); > - > - printf("\n"); > -} > - > -/** test init globals and call odp_init_global() */ > -int odp_test_global_init(void) > -{ > - memset(thread_tbl, 0, sizeof(thread_tbl)); > - > - if (odp_init_global(NULL, NULL)) { > - LOG_ERR("ODP global init failed.\n"); > - return -1; > - } > - > - num_workers = odp_cpu_count(); > - /* force to max CPU count */ > - if (num_workers > MAX_WORKERS) > - num_workers = MAX_WORKERS; > - > - return 0; > -} > - > -/** create test thread */ > -int odp_test_thread_create(void *func_ptr(void *), pthrd_arg *arg) > -{ > - odp_cpumask_t cpumask; > - > - /* Create and init additional threads */ > - odph_linux_cpumask_default(&cpumask, arg->numthrds); > - odph_linux_pthread_create(thread_tbl, &cpumask, func_ptr, > - (void *)arg); > - > - return 0; > -} > - > -/** exit from test thread */ > -int odp_test_thread_exit(pthrd_arg *arg) > -{ > - /* Wait for other threads to exit */ > - odph_linux_pthread_join(thread_tbl, arg->numthrds); > - > - return 0; > -} > diff --git a/test/api_test/odp_common.h b/test/api_test/odp_common.h > deleted file mode 100644 > index f321b6b..0000000 > --- a/test/api_test/odp_common.h > +++ /dev/null > @@ -1,42 +0,0 @@ > -/* Copyright (c) 2013, Linaro Limited > - * All rights reserved. > - * > - * SPDX-License-Identifier: BSD-3-Clause > - */ > - > -/** > - * @file > - * > - * ODP test application common headers > - */ > - > -#ifndef ODP_COMMON_H > -#define ODP_COMMON_H > - > -#define MAX_WORKERS 32 /**< Maximum number of work threads */ > - > -/** types of tests */ > -typedef enum { > - ODP_ATOMIC_TEST = 0, > - ODP_SHM_TEST, > - ODP_RING_TEST_BASIC, > - ODP_RING_TEST_STRESS, > - ODP_TIMER_PING_TEST, > - ODP_MAX_TEST > -} odp_test_case_e; > - > -/** > - * Thread argument > - */ > -typedef struct { > - int testcase; /**< specifies which set of API's to exercise */ > - int numthrds; /**< no of pthreads to create */ > -} pthrd_arg; > - > -extern void odp_print_system_info(void); > -extern int odp_test_global_init(void); > -/** create thread fro start_routine function */ > -extern int odp_test_thread_create(void *(*start_routine) (void *), > pthrd_arg *); > -extern int odp_test_thread_exit(pthrd_arg *); > - > -#endif /* ODP_COMMON_H */ > diff --git a/test/api_test/odp_ring_test.c b/test/api_test/odp_ring_test.c > deleted file mode 100644 > index e8a962a..0000000 > --- a/test/api_test/odp_ring_test.c > +++ /dev/null > @@ -1,470 +0,0 @@ > -/* Copyright (c) 2014, Linaro Limited > - * All rights reserved. > - * > - * SPDX-License-Identifier: BSD-3-Clause > - */ > - > -/*- > - * BSD LICENSE > - * > - * Copyright(c) 2010-2013 Intel Corporation. All rights reserved. > - * All rights reserved. > - * > - * Redistribution and use in source and binary forms, with or without > - * modification, are permitted provided that the following conditions > - * are met: > - * > - * * Redistributions of source code must retain the above copyright > - * notice, this list of conditions and the following disclaimer. > - * * Redistributions in binary form must reproduce the above copyright > - * notice, this list of conditions and the following disclaimer in > - * the documentation and/or other materials provided with the > - * distribution. > - * * Neither the name of Intel Corporation nor the names of its > - * contributors may be used to endorse or promote products derived > - * from this software without specific prior written permission. > - * > - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR > - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT > - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > - */ > - > - > -/** > - * @file > - * > - * ODP test ring > - */ > - > -#include <stdlib.h> > -#include <stdio.h> > -#include <string.h> > -#include <odp.h> > -#include <odp_common.h> > -#include <odp/helper/ring.h> > -#include <test_debug.h> > - > -#define RING_SIZE 4096 > -#define MAX_BULK 32 > - > -#define RING_TEST_BASIC > - > -static int test_ring_basic(odph_ring_t *r) > -{ > - void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = > NULL; > - int ret; > - unsigned i, num_elems; > - > - /* alloc dummy object pointers */ > - src = malloc(RING_SIZE*2*sizeof(void *)); > - if (src == NULL) { > - LOG_ERR("failed to allocate test ring src memory\n"); > - goto fail; > - } > - for (i = 0; i < RING_SIZE*2; i++) > - src[i] = (void *)(unsigned long)i; > - > - cur_src = src; > - > - /* alloc some room for copied objects */ > - dst = malloc(RING_SIZE*2*sizeof(void *)); > - if (dst == NULL) { > - LOG_ERR("failed to allocate test ring dst memory\n"); > - goto fail; > - } > - > - memset(dst, 0, RING_SIZE*2*sizeof(void *)); > - cur_dst = dst; > - > - printf("Test SP & SC basic functions\n"); > - printf("enqueue 1 obj\n"); > - ret = odph_ring_sp_enqueue_burst(r, cur_src, 1); > - cur_src += 1; > - if ((ret & ODPH_RING_SZ_MASK) != 1) { > - LOG_ERR("sp_enq for 1 obj failed\n"); > - goto fail; > - } > - > - printf("enqueue 2 objs\n"); > - ret = odph_ring_sp_enqueue_burst(r, cur_src, 2); > - cur_src += 2; > - if ((ret & ODPH_RING_SZ_MASK) != 2) { > - LOG_ERR("sp_enq for 2 obj failed\n"); > - goto fail; > - } > - > - printf("enqueue MAX_BULK objs\n"); > - ret = odph_ring_sp_enqueue_burst(r, cur_src, MAX_BULK); > - if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) { > - LOG_ERR("sp_enq for %d obj failed\n", MAX_BULK); > - goto fail; > - } > - > - printf("dequeue 1 obj\n"); > - ret = odph_ring_sc_dequeue_burst(r, cur_dst, 1); > - cur_dst += 1; > - if ((ret & ODPH_RING_SZ_MASK) != 1) { > - LOG_ERR("sc_deq for 1 obj failed\n"); > - goto fail; > - } > - > - printf("dequeue 2 objs\n"); > - ret = odph_ring_sc_dequeue_burst(r, cur_dst, 2); > - cur_dst += 2; > - if ((ret & ODPH_RING_SZ_MASK) != 2) { > - LOG_ERR("sc_deq for 2 obj failed\n"); > - goto fail; > - } > - > - printf("dequeue MAX_BULK objs\n"); > - ret = odph_ring_sc_dequeue_burst(r, cur_dst, MAX_BULK); > - cur_dst += MAX_BULK; > - if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) { > - LOG_ERR("sc_deq for %d obj failed\n", MAX_BULK); > - goto fail; > - } > - > - /* check data */ > - if (memcmp(src, dst, cur_dst - dst)) { > - LOG_ERR("data after dequeue is not the same\n"); > - goto fail; > - } > - > - cur_src = src; > - cur_dst = dst; > - > - printf("Test MP & MC basic functions\n"); > - > - printf("enqueue 1 obj\n"); > - ret = odph_ring_mp_enqueue_bulk(r, cur_src, 1); > - cur_src += 1; > - if (ret != 0) { > - LOG_ERR("mp_enq for 1 obj failed\n"); > - goto fail; > - } > - printf("enqueue 2 objs\n"); > - ret = odph_ring_mp_enqueue_bulk(r, cur_src, 2); > - cur_src += 2; > - if (ret != 0) { > - LOG_ERR("mp_enq for 2 obj failed\n"); > - goto fail; > - } > - printf("enqueue MAX_BULK objs\n"); > - ret = odph_ring_mp_enqueue_bulk(r, cur_src, MAX_BULK); > - if (ret != 0) { > - LOG_ERR("mp_enq for %d obj failed\n", MAX_BULK); > - goto fail; > - } > - printf("dequeue 1 obj\n"); > - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, 1); > - cur_dst += 1; > - if (ret != 0) { > - LOG_ERR("mc_deq for 1 obj failed\n"); > - goto fail; > - } > - printf("dequeue 2 objs\n"); > - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, 2); > - cur_dst += 2; > - if (ret != 0) { > - LOG_ERR("mc_deq for 2 obj failed\n"); > - goto fail; > - } > - printf("dequeue MAX_BULK objs\n"); > - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, MAX_BULK); > - cur_dst += MAX_BULK; > - if (ret != 0) { > - LOG_ERR("mc_deq for %d obj failed\n", MAX_BULK); > - goto fail; > - } > - /* check data */ > - if (memcmp(src, dst, cur_dst - dst)) { > - LOG_ERR("data after dequeue is not the same\n"); > - goto fail; > - } > - > - printf("test watermark and default bulk enqueue / dequeue\n"); > - odph_ring_set_water_mark(r, 20); > - num_elems = 16; > - > - cur_src = src; > - cur_dst = dst; > - > - ret = odph_ring_mp_enqueue_bulk(r, cur_src, num_elems); > - cur_src += num_elems; > - if (ret != 0) { > - LOG_ERR("Cannot enqueue\n"); > - goto fail; > - } > - ret = odph_ring_mp_enqueue_bulk(r, cur_src, num_elems); > - if (ret != -EDQUOT) { > - LOG_ERR("Watermark not exceeded\n"); > - goto fail; > - } > - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, num_elems); > - cur_dst += num_elems; > - if (ret != 0) { > - LOG_ERR("Cannot dequeue\n"); > - goto fail; > - } > - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, num_elems); > - cur_dst += num_elems; > - if (ret != 0) { > - LOG_ERR("Cannot dequeue2\n"); > - goto fail; > - } > - > - /* check data */ > - if (memcmp(src, dst, cur_dst - dst)) { > - LOG_ERR("data after dequeue is not the same\n"); > - goto fail; > - } > - > - printf("basic enqueu, dequeue test for ring <%s>@%p passed\n", > - r->name, r); > - > - free(src); > - free(dst); > - return 0; > - > -fail: > - free(src); > - free(dst); > - return -1; > -} > - > -/* global shared ring used for stress testing */ > -static odph_ring_t *r_stress; > - > -/* Stress func for Multi producer only */ > -static int producer_fn(void) > -{ > - unsigned i; > - > - void **src = NULL; > - > - /* alloc dummy object pointers */ > - src = malloc(MAX_BULK*2*sizeof(void *)); > - if (src == NULL) { > - LOG_ERR("failed to allocate producer memory.\n"); > - return -1; > - } > - for (i = 0; i < MAX_BULK; i++) > - src[i] = (void *)(unsigned long)i; > - > - do { > - i = odph_ring_mp_enqueue_bulk(r_stress, src, MAX_BULK); > - if (i == 0) { > - free(src); > - return 0; > - } > - } while (1); > -} > - > -/* Stress func for Multi consumer only */ > -static int consumer_fn(void) > -{ > - unsigned i; > - void **src = NULL; > - > - /* alloc dummy object pointers */ > - src = malloc(MAX_BULK*2*sizeof(void *)); > - if (src == NULL) { > - LOG_ERR("failed to allocate consumer memory.\n"); > - return -1; > - } > - > - do { > - i = odph_ring_mc_dequeue_bulk(r_stress, src, MAX_BULK); > - if (i == 0) { > - for (i = 0; i < MAX_BULK; i++) { > - if (src[i] != (void *)(unsigned long)i) { > - free(src); > - printf("data mismatch.. lockless > ops fail\n"); > - return -1; > - } > - } > - free(src); > - printf("\n Test OK !\n"); > - return 0; > - } > - } while (1); > -} > - > - > -/* > - * Note : make sure that both enqueue and dequeue > - * operation starts at same time so to avoid data corruption > - * Its because atomic lock will protect only indexes, but if order of > - * read or write operation incorrect then data mismatch will happen > - * So its resposibility of application develop to take care of order of > - * data read or write. > -*/ > -typedef enum { > - one_enq_one_deq, /* One thread to enqueue one to > - dequeu at same time */ > - one_enq_rest_deq, /* one thread to enq rest to > - dequeue at same time */ > - one_deq_rest_enq, /* one to deq and rest enq at very same > time */ > - multi_enq_multi_deq /* multiple enq,deq */ > -} stress_type_t; > - > -static void test_ring_stress(stress_type_t type) > -{ > - int thr; > - thr = odp_thread_id(); > - > - switch (type) { > - case one_enq_one_deq: > - > - if (thr == 1) > - producer_fn(); > - if (thr == 2) > - consumer_fn(); > - break; > - > - case multi_enq_multi_deq: > - if (thr%2 == 0) > - producer_fn(); > - else > - consumer_fn(); > - break; > - > - case one_deq_rest_enq: > - case one_enq_rest_deq:/*TBD*/ > - default: > - LOG_ERR("Invalid stress type or test case yet not > supported\n"); > - } > -} > - > -/* local struct for ring_thread argument */ > -typedef struct { > - pthrd_arg thrdarg; > - int stress_type; > -} ring_arg_t; > - > - > -static void *test_ring(void *arg) > -{ > - ring_arg_t *parg = (ring_arg_t *)arg; > - int thr; > - char ring_name[ODPH_RING_NAMESIZE]; > - odph_ring_t *r; > - int result = 0; > - > - thr = odp_thread_id(); > - > - printf("Thread %i starts\n", thr); > - > - switch (parg->thrdarg.testcase) { > - case ODP_RING_TEST_BASIC: > - snprintf(ring_name, sizeof(ring_name), "test_ring_%i", > thr); > - > - r = odph_ring_create(ring_name, RING_SIZE, > - 0 /* not used, alignement > - taken care inside func : todo */); > - if (r == NULL) { > - LOG_ERR("ring create failed\n"); > - result = -1; > - break; > - } > - /* lookup ring from its name */ > - if (odph_ring_lookup(ring_name) != r) { > - LOG_ERR("ring lookup failed\n"); > - result = -1; > - break; > - } > - > - /* basic operations */ > - if (test_ring_basic(r) < 0) { > - LOG_ERR("ring basic enqueue/dequeu ops failed\n"); > - result = -1; > - } > - > - /* dump ring stats */ > - odph_ring_list_dump(); > - > - break; > - > - case ODP_RING_TEST_STRESS: > - test_ring_stress(parg->stress_type); > - > - /* dump ring stats */ > - odph_ring_list_dump(); > - break; > - > - default: > - LOG_ERR("Invalid test case [%d]\n", > parg->thrdarg.testcase); > - result = -1; > - break; > - } > - > - LOG_DBG("result = %d\n", result); > - if (result == 0) > - printf("test_ring Result:pass\n"); > - else > - printf("test_ring Result:fail\n"); > - > - fflush(stdout); > - > - return parg; > -} > - > - > -int main(int argc __attribute__((__unused__)), > - char *argv[] __attribute__((__unused__))) > -{ > - ring_arg_t rarg; > - > - if (odp_test_global_init() != 0) > - return -1; > - > - odp_print_system_info(); > - > - odph_ring_tailq_init(); > - > - rarg.thrdarg.numthrds = odp_cpu_count(); > - > -#ifdef RING_TEST_BASIC > - rarg.thrdarg.testcase = ODP_RING_TEST_BASIC; > -#else > - rarg.thrdarg.testcase = ODP_RING_TEST_STRESS; > - rarg.stress_type = one_enq_one_deq; > -/* rarg.stress_type = multi_enq_multi_deq;*/ > - char ring_name[ODPH_RING_NAMESIZE]; > - > - printf("starting stess test type : %d..\n", rarg.stress_type); > - /* create a ring */ > - snprintf(ring_name, sizeof(ring_name), "test_ring_stress"); > - > - r_stress = odph_ring_create(ring_name, RING_SIZE, > - 0 /* not used, alignement > - taken care inside func : todo */); > - if (r_stress == NULL) { > - LOG_ERR("ring create failed\n"); > - goto fail; > - } > - /* lookup ring from its name */ > - if (odph_ring_lookup(ring_name) != r_stress) { > - LOG_ERR("ring lookup failed\n"); > - goto fail; > - } > -#endif > - odp_test_thread_create(test_ring, (pthrd_arg *)&rarg); > - > -#ifndef RING_TEST_BASIC > -fail: > -#endif > - > - odp_test_thread_exit(&rarg.thrdarg); > - > - return 0; > -} > - > -- > 2.1.4 > >
ping On 6 August 2015 at 12:39, Mike Holmes <mike.holmes@linaro.org> wrote: > It would be nice to remove this broken directory for 1.3, any review ? > > On 27 May 2015 at 13:39, Mike Holmes <mike.holmes@linaro.org> wrote: > >> Signed-off-by: Mike Holmes <mike.holmes@linaro.org> >> --- >> configure.ac | 1 - >> test/Makefile.am | 2 +- >> test/api_test/.gitignore | 2 - >> test/api_test/Makefile.am | 13 -- >> test/api_test/odp_common.c | 91 -------- >> test/api_test/odp_common.h | 42 ---- >> test/api_test/odp_ring_test.c | 470 >> ------------------------------------------ >> 7 files changed, 1 insertion(+), 620 deletions(-) >> delete mode 100644 test/api_test/.gitignore >> delete mode 100644 test/api_test/Makefile.am >> delete mode 100644 test/api_test/odp_common.c >> delete mode 100644 test/api_test/odp_common.h >> delete mode 100644 test/api_test/odp_ring_test.c >> >> diff --git a/configure.ac b/configure.ac >> index 59e9057..1d2a596 100644 >> --- a/configure.ac >> +++ b/configure.ac >> @@ -297,7 +297,6 @@ AC_CONFIG_FILES([Makefile >> platform/Makefile >> platform/linux-generic/Makefile >> test/Makefile >> - test/api_test/Makefile >> test/performance/Makefile >> test/validation/Makefile >> test/miscellaneous/Makefile >> diff --git a/test/Makefile.am b/test/Makefile.am >> index 2ba8008..4a75364 100644 >> --- a/test/Makefile.am >> +++ b/test/Makefile.am >> @@ -1,4 +1,4 @@ >> -SUBDIRS = api_test performance miscellaneous >> +SUBDIRS = performance miscellaneous >> >> if cunit_support >> SUBDIRS += validation >> diff --git a/test/api_test/.gitignore b/test/api_test/.gitignore >> deleted file mode 100644 >> index 950f443..0000000 >> --- a/test/api_test/.gitignore >> +++ /dev/null >> @@ -1,2 +0,0 @@ >> -odp_ring >> -odp_shm >> diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am >> deleted file mode 100644 >> index ddbac53..0000000 >> --- a/test/api_test/Makefile.am >> +++ /dev/null >> @@ -1,13 +0,0 @@ >> -include $(top_srcdir)/test/Makefile.inc >> - >> -bin_PROGRAMS = odp_ring >> - >> -odp_ring_CFLAGS = $(AM_CFLAGS) >> - >> -odp_ring_LDFLAGS = $(AM_LDFLAGS) -static >> - >> -noinst_HEADERS = \ >> - $(top_srcdir)/test/api_test/odp_common.h \ >> - $(top_srcdir)/test/test_debug.h >> - >> -dist_odp_ring_SOURCES = odp_ring_test.c odp_common.c >> diff --git a/test/api_test/odp_common.c b/test/api_test/odp_common.c >> deleted file mode 100644 >> index 0677f9b..0000000 >> --- a/test/api_test/odp_common.c >> +++ /dev/null >> @@ -1,91 +0,0 @@ >> -/* Copyright (c) 2013, Linaro Limited >> - * All rights reserved. >> - * >> - * SPDX-License-Identifier: BSD-3-Clause >> - */ >> - >> -/** >> - * @file >> - * >> - * ODP test application common >> - */ >> - >> -#include <string.h> >> -#include <odp.h> >> -#include <odp/helper/linux.h> >> -#include <odp_common.h> >> -#include <test_debug.h> >> - >> -#define MAX_WORKERS 32 /**< Max worker threads */ >> - >> -/* Globals */ >> -static odph_linux_pthread_t thread_tbl[MAX_WORKERS]; /**< worker threads >> table*/ >> -static int num_workers; /**< number >> of workers */ >> - >> -/** >> - * Print system information >> - */ >> -void odp_print_system_info(void) >> -{ >> - odp_cpumask_t cpumask; >> - char str[ODP_CPUMASK_STR_SIZE]; >> - >> - memset(str, 1, sizeof(str)); >> - >> - odp_cpumask_zero(&cpumask); >> - >> - odp_cpumask_from_str(&cpumask, "0x1"); >> - (void)odp_cpumask_to_str(&cpumask, str, sizeof(str)); >> - >> - printf("\n"); >> - printf("ODP system info\n"); >> - printf("---------------\n"); >> - printf("ODP API version: %s\n", odp_version_api_str()); >> - printf("CPU model: %s\n", odp_sys_cpu_model_str()); >> - printf("CPU freq (hz): %"PRIu64"\n", odp_sys_cpu_hz()); >> - printf("Cache line size: %i\n", odp_sys_cache_line_size()); >> - printf("CPU count: %i\n", odp_cpu_count()); >> - printf("CPU mask: %s\n", str); >> - >> - printf("\n"); >> -} >> - >> -/** test init globals and call odp_init_global() */ >> -int odp_test_global_init(void) >> -{ >> - memset(thread_tbl, 0, sizeof(thread_tbl)); >> - >> - if (odp_init_global(NULL, NULL)) { >> - LOG_ERR("ODP global init failed.\n"); >> - return -1; >> - } >> - >> - num_workers = odp_cpu_count(); >> - /* force to max CPU count */ >> - if (num_workers > MAX_WORKERS) >> - num_workers = MAX_WORKERS; >> - >> - return 0; >> -} >> - >> -/** create test thread */ >> -int odp_test_thread_create(void *func_ptr(void *), pthrd_arg *arg) >> -{ >> - odp_cpumask_t cpumask; >> - >> - /* Create and init additional threads */ >> - odph_linux_cpumask_default(&cpumask, arg->numthrds); >> - odph_linux_pthread_create(thread_tbl, &cpumask, func_ptr, >> - (void *)arg); >> - >> - return 0; >> -} >> - >> -/** exit from test thread */ >> -int odp_test_thread_exit(pthrd_arg *arg) >> -{ >> - /* Wait for other threads to exit */ >> - odph_linux_pthread_join(thread_tbl, arg->numthrds); >> - >> - return 0; >> -} >> diff --git a/test/api_test/odp_common.h b/test/api_test/odp_common.h >> deleted file mode 100644 >> index f321b6b..0000000 >> --- a/test/api_test/odp_common.h >> +++ /dev/null >> @@ -1,42 +0,0 @@ >> -/* Copyright (c) 2013, Linaro Limited >> - * All rights reserved. >> - * >> - * SPDX-License-Identifier: BSD-3-Clause >> - */ >> - >> -/** >> - * @file >> - * >> - * ODP test application common headers >> - */ >> - >> -#ifndef ODP_COMMON_H >> -#define ODP_COMMON_H >> - >> -#define MAX_WORKERS 32 /**< Maximum number of work threads */ >> - >> -/** types of tests */ >> -typedef enum { >> - ODP_ATOMIC_TEST = 0, >> - ODP_SHM_TEST, >> - ODP_RING_TEST_BASIC, >> - ODP_RING_TEST_STRESS, >> - ODP_TIMER_PING_TEST, >> - ODP_MAX_TEST >> -} odp_test_case_e; >> - >> -/** >> - * Thread argument >> - */ >> -typedef struct { >> - int testcase; /**< specifies which set of API's to exercise */ >> - int numthrds; /**< no of pthreads to create */ >> -} pthrd_arg; >> - >> -extern void odp_print_system_info(void); >> -extern int odp_test_global_init(void); >> -/** create thread fro start_routine function */ >> -extern int odp_test_thread_create(void *(*start_routine) (void *), >> pthrd_arg *); >> -extern int odp_test_thread_exit(pthrd_arg *); >> - >> -#endif /* ODP_COMMON_H */ >> diff --git a/test/api_test/odp_ring_test.c b/test/api_test/odp_ring_test.c >> deleted file mode 100644 >> index e8a962a..0000000 >> --- a/test/api_test/odp_ring_test.c >> +++ /dev/null >> @@ -1,470 +0,0 @@ >> -/* Copyright (c) 2014, Linaro Limited >> - * All rights reserved. >> - * >> - * SPDX-License-Identifier: BSD-3-Clause >> - */ >> - >> -/*- >> - * BSD LICENSE >> - * >> - * Copyright(c) 2010-2013 Intel Corporation. All rights reserved. >> - * All rights reserved. >> - * >> - * Redistribution and use in source and binary forms, with or without >> - * modification, are permitted provided that the following conditions >> - * are met: >> - * >> - * * Redistributions of source code must retain the above copyright >> - * notice, this list of conditions and the following disclaimer. >> - * * Redistributions in binary form must reproduce the above >> copyright >> - * notice, this list of conditions and the following disclaimer in >> - * the documentation and/or other materials provided with the >> - * distribution. >> - * * Neither the name of Intel Corporation nor the names of its >> - * contributors may be used to endorse or promote products derived >> - * from this software without specific prior written permission. >> - * >> - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >> - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >> - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS >> FOR >> - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >> - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, >> INCIDENTAL, >> - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >> - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF >> USE, >> - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON >> ANY >> - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >> - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE >> USE >> - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >> - */ >> - >> - >> -/** >> - * @file >> - * >> - * ODP test ring >> - */ >> - >> -#include <stdlib.h> >> -#include <stdio.h> >> -#include <string.h> >> -#include <odp.h> >> -#include <odp_common.h> >> -#include <odp/helper/ring.h> >> -#include <test_debug.h> >> - >> -#define RING_SIZE 4096 >> -#define MAX_BULK 32 >> - >> -#define RING_TEST_BASIC >> - >> -static int test_ring_basic(odph_ring_t *r) >> -{ >> - void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = >> NULL; >> - int ret; >> - unsigned i, num_elems; >> - >> - /* alloc dummy object pointers */ >> - src = malloc(RING_SIZE*2*sizeof(void *)); >> - if (src == NULL) { >> - LOG_ERR("failed to allocate test ring src memory\n"); >> - goto fail; >> - } >> - for (i = 0; i < RING_SIZE*2; i++) >> - src[i] = (void *)(unsigned long)i; >> - >> - cur_src = src; >> - >> - /* alloc some room for copied objects */ >> - dst = malloc(RING_SIZE*2*sizeof(void *)); >> - if (dst == NULL) { >> - LOG_ERR("failed to allocate test ring dst memory\n"); >> - goto fail; >> - } >> - >> - memset(dst, 0, RING_SIZE*2*sizeof(void *)); >> - cur_dst = dst; >> - >> - printf("Test SP & SC basic functions\n"); >> - printf("enqueue 1 obj\n"); >> - ret = odph_ring_sp_enqueue_burst(r, cur_src, 1); >> - cur_src += 1; >> - if ((ret & ODPH_RING_SZ_MASK) != 1) { >> - LOG_ERR("sp_enq for 1 obj failed\n"); >> - goto fail; >> - } >> - >> - printf("enqueue 2 objs\n"); >> - ret = odph_ring_sp_enqueue_burst(r, cur_src, 2); >> - cur_src += 2; >> - if ((ret & ODPH_RING_SZ_MASK) != 2) { >> - LOG_ERR("sp_enq for 2 obj failed\n"); >> - goto fail; >> - } >> - >> - printf("enqueue MAX_BULK objs\n"); >> - ret = odph_ring_sp_enqueue_burst(r, cur_src, MAX_BULK); >> - if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) { >> - LOG_ERR("sp_enq for %d obj failed\n", MAX_BULK); >> - goto fail; >> - } >> - >> - printf("dequeue 1 obj\n"); >> - ret = odph_ring_sc_dequeue_burst(r, cur_dst, 1); >> - cur_dst += 1; >> - if ((ret & ODPH_RING_SZ_MASK) != 1) { >> - LOG_ERR("sc_deq for 1 obj failed\n"); >> - goto fail; >> - } >> - >> - printf("dequeue 2 objs\n"); >> - ret = odph_ring_sc_dequeue_burst(r, cur_dst, 2); >> - cur_dst += 2; >> - if ((ret & ODPH_RING_SZ_MASK) != 2) { >> - LOG_ERR("sc_deq for 2 obj failed\n"); >> - goto fail; >> - } >> - >> - printf("dequeue MAX_BULK objs\n"); >> - ret = odph_ring_sc_dequeue_burst(r, cur_dst, MAX_BULK); >> - cur_dst += MAX_BULK; >> - if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) { >> - LOG_ERR("sc_deq for %d obj failed\n", MAX_BULK); >> - goto fail; >> - } >> - >> - /* check data */ >> - if (memcmp(src, dst, cur_dst - dst)) { >> - LOG_ERR("data after dequeue is not the same\n"); >> - goto fail; >> - } >> - >> - cur_src = src; >> - cur_dst = dst; >> - >> - printf("Test MP & MC basic functions\n"); >> - >> - printf("enqueue 1 obj\n"); >> - ret = odph_ring_mp_enqueue_bulk(r, cur_src, 1); >> - cur_src += 1; >> - if (ret != 0) { >> - LOG_ERR("mp_enq for 1 obj failed\n"); >> - goto fail; >> - } >> - printf("enqueue 2 objs\n"); >> - ret = odph_ring_mp_enqueue_bulk(r, cur_src, 2); >> - cur_src += 2; >> - if (ret != 0) { >> - LOG_ERR("mp_enq for 2 obj failed\n"); >> - goto fail; >> - } >> - printf("enqueue MAX_BULK objs\n"); >> - ret = odph_ring_mp_enqueue_bulk(r, cur_src, MAX_BULK); >> - if (ret != 0) { >> - LOG_ERR("mp_enq for %d obj failed\n", MAX_BULK); >> - goto fail; >> - } >> - printf("dequeue 1 obj\n"); >> - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, 1); >> - cur_dst += 1; >> - if (ret != 0) { >> - LOG_ERR("mc_deq for 1 obj failed\n"); >> - goto fail; >> - } >> - printf("dequeue 2 objs\n"); >> - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, 2); >> - cur_dst += 2; >> - if (ret != 0) { >> - LOG_ERR("mc_deq for 2 obj failed\n"); >> - goto fail; >> - } >> - printf("dequeue MAX_BULK objs\n"); >> - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, MAX_BULK); >> - cur_dst += MAX_BULK; >> - if (ret != 0) { >> - LOG_ERR("mc_deq for %d obj failed\n", MAX_BULK); >> - goto fail; >> - } >> - /* check data */ >> - if (memcmp(src, dst, cur_dst - dst)) { >> - LOG_ERR("data after dequeue is not the same\n"); >> - goto fail; >> - } >> - >> - printf("test watermark and default bulk enqueue / dequeue\n"); >> - odph_ring_set_water_mark(r, 20); >> - num_elems = 16; >> - >> - cur_src = src; >> - cur_dst = dst; >> - >> - ret = odph_ring_mp_enqueue_bulk(r, cur_src, num_elems); >> - cur_src += num_elems; >> - if (ret != 0) { >> - LOG_ERR("Cannot enqueue\n"); >> - goto fail; >> - } >> - ret = odph_ring_mp_enqueue_bulk(r, cur_src, num_elems); >> - if (ret != -EDQUOT) { >> - LOG_ERR("Watermark not exceeded\n"); >> - goto fail; >> - } >> - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, num_elems); >> - cur_dst += num_elems; >> - if (ret != 0) { >> - LOG_ERR("Cannot dequeue\n"); >> - goto fail; >> - } >> - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, num_elems); >> - cur_dst += num_elems; >> - if (ret != 0) { >> - LOG_ERR("Cannot dequeue2\n"); >> - goto fail; >> - } >> - >> - /* check data */ >> - if (memcmp(src, dst, cur_dst - dst)) { >> - LOG_ERR("data after dequeue is not the same\n"); >> - goto fail; >> - } >> - >> - printf("basic enqueu, dequeue test for ring <%s>@%p passed\n", >> - r->name, r); >> - >> - free(src); >> - free(dst); >> - return 0; >> - >> -fail: >> - free(src); >> - free(dst); >> - return -1; >> -} >> - >> -/* global shared ring used for stress testing */ >> -static odph_ring_t *r_stress; >> - >> -/* Stress func for Multi producer only */ >> -static int producer_fn(void) >> -{ >> - unsigned i; >> - >> - void **src = NULL; >> - >> - /* alloc dummy object pointers */ >> - src = malloc(MAX_BULK*2*sizeof(void *)); >> - if (src == NULL) { >> - LOG_ERR("failed to allocate producer memory.\n"); >> - return -1; >> - } >> - for (i = 0; i < MAX_BULK; i++) >> - src[i] = (void *)(unsigned long)i; >> - >> - do { >> - i = odph_ring_mp_enqueue_bulk(r_stress, src, MAX_BULK); >> - if (i == 0) { >> - free(src); >> - return 0; >> - } >> - } while (1); >> -} >> - >> -/* Stress func for Multi consumer only */ >> -static int consumer_fn(void) >> -{ >> - unsigned i; >> - void **src = NULL; >> - >> - /* alloc dummy object pointers */ >> - src = malloc(MAX_BULK*2*sizeof(void *)); >> - if (src == NULL) { >> - LOG_ERR("failed to allocate consumer memory.\n"); >> - return -1; >> - } >> - >> - do { >> - i = odph_ring_mc_dequeue_bulk(r_stress, src, MAX_BULK); >> - if (i == 0) { >> - for (i = 0; i < MAX_BULK; i++) { >> - if (src[i] != (void *)(unsigned long)i) { >> - free(src); >> - printf("data mismatch.. lockless >> ops fail\n"); >> - return -1; >> - } >> - } >> - free(src); >> - printf("\n Test OK !\n"); >> - return 0; >> - } >> - } while (1); >> -} >> - >> - >> -/* >> - * Note : make sure that both enqueue and dequeue >> - * operation starts at same time so to avoid data corruption >> - * Its because atomic lock will protect only indexes, but if order of >> - * read or write operation incorrect then data mismatch will happen >> - * So its resposibility of application develop to take care of order of >> - * data read or write. >> -*/ >> -typedef enum { >> - one_enq_one_deq, /* One thread to enqueue one to >> - dequeu at same time */ >> - one_enq_rest_deq, /* one thread to enq rest to >> - dequeue at same time */ >> - one_deq_rest_enq, /* one to deq and rest enq at very same >> time */ >> - multi_enq_multi_deq /* multiple enq,deq */ >> -} stress_type_t; >> - >> -static void test_ring_stress(stress_type_t type) >> -{ >> - int thr; >> - thr = odp_thread_id(); >> - >> - switch (type) { >> - case one_enq_one_deq: >> - >> - if (thr == 1) >> - producer_fn(); >> - if (thr == 2) >> - consumer_fn(); >> - break; >> - >> - case multi_enq_multi_deq: >> - if (thr%2 == 0) >> - producer_fn(); >> - else >> - consumer_fn(); >> - break; >> - >> - case one_deq_rest_enq: >> - case one_enq_rest_deq:/*TBD*/ >> - default: >> - LOG_ERR("Invalid stress type or test case yet not >> supported\n"); >> - } >> -} >> - >> -/* local struct for ring_thread argument */ >> -typedef struct { >> - pthrd_arg thrdarg; >> - int stress_type; >> -} ring_arg_t; >> - >> - >> -static void *test_ring(void *arg) >> -{ >> - ring_arg_t *parg = (ring_arg_t *)arg; >> - int thr; >> - char ring_name[ODPH_RING_NAMESIZE]; >> - odph_ring_t *r; >> - int result = 0; >> - >> - thr = odp_thread_id(); >> - >> - printf("Thread %i starts\n", thr); >> - >> - switch (parg->thrdarg.testcase) { >> - case ODP_RING_TEST_BASIC: >> - snprintf(ring_name, sizeof(ring_name), "test_ring_%i", >> thr); >> - >> - r = odph_ring_create(ring_name, RING_SIZE, >> - 0 /* not used, alignement >> - taken care inside func : todo >> */); >> - if (r == NULL) { >> - LOG_ERR("ring create failed\n"); >> - result = -1; >> - break; >> - } >> - /* lookup ring from its name */ >> - if (odph_ring_lookup(ring_name) != r) { >> - LOG_ERR("ring lookup failed\n"); >> - result = -1; >> - break; >> - } >> - >> - /* basic operations */ >> - if (test_ring_basic(r) < 0) { >> - LOG_ERR("ring basic enqueue/dequeu ops failed\n"); >> - result = -1; >> - } >> - >> - /* dump ring stats */ >> - odph_ring_list_dump(); >> - >> - break; >> - >> - case ODP_RING_TEST_STRESS: >> - test_ring_stress(parg->stress_type); >> - >> - /* dump ring stats */ >> - odph_ring_list_dump(); >> - break; >> - >> - default: >> - LOG_ERR("Invalid test case [%d]\n", >> parg->thrdarg.testcase); >> - result = -1; >> - break; >> - } >> - >> - LOG_DBG("result = %d\n", result); >> - if (result == 0) >> - printf("test_ring Result:pass\n"); >> - else >> - printf("test_ring Result:fail\n"); >> - >> - fflush(stdout); >> - >> - return parg; >> -} >> - >> - >> -int main(int argc __attribute__((__unused__)), >> - char *argv[] __attribute__((__unused__))) >> -{ >> - ring_arg_t rarg; >> - >> - if (odp_test_global_init() != 0) >> - return -1; >> - >> - odp_print_system_info(); >> - >> - odph_ring_tailq_init(); >> - >> - rarg.thrdarg.numthrds = odp_cpu_count(); >> - >> -#ifdef RING_TEST_BASIC >> - rarg.thrdarg.testcase = ODP_RING_TEST_BASIC; >> -#else >> - rarg.thrdarg.testcase = ODP_RING_TEST_STRESS; >> - rarg.stress_type = one_enq_one_deq; >> -/* rarg.stress_type = multi_enq_multi_deq;*/ >> - char ring_name[ODPH_RING_NAMESIZE]; >> - >> - printf("starting stess test type : %d..\n", rarg.stress_type); >> - /* create a ring */ >> - snprintf(ring_name, sizeof(ring_name), "test_ring_stress"); >> - >> - r_stress = odph_ring_create(ring_name, RING_SIZE, >> - 0 /* not used, alignement >> - taken care inside func : todo */); >> - if (r_stress == NULL) { >> - LOG_ERR("ring create failed\n"); >> - goto fail; >> - } >> - /* lookup ring from its name */ >> - if (odph_ring_lookup(ring_name) != r_stress) { >> - LOG_ERR("ring lookup failed\n"); >> - goto fail; >> - } >> -#endif >> - odp_test_thread_create(test_ring, (pthrd_arg *)&rarg); >> - >> -#ifndef RING_TEST_BASIC >> -fail: >> -#endif >> - >> - odp_test_thread_exit(&rarg.thrdarg); >> - >> - return 0; >> -} >> - >> -- >> 2.1.4 >> >> > > > -- > Mike Holmes > Technical Manager - Linaro Networking Group > Linaro.org <http://www.linaro.org/> *│ *Open source software for ARM SoCs > > >
diff --git a/configure.ac b/configure.ac index 59e9057..1d2a596 100644 --- a/configure.ac +++ b/configure.ac @@ -297,7 +297,6 @@ AC_CONFIG_FILES([Makefile platform/Makefile platform/linux-generic/Makefile test/Makefile - test/api_test/Makefile test/performance/Makefile test/validation/Makefile test/miscellaneous/Makefile diff --git a/test/Makefile.am b/test/Makefile.am index 2ba8008..4a75364 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = api_test performance miscellaneous +SUBDIRS = performance miscellaneous if cunit_support SUBDIRS += validation diff --git a/test/api_test/.gitignore b/test/api_test/.gitignore deleted file mode 100644 index 950f443..0000000 --- a/test/api_test/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -odp_ring -odp_shm diff --git a/test/api_test/Makefile.am b/test/api_test/Makefile.am deleted file mode 100644 index ddbac53..0000000 --- a/test/api_test/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -include $(top_srcdir)/test/Makefile.inc - -bin_PROGRAMS = odp_ring - -odp_ring_CFLAGS = $(AM_CFLAGS) - -odp_ring_LDFLAGS = $(AM_LDFLAGS) -static - -noinst_HEADERS = \ - $(top_srcdir)/test/api_test/odp_common.h \ - $(top_srcdir)/test/test_debug.h - -dist_odp_ring_SOURCES = odp_ring_test.c odp_common.c diff --git a/test/api_test/odp_common.c b/test/api_test/odp_common.c deleted file mode 100644 index 0677f9b..0000000 --- a/test/api_test/odp_common.c +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (c) 2013, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/** - * @file - * - * ODP test application common - */ - -#include <string.h> -#include <odp.h> -#include <odp/helper/linux.h> -#include <odp_common.h> -#include <test_debug.h> - -#define MAX_WORKERS 32 /**< Max worker threads */ - -/* Globals */ -static odph_linux_pthread_t thread_tbl[MAX_WORKERS]; /**< worker threads table*/ -static int num_workers; /**< number of workers */ - -/** - * Print system information - */ -void odp_print_system_info(void) -{ - odp_cpumask_t cpumask; - char str[ODP_CPUMASK_STR_SIZE]; - - memset(str, 1, sizeof(str)); - - odp_cpumask_zero(&cpumask); - - odp_cpumask_from_str(&cpumask, "0x1"); - (void)odp_cpumask_to_str(&cpumask, str, sizeof(str)); - - printf("\n"); - printf("ODP system info\n"); - printf("---------------\n"); - printf("ODP API version: %s\n", odp_version_api_str()); - printf("CPU model: %s\n", odp_sys_cpu_model_str()); - printf("CPU freq (hz): %"PRIu64"\n", odp_sys_cpu_hz()); - printf("Cache line size: %i\n", odp_sys_cache_line_size()); - printf("CPU count: %i\n", odp_cpu_count()); - printf("CPU mask: %s\n", str); - - printf("\n"); -} - -/** test init globals and call odp_init_global() */ -int odp_test_global_init(void) -{ - memset(thread_tbl, 0, sizeof(thread_tbl)); - - if (odp_init_global(NULL, NULL)) { - LOG_ERR("ODP global init failed.\n"); - return -1; - } - - num_workers = odp_cpu_count(); - /* force to max CPU count */ - if (num_workers > MAX_WORKERS) - num_workers = MAX_WORKERS; - - return 0; -} - -/** create test thread */ -int odp_test_thread_create(void *func_ptr(void *), pthrd_arg *arg) -{ - odp_cpumask_t cpumask; - - /* Create and init additional threads */ - odph_linux_cpumask_default(&cpumask, arg->numthrds); - odph_linux_pthread_create(thread_tbl, &cpumask, func_ptr, - (void *)arg); - - return 0; -} - -/** exit from test thread */ -int odp_test_thread_exit(pthrd_arg *arg) -{ - /* Wait for other threads to exit */ - odph_linux_pthread_join(thread_tbl, arg->numthrds); - - return 0; -} diff --git a/test/api_test/odp_common.h b/test/api_test/odp_common.h deleted file mode 100644 index f321b6b..0000000 --- a/test/api_test/odp_common.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2013, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/** - * @file - * - * ODP test application common headers - */ - -#ifndef ODP_COMMON_H -#define ODP_COMMON_H - -#define MAX_WORKERS 32 /**< Maximum number of work threads */ - -/** types of tests */ -typedef enum { - ODP_ATOMIC_TEST = 0, - ODP_SHM_TEST, - ODP_RING_TEST_BASIC, - ODP_RING_TEST_STRESS, - ODP_TIMER_PING_TEST, - ODP_MAX_TEST -} odp_test_case_e; - -/** - * Thread argument - */ -typedef struct { - int testcase; /**< specifies which set of API's to exercise */ - int numthrds; /**< no of pthreads to create */ -} pthrd_arg; - -extern void odp_print_system_info(void); -extern int odp_test_global_init(void); -/** create thread fro start_routine function */ -extern int odp_test_thread_create(void *(*start_routine) (void *), pthrd_arg *); -extern int odp_test_thread_exit(pthrd_arg *); - -#endif /* ODP_COMMON_H */ diff --git a/test/api_test/odp_ring_test.c b/test/api_test/odp_ring_test.c deleted file mode 100644 index e8a962a..0000000 --- a/test/api_test/odp_ring_test.c +++ /dev/null @@ -1,470 +0,0 @@ -/* Copyright (c) 2014, Linaro Limited - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/*- - * BSD LICENSE - * - * Copyright(c) 2010-2013 Intel Corporation. All rights reserved. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Intel Corporation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/** - * @file - * - * ODP test ring - */ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <odp.h> -#include <odp_common.h> -#include <odp/helper/ring.h> -#include <test_debug.h> - -#define RING_SIZE 4096 -#define MAX_BULK 32 - -#define RING_TEST_BASIC - -static int test_ring_basic(odph_ring_t *r) -{ - void **src = NULL, **cur_src = NULL, **dst = NULL, **cur_dst = NULL; - int ret; - unsigned i, num_elems; - - /* alloc dummy object pointers */ - src = malloc(RING_SIZE*2*sizeof(void *)); - if (src == NULL) { - LOG_ERR("failed to allocate test ring src memory\n"); - goto fail; - } - for (i = 0; i < RING_SIZE*2; i++) - src[i] = (void *)(unsigned long)i; - - cur_src = src; - - /* alloc some room for copied objects */ - dst = malloc(RING_SIZE*2*sizeof(void *)); - if (dst == NULL) { - LOG_ERR("failed to allocate test ring dst memory\n"); - goto fail; - } - - memset(dst, 0, RING_SIZE*2*sizeof(void *)); - cur_dst = dst; - - printf("Test SP & SC basic functions\n"); - printf("enqueue 1 obj\n"); - ret = odph_ring_sp_enqueue_burst(r, cur_src, 1); - cur_src += 1; - if ((ret & ODPH_RING_SZ_MASK) != 1) { - LOG_ERR("sp_enq for 1 obj failed\n"); - goto fail; - } - - printf("enqueue 2 objs\n"); - ret = odph_ring_sp_enqueue_burst(r, cur_src, 2); - cur_src += 2; - if ((ret & ODPH_RING_SZ_MASK) != 2) { - LOG_ERR("sp_enq for 2 obj failed\n"); - goto fail; - } - - printf("enqueue MAX_BULK objs\n"); - ret = odph_ring_sp_enqueue_burst(r, cur_src, MAX_BULK); - if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) { - LOG_ERR("sp_enq for %d obj failed\n", MAX_BULK); - goto fail; - } - - printf("dequeue 1 obj\n"); - ret = odph_ring_sc_dequeue_burst(r, cur_dst, 1); - cur_dst += 1; - if ((ret & ODPH_RING_SZ_MASK) != 1) { - LOG_ERR("sc_deq for 1 obj failed\n"); - goto fail; - } - - printf("dequeue 2 objs\n"); - ret = odph_ring_sc_dequeue_burst(r, cur_dst, 2); - cur_dst += 2; - if ((ret & ODPH_RING_SZ_MASK) != 2) { - LOG_ERR("sc_deq for 2 obj failed\n"); - goto fail; - } - - printf("dequeue MAX_BULK objs\n"); - ret = odph_ring_sc_dequeue_burst(r, cur_dst, MAX_BULK); - cur_dst += MAX_BULK; - if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) { - LOG_ERR("sc_deq for %d obj failed\n", MAX_BULK); - goto fail; - } - - /* check data */ - if (memcmp(src, dst, cur_dst - dst)) { - LOG_ERR("data after dequeue is not the same\n"); - goto fail; - } - - cur_src = src; - cur_dst = dst; - - printf("Test MP & MC basic functions\n"); - - printf("enqueue 1 obj\n"); - ret = odph_ring_mp_enqueue_bulk(r, cur_src, 1); - cur_src += 1; - if (ret != 0) { - LOG_ERR("mp_enq for 1 obj failed\n"); - goto fail; - } - printf("enqueue 2 objs\n"); - ret = odph_ring_mp_enqueue_bulk(r, cur_src, 2); - cur_src += 2; - if (ret != 0) { - LOG_ERR("mp_enq for 2 obj failed\n"); - goto fail; - } - printf("enqueue MAX_BULK objs\n"); - ret = odph_ring_mp_enqueue_bulk(r, cur_src, MAX_BULK); - if (ret != 0) { - LOG_ERR("mp_enq for %d obj failed\n", MAX_BULK); - goto fail; - } - printf("dequeue 1 obj\n"); - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, 1); - cur_dst += 1; - if (ret != 0) { - LOG_ERR("mc_deq for 1 obj failed\n"); - goto fail; - } - printf("dequeue 2 objs\n"); - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, 2); - cur_dst += 2; - if (ret != 0) { - LOG_ERR("mc_deq for 2 obj failed\n"); - goto fail; - } - printf("dequeue MAX_BULK objs\n"); - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, MAX_BULK); - cur_dst += MAX_BULK; - if (ret != 0) { - LOG_ERR("mc_deq for %d obj failed\n", MAX_BULK); - goto fail; - } - /* check data */ - if (memcmp(src, dst, cur_dst - dst)) { - LOG_ERR("data after dequeue is not the same\n"); - goto fail; - } - - printf("test watermark and default bulk enqueue / dequeue\n"); - odph_ring_set_water_mark(r, 20); - num_elems = 16; - - cur_src = src; - cur_dst = dst; - - ret = odph_ring_mp_enqueue_bulk(r, cur_src, num_elems); - cur_src += num_elems; - if (ret != 0) { - LOG_ERR("Cannot enqueue\n"); - goto fail; - } - ret = odph_ring_mp_enqueue_bulk(r, cur_src, num_elems); - if (ret != -EDQUOT) { - LOG_ERR("Watermark not exceeded\n"); - goto fail; - } - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, num_elems); - cur_dst += num_elems; - if (ret != 0) { - LOG_ERR("Cannot dequeue\n"); - goto fail; - } - ret = odph_ring_mc_dequeue_bulk(r, cur_dst, num_elems); - cur_dst += num_elems; - if (ret != 0) { - LOG_ERR("Cannot dequeue2\n"); - goto fail; - } - - /* check data */ - if (memcmp(src, dst, cur_dst - dst)) { - LOG_ERR("data after dequeue is not the same\n"); - goto fail; - } - - printf("basic enqueu, dequeue test for ring <%s>@%p passed\n", - r->name, r); - - free(src); - free(dst); - return 0; - -fail: - free(src); - free(dst); - return -1; -} - -/* global shared ring used for stress testing */ -static odph_ring_t *r_stress; - -/* Stress func for Multi producer only */ -static int producer_fn(void) -{ - unsigned i; - - void **src = NULL; - - /* alloc dummy object pointers */ - src = malloc(MAX_BULK*2*sizeof(void *)); - if (src == NULL) { - LOG_ERR("failed to allocate producer memory.\n"); - return -1; - } - for (i = 0; i < MAX_BULK; i++) - src[i] = (void *)(unsigned long)i; - - do { - i = odph_ring_mp_enqueue_bulk(r_stress, src, MAX_BULK); - if (i == 0) { - free(src); - return 0; - } - } while (1); -} - -/* Stress func for Multi consumer only */ -static int consumer_fn(void) -{ - unsigned i; - void **src = NULL; - - /* alloc dummy object pointers */ - src = malloc(MAX_BULK*2*sizeof(void *)); - if (src == NULL) { - LOG_ERR("failed to allocate consumer memory.\n"); - return -1; - } - - do { - i = odph_ring_mc_dequeue_bulk(r_stress, src, MAX_BULK); - if (i == 0) { - for (i = 0; i < MAX_BULK; i++) { - if (src[i] != (void *)(unsigned long)i) { - free(src); - printf("data mismatch.. lockless ops fail\n"); - return -1; - } - } - free(src); - printf("\n Test OK !\n"); - return 0; - } - } while (1); -} - - -/* - * Note : make sure that both enqueue and dequeue - * operation starts at same time so to avoid data corruption - * Its because atomic lock will protect only indexes, but if order of - * read or write operation incorrect then data mismatch will happen - * So its resposibility of application develop to take care of order of - * data read or write. -*/ -typedef enum { - one_enq_one_deq, /* One thread to enqueue one to - dequeu at same time */ - one_enq_rest_deq, /* one thread to enq rest to - dequeue at same time */ - one_deq_rest_enq, /* one to deq and rest enq at very same time */ - multi_enq_multi_deq /* multiple enq,deq */ -} stress_type_t; - -static void test_ring_stress(stress_type_t type) -{ - int thr; - thr = odp_thread_id(); - - switch (type) { - case one_enq_one_deq: - - if (thr == 1) - producer_fn(); - if (thr == 2) - consumer_fn(); - break; - - case multi_enq_multi_deq: - if (thr%2 == 0) - producer_fn(); - else - consumer_fn(); - break; - - case one_deq_rest_enq: - case one_enq_rest_deq:/*TBD*/ - default: - LOG_ERR("Invalid stress type or test case yet not supported\n"); - } -} - -/* local struct for ring_thread argument */ -typedef struct { - pthrd_arg thrdarg; - int stress_type; -} ring_arg_t; - - -static void *test_ring(void *arg) -{ - ring_arg_t *parg = (ring_arg_t *)arg; - int thr; - char ring_name[ODPH_RING_NAMESIZE]; - odph_ring_t *r; - int result = 0; - - thr = odp_thread_id(); - - printf("Thread %i starts\n", thr); - - switch (parg->thrdarg.testcase) { - case ODP_RING_TEST_BASIC: - snprintf(ring_name, sizeof(ring_name), "test_ring_%i", thr); - - r = odph_ring_create(ring_name, RING_SIZE, - 0 /* not used, alignement - taken care inside func : todo */); - if (r == NULL) { - LOG_ERR("ring create failed\n"); - result = -1; - break; - } - /* lookup ring from its name */ - if (odph_ring_lookup(ring_name) != r) { - LOG_ERR("ring lookup failed\n"); - result = -1; - break; - } - - /* basic operations */ - if (test_ring_basic(r) < 0) { - LOG_ERR("ring basic enqueue/dequeu ops failed\n"); - result = -1; - } - - /* dump ring stats */ - odph_ring_list_dump(); - - break; - - case ODP_RING_TEST_STRESS: - test_ring_stress(parg->stress_type); - - /* dump ring stats */ - odph_ring_list_dump(); - break; - - default: - LOG_ERR("Invalid test case [%d]\n", parg->thrdarg.testcase); - result = -1; - break; - } - - LOG_DBG("result = %d\n", result); - if (result == 0) - printf("test_ring Result:pass\n"); - else - printf("test_ring Result:fail\n"); - - fflush(stdout); - - return parg; -} - - -int main(int argc __attribute__((__unused__)), - char *argv[] __attribute__((__unused__))) -{ - ring_arg_t rarg; - - if (odp_test_global_init() != 0) - return -1; - - odp_print_system_info(); - - odph_ring_tailq_init(); - - rarg.thrdarg.numthrds = odp_cpu_count(); - -#ifdef RING_TEST_BASIC - rarg.thrdarg.testcase = ODP_RING_TEST_BASIC; -#else - rarg.thrdarg.testcase = ODP_RING_TEST_STRESS; - rarg.stress_type = one_enq_one_deq; -/* rarg.stress_type = multi_enq_multi_deq;*/ - char ring_name[ODPH_RING_NAMESIZE]; - - printf("starting stess test type : %d..\n", rarg.stress_type); - /* create a ring */ - snprintf(ring_name, sizeof(ring_name), "test_ring_stress"); - - r_stress = odph_ring_create(ring_name, RING_SIZE, - 0 /* not used, alignement - taken care inside func : todo */); - if (r_stress == NULL) { - LOG_ERR("ring create failed\n"); - goto fail; - } - /* lookup ring from its name */ - if (odph_ring_lookup(ring_name) != r_stress) { - LOG_ERR("ring lookup failed\n"); - goto fail; - } -#endif - odp_test_thread_create(test_ring, (pthrd_arg *)&rarg); - -#ifndef RING_TEST_BASIC -fail: -#endif - - odp_test_thread_exit(&rarg.thrdarg); - - return 0; -} -
Signed-off-by: Mike Holmes <mike.holmes@linaro.org> --- configure.ac | 1 - test/Makefile.am | 2 +- test/api_test/.gitignore | 2 - test/api_test/Makefile.am | 13 -- test/api_test/odp_common.c | 91 -------- test/api_test/odp_common.h | 42 ---- test/api_test/odp_ring_test.c | 470 ------------------------------------------ 7 files changed, 1 insertion(+), 620 deletions(-) delete mode 100644 test/api_test/.gitignore delete mode 100644 test/api_test/Makefile.am delete mode 100644 test/api_test/odp_common.c delete mode 100644 test/api_test/odp_common.h delete mode 100644 test/api_test/odp_ring_test.c