From patchwork Fri Dec 18 11:29:10 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxim Uvarov X-Patchwork-Id: 58642 Delivered-To: patch@linaro.org Received: by 10.112.89.199 with SMTP id bq7csp966106lbb; Fri, 18 Dec 2015 03:38:34 -0800 (PST) X-Received: by 10.140.30.101 with SMTP id c92mr4291251qgc.14.1450438714476; Fri, 18 Dec 2015 03:38:34 -0800 (PST) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id s16si13269883qkl.108.2015.12.18.03.38.34; Fri, 18 Dec 2015 03:38:34 -0800 (PST) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dkim=neutral (body hash did not verify) header.i=@linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id DC9CC61615; Fri, 18 Dec 2015 11:38:33 +0000 (UTC) Authentication-Results: lists.linaro.org; dkim=fail reason="verification failed; unprotected key" header.d=linaro.org header.i=@linaro.org header.b=gnkpWJca; dkim-adsp=none (unprotected policy); dkim-atps=neutral X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,T_DKIM_INVALID,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id B14FE6168D; Fri, 18 Dec 2015 11:30:57 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id 3B39D616BC; Fri, 18 Dec 2015 11:30:37 +0000 (UTC) Received: from mail-lb0-f176.google.com (mail-lb0-f176.google.com [209.85.217.176]) by lists.linaro.org (Postfix) with ESMTPS id 4CD0161688 for ; Fri, 18 Dec 2015 11:29:28 +0000 (UTC) Received: by mail-lb0-f176.google.com with SMTP id yq9so42468465lbb.3 for ; Fri, 18 Dec 2015 03:29:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=llS4095WEe90z012YE0INOp/PgT+LIjiKHoWQ6mS6BE=; b=gnkpWJcatfmrMnGbzVuryMEqm9Cfyq0dzZN8Ux+2PfheeNXaVtDwx9SVKvYIRkLb0O 2nN9kwEGY5odSbAMT86xHf9bcWdDpoMfZYo/NbTZb3SpbmX35oAXEjjOgEWL3P69HvcQ i5gzXN2lfwGxJ36z38grkjlTNFijJ1eHec340= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=llS4095WEe90z012YE0INOp/PgT+LIjiKHoWQ6mS6BE=; b=BOFziBLSlHRnibqgxk+zr9J0yHfOfB6CeUCoT/Hi3G63SvZLxvai1CLZ4fld4x8Krh EmXbiCqYUfN0bUEMKGPo+DjeJyCzcxYT2Bi8BQN6h84LggChujVOmorP9mQ5MNhsxCwx JGGRDG64AE7egCdhSLJBtwfkYWtb9gnwAnNejXu3OyaaVIjPPK1uqBs5l7zA47oEj0Nv VmQ+L1fp64shuwKF0y/K1efafkQQV2pgHRYXdJ7bVejCumm4qGVynSGdsIDdyXaf8pSv 3+nqsvr4AJO2ii6OSUIMfxjo1yq49+lxkE7P647b3yS/4dlsJ2ciq4gdEXQLZy7ZJw4J WTtA== X-Gm-Message-State: ALoCoQlYCgyyH+KYVvpm9zkE4l3F9uSyrfvsDuSYtmGSi/x+25earSAZcH4+I3rtHNSOVCyN3+E+d7V110zAwvUbKAhOFoZwTA== X-Received: by 10.112.170.167 with SMTP id an7mr1124726lbc.37.1450438167106; Fri, 18 Dec 2015 03:29:27 -0800 (PST) Received: from localhost.localdomain (ppp91-76-173-134.pppoe.mtu-net.ru. [91.76.173.134]) by smtp.gmail.com with ESMTPSA id pl2sm2694549lbc.8.2015.12.18.03.29.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 18 Dec 2015 03:29:26 -0800 (PST) From: Maxim Uvarov To: lng-odp@lists.linaro.org Date: Fri, 18 Dec 2015 14:29:10 +0300 Message-Id: <1450438154-2062-6-git-send-email-maxim.uvarov@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1450438154-2062-1-git-send-email-maxim.uvarov@linaro.org> References: <1450438154-2062-1-git-send-email-maxim.uvarov@linaro.org> X-Topics: patch Subject: [lng-odp] [PATCHv18 5/9] linux-generic/helper: move ring from helper to linux-generic X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" Move ring and it's test from helper to linux-generic/pktio and kill not needed api_test directory. Unfortunately odp_ring_test.c had some old dirty code so I had to clean up it to to use cunit and latest helper apis. Signed-off-by: Maxim Uvarov --- configure.ac | 1 - helper/Makefile.am | 2 - helper/test/Makefile.am | 5 +- platform/linux-generic/Makefile.am | 2 + .../include/odp_packet_io_ring_internal.h | 112 +++++---- platform/linux-generic/m4/configure.m4 | 3 +- {helper => platform/linux-generic/pktio}/ring.c | 263 ++++++++++----------- platform/linux-generic/test/Makefile.am | 3 +- platform/linux-generic/test/ring/.gitignore | 1 + platform/linux-generic/test/ring/Makefile.am | 16 ++ .../linux-generic/test/ring/ringtest.c | 180 +++++++------- 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 ---- 16 files changed, 309 insertions(+), 429 deletions(-) rename helper/include/odp/helper/ring.h => platform/linux-generic/include/odp_packet_io_ring_internal.h (87%) rename {helper => platform/linux-generic/pktio}/ring.c (71%) create mode 100644 platform/linux-generic/test/ring/.gitignore create mode 100644 platform/linux-generic/test/ring/Makefile.am rename test/api_test/odp_ring_test.c => platform/linux-generic/test/ring/ringtest.c (72%) 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 diff --git a/configure.ac b/configure.ac index e45d90a..28b9ec9 100644 --- a/configure.ac +++ b/configure.ac @@ -345,7 +345,6 @@ AC_CONFIG_FILES([Makefile pkgconfig/libodphelper.pc scripts/Makefile test/Makefile - test/api_test/Makefile test/performance/Makefile test/validation/Makefile test/validation/buffer/Makefile diff --git a/helper/Makefile.am b/helper/Makefile.am index 1906ae2..6828092 100644 --- a/helper/Makefile.am +++ b/helper/Makefile.am @@ -8,7 +8,6 @@ AM_CFLAGS += -I$(top_srcdir)/include helperincludedir = $(includedir)/odp/helper/ helperinclude_HEADERS = \ - $(srcdir)/include/odp/helper/ring.h \ $(srcdir)/include/odp/helper/linux.h \ $(srcdir)/include/odp/helper/chksum.h\ $(srcdir)/include/odp/helper/eth.h\ @@ -29,7 +28,6 @@ noinst_HEADERS = \ __LIB__libodphelper_la_SOURCES = \ linux.c \ - ring.c \ hashtable.c \ lineartable.c diff --git a/helper/test/Makefile.am b/helper/test/Makefile.am index 1c6a802..cf3b7aa 100644 --- a/helper/test/Makefile.am +++ b/helper/test/Makefile.am @@ -1,6 +1,7 @@ include $(top_srcdir)/test/Makefile.inc AM_CFLAGS += -I$(srcdir)/common +AM_CFLAGS += -I$(top_srcdir)/test/validation/common AM_LDFLAGS += -static TESTS_ENVIRONMENT += TEST_DIR=${builddir} @@ -28,5 +29,5 @@ dist_thread_SOURCES = thread.c thread_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp.la dist_process_SOURCES = process.c process_LDADD = $(LIB)/libodphelper.la $(LIB)/libodp.la -odph_pause_SOURCES = pause.c -dist_odp_table_SOURCES = table.c +dist_pause_SOURCES = pause.c +dist_table_SOURCES = table.c diff --git a/platform/linux-generic/Makefile.am b/platform/linux-generic/Makefile.am index 4639ebc..8160649 100644 --- a/platform/linux-generic/Makefile.am +++ b/platform/linux-generic/Makefile.am @@ -90,6 +90,7 @@ noinst_HEADERS = \ ${srcdir}/include/odp_packet_internal.h \ ${srcdir}/include/odp_packet_io_internal.h \ ${srcdir}/include/odp_packet_io_queue.h \ + ${srcdir}/include/odp_packet_io_ring_internal.h \ ${srcdir}/include/odp_packet_netmap.h \ ${srcdir}/include/odp_packet_socket.h \ ${srcdir}/include/odp_packet_tap.h \ @@ -122,6 +123,7 @@ __LIB__libodp_la_SOURCES = \ pktio/socket.c \ pktio/socket_mmap.c \ pktio/tap.c \ + pktio/ring.c \ odp_pool.c \ odp_queue.c \ odp_rwlock.c \ diff --git a/helper/include/odp/helper/ring.h b/platform/linux-generic/include/odp_packet_io_ring_internal.h similarity index 87% rename from helper/include/odp/helper/ring.h rename to platform/linux-generic/include/odp_packet_io_ring_internal.h index 541a466..f97c026 100644 --- a/helper/include/odp/helper/ring.h +++ b/platform/linux-generic/include/odp_packet_io_ring_internal.h @@ -89,29 +89,28 @@ * */ -#ifndef ODPH_RING_H_ -#define ODPH_RING_H_ +#ifndef _RING_H_ +#define _RING_H_ #ifdef __cplusplus extern "C" { #endif - #include #include #include #include #include +#include -enum odph_ring_queue_behavior { - ODPH_RING_QUEUE_FIXED = 0, /**< Enq/Deq a fixed number +enum _ring_queue_behavior { + _RING_QUEUE_FIXED = 0, /**< Enq/Deq a fixed number of items from a ring */ - ODPH_RING_QUEUE_VARIABLE /**< Enq/Deq as many items + _RING_QUEUE_VARIABLE /**< Enq/Deq as many items a possible from ring */ }; - -#define ODPH_RING_NAMESIZE 32 /**< The maximum length of a ring name. */ +#define _RING_NAMESIZE 32 /**< The maximum length of a ring name. */ /** * An ODP ring structure. @@ -123,12 +122,12 @@ enum odph_ring_queue_behavior { * values in a modulo-32bit base: that's why the overflow of the indexes is not * a problem. */ -typedef struct odph_ring { +typedef struct _ring { /** @private Next in list. */ - TAILQ_ENTRY(odph_ring) next; + TAILQ_ENTRY(_ring) next; /** @private Name of the ring. */ - char name[ODPH_RING_NAMESIZE]; + char name[_RING_NAMESIZE]; /** @private Flags supplied at creation. */ int flags; @@ -153,21 +152,21 @@ typedef struct odph_ring { /** @private Memory space of ring starts here. */ void *ring[0] ODP_ALIGNED_CACHE; -} odph_ring_t; +} _ring_t; /* The default enqueue is "single-producer".*/ -#define ODPH_RING_F_SP_ENQ (1 << 0) +#define _RING_F_SP_ENQ (1 << 0) /* The default dequeue is "single-consumer".*/ -#define ODPH_RING_F_SC_DEQ (1 << 1) +#define _RING_F_SC_DEQ (1 << 1) /* If set - ring is visible from different processes. * Default is thread visible.*/ -#define ODPH_RING_SHM_PROC (1 << 2) +#define _RING_SHM_PROC (1 << 2) /* Do not link ring to linked list. */ -#define ODPH_RING_NO_LIST (1 << 3) +#define _RING_NO_LIST (1 << 3) /* Quota exceed for burst ops */ -#define ODPH_RING_QUOT_EXCEED (1 << 31) +#define _RING_QUOT_EXCEED (1 << 31) /* Ring size mask */ -#define ODPH_RING_SZ_MASK (unsigned)(0x0fffffff) +#define _RING_SZ_MASK (unsigned)(0x0fffffff) /** * Create a new ring named *name* in memory. @@ -198,9 +197,8 @@ typedef struct odph_ring { * - EEXIST - a memzone with the same name already exists * - ENOMEM - no appropriate memory area found in which to create memzone */ -odph_ring_t *odph_ring_create(const char *name, unsigned count, - unsigned flags); - +_ring_t *_ring_create(const char *name, unsigned count, + unsigned flags); /** * Change the high water mark. @@ -217,14 +215,14 @@ odph_ring_t *odph_ring_create(const char *name, unsigned count, * @return 0: Success; water mark changed. * -EINVAL: Invalid water mark value. */ -int odph_ring_set_water_mark(odph_ring_t *r, unsigned count); +int _ring_set_water_mark(_ring_t *r, unsigned count); /** * Dump the status of the ring to the console. * * @param r A pointer to the ring structure. */ -void odph_ring_dump(const odph_ring_t *r); +void _ring_dump(const _ring_t *r); /** * Enqueue several objects on the ring (multi-producers safe). @@ -251,9 +249,9 @@ void odph_ring_dump(const odph_ring_t *r); * if behavior = ODP_RING_QUEUE_VARIABLE * - n: Actual number of objects enqueued. */ -int __odph_ring_mp_do_enqueue(odph_ring_t *r, void * const *obj_table, - unsigned n, - enum odph_ring_queue_behavior behavior); +int ___ring_mp_do_enqueue(_ring_t *r, void * const *obj_table, + unsigned n, + enum _ring_queue_behavior behavior); /** * Enqueue several objects on a ring (NOT multi-producers safe). @@ -277,9 +275,9 @@ int __odph_ring_mp_do_enqueue(odph_ring_t *r, void * const *obj_table, * if behavior = ODP_RING_QUEUE_VARIABLE * - n: Actual number of objects enqueued. */ -int __odph_ring_sp_do_enqueue(odph_ring_t *r, void * const *obj_table, - unsigned n, - enum odph_ring_queue_behavior behavior); +int ___ring_sp_do_enqueue(_ring_t *r, void * const *obj_table, + unsigned n, + enum _ring_queue_behavior behavior); /** * Dequeue several objects from a ring (multi-consumers safe). When @@ -308,9 +306,9 @@ int __odph_ring_sp_do_enqueue(odph_ring_t *r, void * const *obj_table, * - n: Actual number of objects dequeued. */ -int __odph_ring_mc_do_dequeue(odph_ring_t *r, void **obj_table, - unsigned n, - enum odph_ring_queue_behavior behavior); +int ___ring_mc_do_dequeue(_ring_t *r, void **obj_table, + unsigned n, + enum _ring_queue_behavior behavior); /** * Dequeue several objects from a ring (NOT multi-consumers safe). @@ -335,9 +333,9 @@ int __odph_ring_mc_do_dequeue(odph_ring_t *r, void **obj_table, * if behavior = ODP_RING_QUEUE_VARIABLE * - n: Actual number of objects dequeued. */ -int __odph_ring_sc_do_dequeue(odph_ring_t *r, void **obj_table, - unsigned n, - enum odph_ring_queue_behavior behavior); +int ___ring_sc_do_dequeue(_ring_t *r, void **obj_table, + unsigned n, + enum _ring_queue_behavior behavior); /** * Enqueue several objects on the ring (multi-producers safe). @@ -357,8 +355,8 @@ int __odph_ring_sc_do_dequeue(odph_ring_t *r, void **obj_table, * high water mark is exceeded. * - -ENOBUFS: Not enough room in the ring to enqueue, no object is enqueued. */ -int odph_ring_mp_enqueue_bulk(odph_ring_t *r, void * const *obj_table, - unsigned n); +int _ring_mp_enqueue_bulk(_ring_t *r, void * const *obj_table, + unsigned n); /** * Enqueue several objects on a ring (NOT multi-producers safe). @@ -375,8 +373,8 @@ int odph_ring_mp_enqueue_bulk(odph_ring_t *r, void * const *obj_table, * high water mark is exceeded. * - -ENOBUFS: Not enough room in the ring to enqueue; no object is enqueued. */ -int odph_ring_sp_enqueue_bulk(odph_ring_t *r, void * const *obj_table, - unsigned n); +int _ring_sp_enqueue_bulk(_ring_t *r, void * const *obj_table, + unsigned n); /** * Dequeue several objects from a ring (multi-consumers safe). @@ -395,7 +393,7 @@ int odph_ring_sp_enqueue_bulk(odph_ring_t *r, void * const *obj_table, * - -ENOENT: Not enough entries in the ring to dequeue; no object is * dequeued. */ -int odph_ring_mc_dequeue_bulk(odph_ring_t *r, void **obj_table, unsigned n); +int _ring_mc_dequeue_bulk(_ring_t *r, void **obj_table, unsigned n); /** * Dequeue several objects from a ring (NOT multi-consumers safe). @@ -412,7 +410,7 @@ int odph_ring_mc_dequeue_bulk(odph_ring_t *r, void **obj_table, unsigned n); * - -ENOENT: Not enough entries in the ring to dequeue; no object is * dequeued. */ -int odph_ring_sc_dequeue_bulk(odph_ring_t *r, void **obj_table, unsigned n); +int _ring_sc_dequeue_bulk(_ring_t *r, void **obj_table, unsigned n); /** * Test if a ring is full. @@ -423,7 +421,7 @@ int odph_ring_sc_dequeue_bulk(odph_ring_t *r, void **obj_table, unsigned n); * - 1: The ring is full. * - 0: The ring is not full. */ -int odph_ring_full(const odph_ring_t *r); +int _ring_full(const _ring_t *r); /** * Test if a ring is empty. @@ -434,7 +432,7 @@ int odph_ring_full(const odph_ring_t *r); * - 1: The ring is empty. * - 0: The ring is not empty. */ -int odph_ring_empty(const odph_ring_t *r); +int _ring_empty(const _ring_t *r); /** * Return the number of entries in a ring. @@ -444,7 +442,7 @@ int odph_ring_empty(const odph_ring_t *r); * @return * The number of entries in the ring. */ -unsigned odph_ring_count(const odph_ring_t *r); +unsigned _ring_count(const _ring_t *r); /** * Return the number of free entries in a ring. @@ -454,14 +452,14 @@ unsigned odph_ring_count(const odph_ring_t *r); * @return * The number of free entries in the ring. */ -unsigned odph_ring_free_count(const odph_ring_t *r); +unsigned _ring_free_count(const _ring_t *r); /** * search ring by name * @param name ring name to search * @return pointer to ring otherwise NULL */ -odph_ring_t *odph_ring_lookup(const char *name); +_ring_t *_ring_lookup(const char *name); /** * Enqueue several objects on the ring (multi-producers safe). @@ -478,8 +476,8 @@ odph_ring_t *odph_ring_lookup(const char *name); * @return * - n: Actual number of objects enqueued. */ -int odph_ring_mp_enqueue_burst(odph_ring_t *r, void * const *obj_table, - unsigned n); +int _ring_mp_enqueue_burst(_ring_t *r, void * const *obj_table, + unsigned n); /** * Enqueue several objects on a ring (NOT multi-producers safe). @@ -493,8 +491,8 @@ int odph_ring_mp_enqueue_burst(odph_ring_t *r, void * const *obj_table, * @return * - n: Actual number of objects enqueued. */ -int odph_ring_sp_enqueue_burst(odph_ring_t *r, void * const *obj_table, - unsigned n); +int _ring_sp_enqueue_burst(_ring_t *r, void * const *obj_table, + unsigned n); /** * Enqueue several objects on a ring. * @@ -511,8 +509,8 @@ int odph_ring_sp_enqueue_burst(odph_ring_t *r, void * const *obj_table, * @return * - n: Actual number of objects enqueued. */ -int odph_ring_enqueue_burst(odph_ring_t *r, void * const *obj_table, - unsigned n); +int _ring_enqueue_burst(_ring_t *r, void * const *obj_table, + unsigned n); /** * Dequeue several objects from a ring (multi-consumers safe). When the request @@ -531,7 +529,7 @@ int odph_ring_enqueue_burst(odph_ring_t *r, void * const *obj_table, * @return * - n: Actual number of objects dequeued, 0 if ring is empty */ -int odph_ring_mc_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n); +int _ring_mc_dequeue_burst(_ring_t *r, void **obj_table, unsigned n); /** * Dequeue several objects from a ring (NOT multi-consumers safe).When the @@ -547,7 +545,7 @@ int odph_ring_mc_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n); * @return * - n: Actual number of objects dequeued, 0 if ring is empty */ -int odph_ring_sc_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n); +int _ring_sc_dequeue_burst(_ring_t *r, void **obj_table, unsigned n); /** * Dequeue multiple objects from a ring up to a maximum number. @@ -565,17 +563,17 @@ int odph_ring_sc_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n); * @return * - Number of objects dequeued, or a negative error code on error */ -int odph_ring_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n); +int _ring_dequeue_burst(_ring_t *r, void **obj_table, unsigned n); /** * dump the status of all rings on the console */ -void odph_ring_list_dump(void); +void _ring_list_dump(void); /** * initialise ring tailq */ -void odph_ring_tailq_init(void); +void _ring_tailq_init(void); #ifdef __cplusplus } diff --git a/platform/linux-generic/m4/configure.m4 b/platform/linux-generic/m4/configure.m4 index df6dc64..6bb159f 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/pktio/Makefile]) + platform/linux-generic/test/pktio/Makefile + platform/linux-generic/test/ring/Makefile]) diff --git a/helper/ring.c b/platform/linux-generic/pktio/ring.c similarity index 71% rename from helper/ring.c rename to platform/linux-generic/pktio/ring.c index e113606..e978420 100644 --- a/helper/ring.c +++ b/platform/linux-generic/pktio/ring.c @@ -78,9 +78,9 @@ #include #include "odph_debug.h" #include -#include +#include -static TAILQ_HEAD(, odph_ring) odp_ring_list; +static TAILQ_HEAD(, _ring) odp_ring_list; #define RING_VAL_IS_POWER_2(x) ((((x) - 1) & (x)) == 0) @@ -93,9 +93,9 @@ static TAILQ_HEAD(, odph_ring) odp_ring_list; if (odp_likely(idx + n < size)) { \ for (i = 0; i < (n & ((~(unsigned)0x3))); i += 4, idx += 4) { \ r->ring[idx] = obj_table[i]; \ - r->ring[idx+1] = obj_table[i+1]; \ - r->ring[idx+2] = obj_table[i+2]; \ - r->ring[idx+3] = obj_table[i+3]; \ + r->ring[idx + 1] = obj_table[i + 1]; \ + r->ring[idx + 2] = obj_table[i + 2]; \ + r->ring[idx + 3] = obj_table[i + 3]; \ } \ switch (n & 0x3) { \ case 3: \ @@ -122,9 +122,9 @@ static TAILQ_HEAD(, odph_ring) odp_ring_list; if (odp_likely(idx + n < size)) { \ for (i = 0; i < (n & (~(unsigned)0x3)); i += 4, idx += 4) {\ obj_table[i] = r->ring[idx]; \ - obj_table[i+1] = r->ring[idx+1]; \ - obj_table[i+2] = r->ring[idx+2]; \ - obj_table[i+3] = r->ring[idx+3]; \ + obj_table[i + 1] = r->ring[idx + 1]; \ + obj_table[i + 2] = r->ring[idx + 2]; \ + obj_table[i + 3] = r->ring[idx + 3]; \ } \ switch (n & 0x3) { \ case 3: \ @@ -145,36 +145,37 @@ static TAILQ_HEAD(, odph_ring) odp_ring_list; static odp_rwlock_t qlock; /* rings tailq lock */ /* init tailq_ring */ -void odph_ring_tailq_init(void) +void _ring_tailq_init(void) { TAILQ_INIT(&odp_ring_list); odp_rwlock_init(&qlock); } /* create the ring */ -odph_ring_t * -odph_ring_create(const char *name, unsigned count, unsigned flags) +_ring_t * +_ring_create(const char *name, unsigned count, unsigned flags) { - char ring_name[ODPH_RING_NAMESIZE]; - odph_ring_t *r; + char ring_name[_RING_NAMESIZE]; + _ring_t *r; size_t ring_size; uint32_t shm_flag; odp_shm_t shm; - if (flags & ODPH_RING_SHM_PROC) + if (flags & _RING_SHM_PROC) shm_flag = ODP_SHM_PROC; else shm_flag = 0; /* count must be a power of 2 */ - if (!RING_VAL_IS_POWER_2(count) || (count > ODPH_RING_SZ_MASK)) { - ODPH_ERR("Requested size is invalid, must be power of 2, and do not exceed the size limit %u\n", - ODPH_RING_SZ_MASK); + if (!RING_VAL_IS_POWER_2(count) || (count > _RING_SZ_MASK)) { + ODPH_ERR("Requested size is invalid, must be power of 2," + "and do not exceed the size limit %u\n", + _RING_SZ_MASK); return NULL; } snprintf(ring_name, sizeof(ring_name), "%s", name); - ring_size = count*sizeof(void *)+sizeof(odph_ring_t); + ring_size = count * sizeof(void *) + sizeof(_ring_t); odp_rwlock_write_lock(&qlock); /* reserve a memory zone for this ring.*/ @@ -188,18 +189,18 @@ odph_ring_create(const char *name, unsigned count, unsigned flags) snprintf(r->name, sizeof(r->name), "%s", name); r->flags = flags; r->prod.watermark = count; - r->prod.sp_enqueue = !!(flags & ODPH_RING_F_SP_ENQ); - r->cons.sc_dequeue = !!(flags & ODPH_RING_F_SC_DEQ); + r->prod.sp_enqueue = !!(flags & _RING_F_SP_ENQ); + r->cons.sc_dequeue = !!(flags & _RING_F_SC_DEQ); r->prod.size = count; r->cons.size = count; - r->prod.mask = count-1; - r->cons.mask = count-1; + r->prod.mask = count - 1; + r->cons.mask = count - 1; r->prod.head = 0; r->cons.head = 0; r->prod.tail = 0; r->cons.tail = 0; - if (!(flags & ODPH_RING_NO_LIST)) + if (!(flags & _RING_NO_LIST)) TAILQ_INSERT_TAIL(&odp_ring_list, r, next); } else { ODPH_ERR("Cannot reserve memory\n"); @@ -213,7 +214,7 @@ odph_ring_create(const char *name, unsigned count, unsigned flags) * change the high water mark. If *count* is 0, water marking is * disabled */ -int odph_ring_set_water_mark(odph_ring_t *r, unsigned count) +int _ring_set_water_mark(_ring_t *r, unsigned count) { if (count >= r->prod.size) return -EINVAL; @@ -229,8 +230,8 @@ int odph_ring_set_water_mark(odph_ring_t *r, unsigned count) /** * Enqueue several objects on the ring (multi-producers safe). */ -int __odph_ring_mp_do_enqueue(odph_ring_t *r, void * const *obj_table, - unsigned n, enum odph_ring_queue_behavior behavior) +int ___ring_mp_do_enqueue(_ring_t *r, void * const *obj_table, + unsigned n, enum _ring_queue_behavior behavior) { uint32_t prod_head, prod_next; uint32_t cons_tail, free_entries; @@ -255,24 +256,22 @@ int __odph_ring_mp_do_enqueue(odph_ring_t *r, void * const *obj_table, /* check that we have enough room in ring */ if (odp_unlikely(n > free_entries)) { - if (behavior == ODPH_RING_QUEUE_FIXED) { + if (behavior == _RING_QUEUE_FIXED) return -ENOBUFS; - } else { - /* No free entry available */ - if (odp_unlikely(free_entries == 0)) - return 0; + /* No free entry available */ + if (odp_unlikely(free_entries == 0)) + return 0; - n = free_entries; - } + n = free_entries; } prod_next = prod_head + n; success = __atomic_compare_exchange_n(&r->prod.head, - &prod_head, - prod_next, - false/*strong*/, - __ATOMIC_ACQUIRE, - __ATOMIC_RELAXED); + &prod_head, + prod_next, + false/*strong*/, + __ATOMIC_ACQUIRE, + __ATOMIC_RELAXED); } while (odp_unlikely(success == 0)); /* write entries in ring */ @@ -280,10 +279,10 @@ int __odph_ring_mp_do_enqueue(odph_ring_t *r, void * const *obj_table, /* if we exceed the watermark */ if (odp_unlikely(((mask + 1) - free_entries + n) > r->prod.watermark)) { - ret = (behavior == ODPH_RING_QUEUE_FIXED) ? -EDQUOT : - (int)(n | ODPH_RING_QUOT_EXCEED); + ret = (behavior == _RING_QUEUE_FIXED) ? -EDQUOT : + (int)(n | _RING_QUOT_EXCEED); } else { - ret = (behavior == ODPH_RING_QUEUE_FIXED) ? 0 : n; + ret = (behavior == _RING_QUEUE_FIXED) ? 0 : n; } /* @@ -302,8 +301,8 @@ int __odph_ring_mp_do_enqueue(odph_ring_t *r, void * const *obj_table, /** * Enqueue several objects on a ring (NOT multi-producers safe). */ -int __odph_ring_sp_do_enqueue(odph_ring_t *r, void * const *obj_table, - unsigned n, enum odph_ring_queue_behavior behavior) +int ___ring_sp_do_enqueue(_ring_t *r, void * const *obj_table, + unsigned n, enum _ring_queue_behavior behavior) { uint32_t prod_head, cons_tail; uint32_t prod_next, free_entries; @@ -321,15 +320,13 @@ int __odph_ring_sp_do_enqueue(odph_ring_t *r, void * const *obj_table, /* check that we have enough room in ring */ if (odp_unlikely(n > free_entries)) { - if (behavior == ODPH_RING_QUEUE_FIXED) { + if (behavior == _RING_QUEUE_FIXED) return -ENOBUFS; - } else { - /* No free entry available */ - if (odp_unlikely(free_entries == 0)) - return 0; + /* No free entry available */ + if (odp_unlikely(free_entries == 0)) + return 0; - n = free_entries; - } + n = free_entries; } prod_next = prod_head + n; @@ -340,10 +337,10 @@ int __odph_ring_sp_do_enqueue(odph_ring_t *r, void * const *obj_table, /* if we exceed the watermark */ if (odp_unlikely(((mask + 1) - free_entries + n) > r->prod.watermark)) { - ret = (behavior == ODPH_RING_QUEUE_FIXED) ? -EDQUOT : - (int)(n | ODPH_RING_QUOT_EXCEED); + ret = (behavior == _RING_QUEUE_FIXED) ? -EDQUOT : + (int)(n | _RING_QUOT_EXCEED); } else { - ret = (behavior == ODPH_RING_QUEUE_FIXED) ? 0 : n; + ret = (behavior == _RING_QUEUE_FIXED) ? 0 : n; } /* Release our entries and the memory they refer to */ @@ -356,8 +353,8 @@ int __odph_ring_sp_do_enqueue(odph_ring_t *r, void * const *obj_table, * Dequeue several objects from a ring (multi-consumers safe). */ -int __odph_ring_mc_do_dequeue(odph_ring_t *r, void **obj_table, - unsigned n, enum odph_ring_queue_behavior behavior) +int ___ring_mc_do_dequeue(_ring_t *r, void **obj_table, + unsigned n, enum _ring_queue_behavior behavior) { uint32_t cons_head, prod_tail; uint32_t cons_next, entries; @@ -381,23 +378,21 @@ int __odph_ring_mc_do_dequeue(odph_ring_t *r, void **obj_table, /* Set the actual entries for dequeue */ if (n > entries) { - if (behavior == ODPH_RING_QUEUE_FIXED) { + if (behavior == _RING_QUEUE_FIXED) return -ENOENT; - } else { - if (odp_unlikely(entries == 0)) - return 0; + if (odp_unlikely(entries == 0)) + return 0; - n = entries; - } + n = entries; } cons_next = cons_head + n; success = __atomic_compare_exchange_n(&r->cons.head, - &cons_head, - cons_next, - false/*strong*/, - __ATOMIC_ACQUIRE, - __ATOMIC_RELAXED); + &cons_head, + cons_next, + false/*strong*/, + __ATOMIC_ACQUIRE, + __ATOMIC_RELAXED); } while (odp_unlikely(success == 0)); /* copy in table */ @@ -414,14 +409,14 @@ int __odph_ring_mc_do_dequeue(odph_ring_t *r, void **obj_table, __atomic_thread_fence(__ATOMIC_RELEASE); r->cons.tail = cons_next; - return behavior == ODPH_RING_QUEUE_FIXED ? 0 : n; + return behavior == _RING_QUEUE_FIXED ? 0 : n; } /** * Dequeue several objects from a ring (NOT multi-consumers safe). */ -int __odph_ring_sc_do_dequeue(odph_ring_t *r, void **obj_table, - unsigned n, enum odph_ring_queue_behavior behavior) +int ___ring_sc_do_dequeue(_ring_t *r, void **obj_table, + unsigned n, enum _ring_queue_behavior behavior) { uint32_t cons_head, prod_tail; uint32_t cons_next, entries; @@ -437,14 +432,12 @@ int __odph_ring_sc_do_dequeue(odph_ring_t *r, void **obj_table, entries = prod_tail - cons_head; if (n > entries) { - if (behavior == ODPH_RING_QUEUE_FIXED) { + if (behavior == _RING_QUEUE_FIXED) return -ENOENT; - } else { - if (odp_unlikely(entries == 0)) - return 0; + if (odp_unlikely(entries == 0)) + return 0; - n = entries; - } + n = entries; } cons_next = cons_head + n; @@ -456,127 +449,131 @@ int __odph_ring_sc_do_dequeue(odph_ring_t *r, void **obj_table, DEQUEUE_PTRS(); r->cons.tail = cons_next; - return behavior == ODPH_RING_QUEUE_FIXED ? 0 : n; + return behavior == _RING_QUEUE_FIXED ? 0 : n; } /** * Enqueue several objects on the ring (multi-producers safe). */ -int odph_ring_mp_enqueue_bulk(odph_ring_t *r, void * const *obj_table, - unsigned n) +int _ring_mp_enqueue_bulk(_ring_t *r, void * const *obj_table, + unsigned n) { - return __odph_ring_mp_do_enqueue(r, obj_table, n, - ODPH_RING_QUEUE_FIXED); + return ___ring_mp_do_enqueue(r, obj_table, n, + _RING_QUEUE_FIXED); } /** * Enqueue several objects on a ring (NOT multi-producers safe). */ -int odph_ring_sp_enqueue_bulk(odph_ring_t *r, void * const *obj_table, - unsigned n) +int _ring_sp_enqueue_bulk(_ring_t *r, void * const *obj_table, + unsigned n) { - return __odph_ring_sp_do_enqueue(r, obj_table, n, - ODPH_RING_QUEUE_FIXED); + return ___ring_sp_do_enqueue(r, obj_table, n, + _RING_QUEUE_FIXED); } /** * Dequeue several objects from a ring (multi-consumers safe). */ -int odph_ring_mc_dequeue_bulk(odph_ring_t *r, void **obj_table, unsigned n) +int _ring_mc_dequeue_bulk(_ring_t *r, void **obj_table, unsigned n) { - return __odph_ring_mc_do_dequeue(r, obj_table, n, - ODPH_RING_QUEUE_FIXED); + return ___ring_mc_do_dequeue(r, obj_table, n, + _RING_QUEUE_FIXED); } /** * Dequeue several objects from a ring (NOT multi-consumers safe). */ -int odph_ring_sc_dequeue_bulk(odph_ring_t *r, void **obj_table, unsigned n) +int _ring_sc_dequeue_bulk(_ring_t *r, void **obj_table, unsigned n) { - return __odph_ring_sc_do_dequeue(r, obj_table, n, - ODPH_RING_QUEUE_FIXED); + return ___ring_sc_do_dequeue(r, obj_table, n, + _RING_QUEUE_FIXED); } /** * Test if a ring is full. */ -int odph_ring_full(const odph_ring_t *r) +int _ring_full(const _ring_t *r) { uint32_t prod_tail = r->prod.tail; uint32_t cons_tail = r->cons.tail; + return (((cons_tail - prod_tail - 1) & r->prod.mask) == 0); } /** * Test if a ring is empty. */ -int odph_ring_empty(const odph_ring_t *r) +int _ring_empty(const _ring_t *r) { uint32_t prod_tail = r->prod.tail; uint32_t cons_tail = r->cons.tail; + return !!(cons_tail == prod_tail); } /** * Return the number of entries in a ring. */ -unsigned odph_ring_count(const odph_ring_t *r) +unsigned _ring_count(const _ring_t *r) { uint32_t prod_tail = r->prod.tail; uint32_t cons_tail = r->cons.tail; + return (prod_tail - cons_tail) & r->prod.mask; } /** * Return the number of free entries in a ring. */ -unsigned odph_ring_free_count(const odph_ring_t *r) +unsigned _ring_free_count(const _ring_t *r) { uint32_t prod_tail = r->prod.tail; uint32_t cons_tail = r->cons.tail; + return (cons_tail - prod_tail - 1) & r->prod.mask; } /* dump the status of the ring on the console */ -void odph_ring_dump(const odph_ring_t *r) +void _ring_dump(const _ring_t *r) { - ODPH_DBG("ring <%s>@%p\n", r->name, r); - ODPH_DBG(" flags=%x\n", r->flags); - ODPH_DBG(" size=%" PRIu32 "\n", r->prod.size); - ODPH_DBG(" ct=%" PRIu32 "\n", r->cons.tail); - ODPH_DBG(" ch=%" PRIu32 "\n", r->cons.head); - ODPH_DBG(" pt=%" PRIu32 "\n", r->prod.tail); - ODPH_DBG(" ph=%" PRIu32 "\n", r->prod.head); - ODPH_DBG(" used=%u\n", odph_ring_count(r)); - ODPH_DBG(" avail=%u\n", odph_ring_free_count(r)); + ODP_DBG("ring <%s>@%p\n", r->name, r); + ODP_DBG(" flags=%x\n", r->flags); + ODP_DBG(" size=%" PRIu32 "\n", r->prod.size); + ODP_DBG(" ct=%" PRIu32 "\n", r->cons.tail); + ODP_DBG(" ch=%" PRIu32 "\n", r->cons.head); + ODP_DBG(" pt=%" PRIu32 "\n", r->prod.tail); + ODP_DBG(" ph=%" PRIu32 "\n", r->prod.head); + ODP_DBG(" used=%u\n", _ring_count(r)); + ODP_DBG(" avail=%u\n", _ring_free_count(r)); if (r->prod.watermark == r->prod.size) - ODPH_DBG(" watermark=0\n"); + ODP_DBG(" watermark=0\n"); else - ODPH_DBG(" watermark=%" PRIu32 "\n", r->prod.watermark); + ODP_DBG(" watermark=%" PRIu32 "\n", r->prod.watermark); } /* dump the status of all rings on the console */ -void odph_ring_list_dump(void) +void _ring_list_dump(void) { - const odph_ring_t *mp = NULL; + const _ring_t *mp = NULL; odp_rwlock_read_lock(&qlock); TAILQ_FOREACH(mp, &odp_ring_list, next) { - odph_ring_dump(mp); + _ring_dump(mp); } odp_rwlock_read_unlock(&qlock); } /* search a ring from its name */ -odph_ring_t *odph_ring_lookup(const char *name) +_ring_t *_ring_lookup(const char *name) { - odph_ring_t *r; + _ring_t *r; odp_rwlock_read_lock(&qlock); TAILQ_FOREACH(r, &odp_ring_list, next) { - if (strncmp(name, r->name, ODPH_RING_NAMESIZE) == 0) + if (strncmp(name, r->name, _RING_NAMESIZE) == 0) break; } odp_rwlock_read_unlock(&qlock); @@ -587,60 +584,60 @@ odph_ring_t *odph_ring_lookup(const char *name) /** * Enqueue several objects on the ring (multi-producers safe). */ -int odph_ring_mp_enqueue_burst(odph_ring_t *r, void * const *obj_table, - unsigned n) +int _ring_mp_enqueue_burst(_ring_t *r, void * const *obj_table, + unsigned n) { - return __odph_ring_mp_do_enqueue(r, obj_table, n, - ODPH_RING_QUEUE_VARIABLE); + return ___ring_mp_do_enqueue(r, obj_table, n, + _RING_QUEUE_VARIABLE); } /** * Enqueue several objects on a ring (NOT multi-producers safe). */ -int odph_ring_sp_enqueue_burst(odph_ring_t *r, void * const *obj_table, - unsigned n) +int _ring_sp_enqueue_burst(_ring_t *r, void * const *obj_table, + unsigned n) { - return __odph_ring_sp_do_enqueue(r, obj_table, n, - ODPH_RING_QUEUE_VARIABLE); + return ___ring_sp_do_enqueue(r, obj_table, n, + _RING_QUEUE_VARIABLE); } /** * Enqueue several objects on a ring. */ -int odph_ring_enqueue_burst(odph_ring_t *r, void * const *obj_table, - unsigned n) +int _ring_enqueue_burst(_ring_t *r, void * const *obj_table, + unsigned n) { if (r->prod.sp_enqueue) - return odph_ring_sp_enqueue_burst(r, obj_table, n); + return _ring_sp_enqueue_burst(r, obj_table, n); else - return odph_ring_mp_enqueue_burst(r, obj_table, n); + return _ring_mp_enqueue_burst(r, obj_table, n); } /** * Dequeue several objects from a ring (multi-consumers safe). */ -int odph_ring_mc_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n) +int _ring_mc_dequeue_burst(_ring_t *r, void **obj_table, unsigned n) { - return __odph_ring_mc_do_dequeue(r, obj_table, n, - ODPH_RING_QUEUE_VARIABLE); + return ___ring_mc_do_dequeue(r, obj_table, n, + _RING_QUEUE_VARIABLE); } /** * Dequeue several objects from a ring (NOT multi-consumers safe). */ -int odph_ring_sc_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n) +int _ring_sc_dequeue_burst(_ring_t *r, void **obj_table, unsigned n) { - return __odph_ring_sc_do_dequeue(r, obj_table, n, - ODPH_RING_QUEUE_VARIABLE); + return ___ring_sc_do_dequeue(r, obj_table, n, + _RING_QUEUE_VARIABLE); } /** * Dequeue multiple objects from a ring up to a maximum number. */ -int odph_ring_dequeue_burst(odph_ring_t *r, void **obj_table, unsigned n) +int _ring_dequeue_burst(_ring_t *r, void **obj_table, unsigned n) { if (r->cons.sc_dequeue) - return odph_ring_sc_dequeue_burst(r, obj_table, n); + return _ring_sc_dequeue_burst(r, obj_table, n); else - return odph_ring_mc_dequeue_burst(r, obj_table, n); + return _ring_mc_dequeue_burst(r, obj_table, n); } diff --git a/platform/linux-generic/test/Makefile.am b/platform/linux-generic/test/Makefile.am index 594aa11..f81eeb8 100644 --- a/platform/linux-generic/test/Makefile.am +++ b/platform/linux-generic/test/Makefile.am @@ -1,11 +1,12 @@ include $(top_srcdir)/test/Makefile.inc TESTS_ENVIRONMENT += TEST_DIR=${top_builddir}/test/validation -ODP_MODULES = pktio +ODP_MODULES = pktio ring if test_vald TESTS = pktio/pktio_run \ pktio/pktio_run_tap \ + ring/ringtest$(EXEEXT) \ ${top_builddir}/test/validation/buffer/buffer_main$(EXEEXT) \ ${top_builddir}/test/validation/classification/classification_main$(EXEEXT) \ ${top_builddir}/test/validation/config/config_main$(EXEEXT) \ diff --git a/platform/linux-generic/test/ring/.gitignore b/platform/linux-generic/test/ring/.gitignore new file mode 100644 index 0000000..4767f5e --- /dev/null +++ b/platform/linux-generic/test/ring/.gitignore @@ -0,0 +1 @@ +ringtest diff --git a/platform/linux-generic/test/ring/Makefile.am b/platform/linux-generic/test/ring/Makefile.am new file mode 100644 index 0000000..5a949d0 --- /dev/null +++ b/platform/linux-generic/test/ring/Makefile.am @@ -0,0 +1,16 @@ +include $(top_srcdir)/test/validation/Makefile.inc + +AM_CFLAGS += -I$(srcdir)/common +AM_CFLAGS += -I$(top_srcdir)/test/validation/common +AM_LDFLAGS += -static + +COMPILE_ONLY = + +TESTSCRIPTS = + +EXECUTABLES = ringtest$(EXEEXT) + +test_PROGRAMS = $(EXECUTABLES) $(COMPILE_ONLY) + +ringtest_SOURCES = ringtest.c +ringtest_LDADD = $(LIBCUNIT_COMMON) $(LIBODP) diff --git a/test/api_test/odp_ring_test.c b/platform/linux-generic/test/ring/ringtest.c similarity index 72% rename from test/api_test/odp_ring_test.c rename to platform/linux-generic/test/ring/ringtest.c index e8a962a..dfa220b 100644 --- a/test/api_test/odp_ring_test.c +++ b/platform/linux-generic/test/ring/ringtest.c @@ -37,7 +37,6 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - /** * @file * @@ -48,86 +47,96 @@ #include #include #include -#include -#include +#include +#include #include +#include #define RING_SIZE 4096 #define MAX_BULK 32 -#define RING_TEST_BASIC +enum { + ODP_RING_TEST_BASIC, + ODP_RING_TEST_STRESS, +}; -static int test_ring_basic(odph_ring_t *r) +/* local struct for ring_thread argument */ +typedef struct { + pthrd_arg thrdarg; + int stress_type; +} ring_arg_t; + +static int test_ring_basic(_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 *)); + 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++) + 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 *)); + 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 *)); + 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); + ret = _ring_sp_enqueue_burst(r, cur_src, 1); cur_src += 1; - if ((ret & ODPH_RING_SZ_MASK) != 1) { + if ((ret & _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); + ret = _ring_sp_enqueue_burst(r, cur_src, 2); cur_src += 2; - if ((ret & ODPH_RING_SZ_MASK) != 2) { + if ((ret & _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) { + ret = _ring_sp_enqueue_burst(r, cur_src, MAX_BULK); + if ((ret & _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); + ret = _ring_sc_dequeue_burst(r, cur_dst, 1); cur_dst += 1; - if ((ret & ODPH_RING_SZ_MASK) != 1) { + if ((ret & _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); + ret = _ring_sc_dequeue_burst(r, cur_dst, 2); cur_dst += 2; - if ((ret & ODPH_RING_SZ_MASK) != 2) { + if ((ret & _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); + ret = _ring_sc_dequeue_burst(r, cur_dst, MAX_BULK); cur_dst += MAX_BULK; - if ((ret & ODPH_RING_SZ_MASK) != MAX_BULK) { + if ((ret & _RING_SZ_MASK) != MAX_BULK) { LOG_ERR("sc_deq for %d obj failed\n", MAX_BULK); goto fail; } @@ -144,41 +153,41 @@ static int test_ring_basic(odph_ring_t *r) printf("Test MP & MC basic functions\n"); printf("enqueue 1 obj\n"); - ret = odph_ring_mp_enqueue_bulk(r, cur_src, 1); + ret = _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); + ret = _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); + ret = _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); + ret = _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); + ret = _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); + ret = _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); @@ -191,30 +200,30 @@ static int test_ring_basic(odph_ring_t *r) } printf("test watermark and default bulk enqueue / dequeue\n"); - odph_ring_set_water_mark(r, 20); + _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); + ret = _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); + ret = _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); + ret = _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); + ret = _ring_mc_dequeue_bulk(r, cur_dst, num_elems); cur_dst += num_elems; if (ret != 0) { LOG_ERR("Cannot dequeue2\n"); @@ -241,7 +250,7 @@ fail: } /* global shared ring used for stress testing */ -static odph_ring_t *r_stress; +static _ring_t *r_stress; /* Stress func for Multi producer only */ static int producer_fn(void) @@ -251,7 +260,7 @@ static int producer_fn(void) void **src = NULL; /* alloc dummy object pointers */ - src = malloc(MAX_BULK*2*sizeof(void *)); + src = malloc(MAX_BULK * 2 * sizeof(void *)); if (src == NULL) { LOG_ERR("failed to allocate producer memory.\n"); return -1; @@ -260,7 +269,7 @@ static int producer_fn(void) src[i] = (void *)(unsigned long)i; do { - i = odph_ring_mp_enqueue_bulk(r_stress, src, MAX_BULK); + i = _ring_mp_enqueue_bulk(r_stress, src, MAX_BULK); if (i == 0) { free(src); return 0; @@ -275,14 +284,14 @@ static int consumer_fn(void) void **src = NULL; /* alloc dummy object pointers */ - src = malloc(MAX_BULK*2*sizeof(void *)); + 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); + i = _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) { @@ -298,7 +307,6 @@ static int consumer_fn(void) } while (1); } - /* * Note : make sure that both enqueue and dequeue * operation starts at same time so to avoid data corruption @@ -319,24 +327,22 @@ typedef enum { 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) + if (thr % 2 == 0) producer_fn(); else consumer_fn(); break; - case one_deq_rest_enq: case one_enq_rest_deq:/*TBD*/ default: @@ -344,19 +350,12 @@ static void test_ring_stress(stress_type_t type) } } -/* 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; + char ring_name[_RING_NAMESIZE]; + _ring_t *r; int result = 0; thr = odp_thread_id(); @@ -367,16 +366,16 @@ static void *test_ring(void *arg) 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 */); + r = _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) { + if (_ring_lookup(ring_name) != r) { LOG_ERR("ring lookup failed\n"); result = -1; break; @@ -388,16 +387,16 @@ static void *test_ring(void *arg) result = -1; } - /* dump ring stats */ - odph_ring_list_dump(); + if (result) + _ring_list_dump(); break; case ODP_RING_TEST_STRESS: test_ring_stress(parg->stress_type); - /* dump ring stats */ - odph_ring_list_dump(); + if (result) + _ring_list_dump(); break; default: @@ -417,54 +416,69 @@ static void *test_ring(void *arg) return parg; } - -int main(int argc __attribute__((__unused__)), - char *argv[] __attribute__((__unused__))) +int main(int argc TEST_UNUSED, char *argv[] TEST_UNUSED) { ring_arg_t rarg; + odph_linux_pthread_t thread_tbl[MAX_WORKERS]; + odp_cpumask_t cpu_mask; + int num_workers; + char ring_name[_RING_NAMESIZE]; - if (odp_test_global_init() != 0) - return -1; + if (odp_init_global(NULL, NULL)) { + LOG_ERR("Error: ODP global init failed.\n"); + exit(EXIT_FAILURE); + } - odp_print_system_info(); + if (odp_init_local(ODP_THREAD_CONTROL)) { + LOG_ERR("Error: ODP local init failed.\n"); + exit(EXIT_FAILURE); + } - odph_ring_tailq_init(); + _ring_tailq_init(); - rarg.thrdarg.numthrds = odp_cpu_count(); + num_workers = odp_cpumask_default_worker(&cpu_mask, MAX_WORKERS); + rarg.thrdarg.numthrds = rarg.thrdarg.numthrds; -#ifdef RING_TEST_BASIC rarg.thrdarg.testcase = ODP_RING_TEST_BASIC; -#else + printf("starting stess test type : %d..\n", rarg.stress_type); + odph_linux_pthread_create(&thread_tbl[0], &cpu_mask, + test_ring, (void *)&rarg, + ODP_THREAD_WORKER); + odph_linux_pthread_join(thread_tbl, num_workers); + 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 */); + r_stress = _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) { + if (_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 + odph_linux_pthread_create(&thread_tbl[0], &cpu_mask, + test_ring, (void *)&rarg, + ODP_THREAD_WORKER); + odph_linux_pthread_join(thread_tbl, num_workers); + fail: -#endif + if (odp_term_local()) { + LOG_ERR("Error: ODP local term failed.\n"); + exit(EXIT_FAILURE); + } - odp_test_thread_exit(&rarg.thrdarg); + if (odp_term_global()) { + LOG_ERR("Error: ODP global term failed.\n"); + exit(EXIT_FAILURE); + } return 0; } - 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 fcdba48..0000000 --- a/test/api_test/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -include $(top_srcdir)/test/Makefile.inc - -bin_PROGRAMS = odp_ring$(EXEEXT) - -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 cebaa12..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 -#include -#include -#include -#include - -#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 */ - odp_cpumask_default_worker(&cpumask, arg->numthrds); - odph_linux_pthread_create(thread_tbl, &cpumask, func_ptr, - (void *)arg, ODP_THREAD_WORKER); - - 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 */