From patchwork Fri Sep 6 19:05:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Honnappa Nagarahalli X-Patchwork-Id: 173294 Delivered-To: patch@linaro.org Received: by 2002:a05:6e02:ce:0:0:0:0 with SMTP id r14csp1129308ilq; Fri, 6 Sep 2019 12:06:48 -0700 (PDT) X-Google-Smtp-Source: APXvYqw1p3siSGR69daRCJHFVGgDAn0i0T0/X1PidBFZ8W2Fro9TU1q4zTh19unSqr3NSiaupLEU X-Received: by 2002:a17:906:b34a:: with SMTP id cd10mr8876178ejb.300.1567796807924; Fri, 06 Sep 2019 12:06:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567796807; cv=none; d=google.com; s=arc-20160816; b=XX+J2+zcyZF07WcGx/JiITkZ3HPt7UyvhOl7YCdEUIW5BjhabK4zQVpSu/VHtUcU3x mhCQWCKnBi7/2uzWQP4FpQXR/D5JPxIvZGFQln1WqQPkAcP4eCTH/cl6uA+c/opQ4zvz /E12pomo12ht+V1f/r2qS4HFM+Z42+9z/V2hRoSjVjQket6Vw4eBcTP1JIiR9tVd3OJO ezdMk05f+eG7qA6z4Ri5kNHZixsTsDXs24tALoiD77QV4TJa/0flfRGDUKJm9YR+1x8e 8Jxa3wBSM+bHzpQ9OGtsvTGzMgUPw4KqlIocRq9j99Usg6YsN+eyiJMLO689xA06k+tz 9SVQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:cc:to:from; bh=N5azophg0p4AciwWhjypWwXIgV/OowSG600oOpg7qRw=; b=LvuUfa+OqxMFDNUOg83WArvnfN9SbX8mzY50xus7bnXlrtSWUo2KI3sEHyYdoejF19 Zp+MJWAfF8p9fQwYsciNiCaHCuuxCvTe0jiizffMB9/s4ue7z/l7mFb95W0coVleTCe6 WQ94Qh+IvEMzuAIccctRCuPg1bUozQStdy5P49aBNQb59dy8POFo6XI7+BjFkkFx0kE+ Ik481szlmvPvsiS/RizGZku6KjlCRBzMPu1jRrzUy+HZ7QgTSIfOLeboV8pCn4opoPfq jzu7IPCWvO5iYVJDjPNNmLpMHazVBeSJ/oUI5aSwy+edb8dwnLOXynOAxpC2+Nc3KifI +VEg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) smtp.mailfrom=dev-bounces@dpdk.org Return-Path: Received: from dpdk.org (dpdk.org. [92.243.14.124]) by mx.google.com with ESMTP id d20si3273160edr.195.2019.09.06.12.06.47; Fri, 06 Sep 2019 12:06:47 -0700 (PDT) Received-SPF: pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) client-ip=92.243.14.124; Authentication-Results: mx.google.com; spf=pass (google.com: domain of dev-bounces@dpdk.org designates 92.243.14.124 as permitted sender) smtp.mailfrom=dev-bounces@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 585981BF80; Fri, 6 Sep 2019 21:06:12 +0200 (CEST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by dpdk.org (Postfix) with ESMTP id 6EE411BEAE for ; Fri, 6 Sep 2019 21:06:03 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id EB6381576; Fri, 6 Sep 2019 12:06:02 -0700 (PDT) Received: from qc2400f-1.austin.arm.com (qc2400f-1.austin.arm.com [10.118.12.34]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DAA2C3F59C; Fri, 6 Sep 2019 12:06:02 -0700 (PDT) From: Honnappa Nagarahalli To: olivier.matz@6wind.com, yipeng1.wang@intel.com, sameh.gobriel@intel.com, bruce.richardson@intel.com, pablo.de.lara.guarch@intel.com Cc: dev@dpdk.org, pbhagavatula@marvell.com, jerinj@marvell.com, Honnappa Nagarahalli Date: Fri, 6 Sep 2019 14:05:10 -0500 Message-Id: <20190906190510.11146-7-honnappa.nagarahalli@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190906190510.11146-1-honnappa.nagarahalli@arm.com> References: <20190828144614.25284-1-honnappa.nagarahalli@arm.com> <20190906190510.11146-1-honnappa.nagarahalli@arm.com> Subject: [dpdk-dev] [PATCH v2 6/6] lib/eventdev: use ring templates for event rings X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Use rte_ring templates to define ring APIs for 128b ring element type. However, the generic 128b ring APIs are not defined. Doing so, results in changes to 'struct rte_event' which results in API changes. Suggested-by: Jerin Jacob Kollanukkaran Suggested-by: Pavan Nikhilesh Bhagavatula Signed-off-by: Honnappa Nagarahalli Reviewed-by: Gavin Hu --- lib/librte_eventdev/Makefile | 2 + lib/librte_eventdev/meson.build | 2 + lib/librte_eventdev/rte_event_ring.c | 146 +--------------------- lib/librte_eventdev/rte_event_ring.h | 41 +----- lib/librte_eventdev/rte_event_ring_128b.c | 19 +++ lib/librte_eventdev/rte_event_ring_128b.h | 44 +++++++ 6 files changed, 78 insertions(+), 176 deletions(-) create mode 100644 lib/librte_eventdev/rte_event_ring_128b.c create mode 100644 lib/librte_eventdev/rte_event_ring_128b.h -- 2.17.1 diff --git a/lib/librte_eventdev/Makefile b/lib/librte_eventdev/Makefile index cd3ff8040..4c76bbdf3 100644 --- a/lib/librte_eventdev/Makefile +++ b/lib/librte_eventdev/Makefile @@ -24,6 +24,7 @@ LDLIBS += -lrte_mbuf -lrte_cryptodev -lpthread # library source files SRCS-y += rte_eventdev.c +SRCS-y += rte_event_ring_128b.c SRCS-y += rte_event_ring.c SRCS-y += rte_event_eth_rx_adapter.c SRCS-y += rte_event_timer_adapter.c @@ -35,6 +36,7 @@ SYMLINK-y-include += rte_eventdev.h SYMLINK-y-include += rte_eventdev_pmd.h SYMLINK-y-include += rte_eventdev_pmd_pci.h SYMLINK-y-include += rte_eventdev_pmd_vdev.h +SYMLINK-y-include += rte_event_ring_128b.h SYMLINK-y-include += rte_event_ring.h SYMLINK-y-include += rte_event_eth_rx_adapter.h SYMLINK-y-include += rte_event_timer_adapter.h diff --git a/lib/librte_eventdev/meson.build b/lib/librte_eventdev/meson.build index 19541f23f..8a0fd7332 100644 --- a/lib/librte_eventdev/meson.build +++ b/lib/librte_eventdev/meson.build @@ -11,6 +11,7 @@ else endif sources = files('rte_eventdev.c', + 'rte_event_ring_128b.c', 'rte_event_ring.c', 'rte_event_eth_rx_adapter.c', 'rte_event_timer_adapter.c', @@ -20,6 +21,7 @@ headers = files('rte_eventdev.h', 'rte_eventdev_pmd.h', 'rte_eventdev_pmd_pci.h', 'rte_eventdev_pmd_vdev.h', + 'rte_event_ring_128b.h', 'rte_event_ring.h', 'rte_event_eth_rx_adapter.h', 'rte_event_timer_adapter.h', diff --git a/lib/librte_eventdev/rte_event_ring.c b/lib/librte_eventdev/rte_event_ring.c index 50190de01..479db53ea 100644 --- a/lib/librte_eventdev/rte_event_ring.c +++ b/lib/librte_eventdev/rte_event_ring.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2017 Intel Corporation + * Copyright(c) 2019 Arm Limited */ #include @@ -11,13 +12,6 @@ #include #include "rte_event_ring.h" -TAILQ_HEAD(rte_event_ring_list, rte_tailq_entry); - -static struct rte_tailq_elem rte_event_ring_tailq = { - .name = RTE_TAILQ_EVENT_RING_NAME, -}; -EAL_REGISTER_TAILQ(rte_event_ring_tailq) - int rte_event_ring_init(struct rte_event_ring *r, const char *name, unsigned int count, unsigned int flags) @@ -35,150 +29,20 @@ struct rte_event_ring * rte_event_ring_create(const char *name, unsigned int count, int socket_id, unsigned int flags) { - char mz_name[RTE_MEMZONE_NAMESIZE]; - struct rte_event_ring *r; - struct rte_tailq_entry *te; - const struct rte_memzone *mz; - ssize_t ring_size; - int mz_flags = 0; - struct rte_event_ring_list *ring_list = NULL; - const unsigned int requested_count = count; - int ret; - - ring_list = RTE_TAILQ_CAST(rte_event_ring_tailq.head, - rte_event_ring_list); - - /* for an exact size ring, round up from count to a power of two */ - if (flags & RING_F_EXACT_SZ) - count = rte_align32pow2(count + 1); - else if (!rte_is_power_of_2(count)) { - rte_errno = EINVAL; - return NULL; - } - - ring_size = sizeof(*r) + (count * sizeof(struct rte_event)); - - ret = snprintf(mz_name, sizeof(mz_name), "%s%s", - RTE_RING_MZ_PREFIX, name); - if (ret < 0 || ret >= (int)sizeof(mz_name)) { - rte_errno = ENAMETOOLONG; - return NULL; - } - - te = rte_zmalloc("RING_TAILQ_ENTRY", sizeof(*te), 0); - if (te == NULL) { - RTE_LOG(ERR, RING, "Cannot reserve memory for tailq\n"); - rte_errno = ENOMEM; - return NULL; - } - - rte_mcfg_tailq_write_lock(); - - /* - * reserve a memory zone for this ring. If we can't get rte_config or - * we are secondary process, the memzone_reserve function will set - * rte_errno for us appropriately - hence no check in this this function - */ - mz = rte_memzone_reserve(mz_name, ring_size, socket_id, mz_flags); - if (mz != NULL) { - r = mz->addr; - /* Check return value in case rte_ring_init() fails on size */ - int err = rte_event_ring_init(r, name, requested_count, flags); - if (err) { - RTE_LOG(ERR, RING, "Ring init failed\n"); - if (rte_memzone_free(mz) != 0) - RTE_LOG(ERR, RING, "Cannot free memzone\n"); - rte_free(te); - rte_mcfg_tailq_write_unlock(); - return NULL; - } - - te->data = (void *) r; - r->r.memzone = mz; - - TAILQ_INSERT_TAIL(ring_list, te, next); - } else { - r = NULL; - RTE_LOG(ERR, RING, "Cannot reserve memory\n"); - rte_free(te); - } - rte_mcfg_tailq_write_unlock(); - - return r; + return (struct rte_event_ring *)rte_ring_create_event_128b(name, count, + socket_id, flags); } struct rte_event_ring * rte_event_ring_lookup(const char *name) { - struct rte_tailq_entry *te; - struct rte_event_ring *r = NULL; - struct rte_event_ring_list *ring_list; - - ring_list = RTE_TAILQ_CAST(rte_event_ring_tailq.head, - rte_event_ring_list); - - rte_mcfg_tailq_read_lock(); - - TAILQ_FOREACH(te, ring_list, next) { - r = (struct rte_event_ring *) te->data; - if (strncmp(name, r->r.name, RTE_RING_NAMESIZE) == 0) - break; - } - - rte_mcfg_tailq_read_unlock(); - - if (te == NULL) { - rte_errno = ENOENT; - return NULL; - } - - return r; + return (struct rte_event_ring *)rte_ring_lookup(name); } /* free the ring */ void rte_event_ring_free(struct rte_event_ring *r) { - struct rte_event_ring_list *ring_list = NULL; - struct rte_tailq_entry *te; - - if (r == NULL) - return; - - /* - * Ring was not created with rte_event_ring_create, - * therefore, there is no memzone to free. - */ - if (r->r.memzone == NULL) { - RTE_LOG(ERR, RING, - "Cannot free ring (not created with rte_event_ring_create()"); - return; - } - - if (rte_memzone_free(r->r.memzone) != 0) { - RTE_LOG(ERR, RING, "Cannot free memory\n"); - return; - } - - ring_list = RTE_TAILQ_CAST(rte_event_ring_tailq.head, - rte_event_ring_list); - rte_mcfg_tailq_write_lock(); - - /* find out tailq entry */ - TAILQ_FOREACH(te, ring_list, next) { - if (te->data == (void *) r) - break; - } - - if (te == NULL) { - rte_mcfg_tailq_write_unlock(); - return; - } - - TAILQ_REMOVE(ring_list, te, next); - - rte_mcfg_tailq_write_unlock(); - - rte_free(te); + rte_ring_free(&r->r); } diff --git a/lib/librte_eventdev/rte_event_ring.h b/lib/librte_eventdev/rte_event_ring.h index 827a3209e..4553c0076 100644 --- a/lib/librte_eventdev/rte_event_ring.h +++ b/lib/librte_eventdev/rte_event_ring.h @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2016-2017 Intel Corporation + * Copyright(c) 2019 Arm Limited */ /** @@ -20,8 +21,7 @@ #include #include #include "rte_eventdev.h" - -#define RTE_TAILQ_EVENT_RING_NAME "RTE_EVENT_RING" +#include "rte_event_ring_128b.h" /** * Generic ring structure for passing rte_event objects from core to core. @@ -88,22 +88,8 @@ rte_event_ring_enqueue_burst(struct rte_event_ring *r, const struct rte_event *events, unsigned int n, uint16_t *free_space) { - uint32_t prod_head, prod_next; - uint32_t free_entries; - - n = __rte_ring_move_prod_head(&r->r, r->r.prod.single, n, - RTE_RING_QUEUE_VARIABLE, - &prod_head, &prod_next, &free_entries); - if (n == 0) - goto end; - - ENQUEUE_PTRS(&r->r, &r[1], prod_head, events, n, struct rte_event); - - update_tail(&r->r.prod, prod_head, prod_next, r->r.prod.single, 1); -end: - if (free_space != NULL) - *free_space = free_entries - n; - return n; + return rte_ring_enqueue_burst_event_128b(&r->r, events, n, + (uint32_t *)free_space); } /** @@ -129,23 +115,8 @@ rte_event_ring_dequeue_burst(struct rte_event_ring *r, struct rte_event *events, unsigned int n, uint16_t *available) { - uint32_t cons_head, cons_next; - uint32_t entries; - - n = __rte_ring_move_cons_head(&r->r, r->r.cons.single, n, - RTE_RING_QUEUE_VARIABLE, - &cons_head, &cons_next, &entries); - if (n == 0) - goto end; - - DEQUEUE_PTRS(&r->r, &r[1], cons_head, events, n, struct rte_event); - - update_tail(&r->r.cons, cons_head, cons_next, r->r.cons.single, 0); - -end: - if (available != NULL) - *available = entries - n; - return n; + return rte_ring_dequeue_burst_event_128b(&r->r, events, n, + (uint32_t *)available); } /* diff --git a/lib/librte_eventdev/rte_event_ring_128b.c b/lib/librte_eventdev/rte_event_ring_128b.c new file mode 100644 index 000000000..5e4105a2f --- /dev/null +++ b/lib/librte_eventdev/rte_event_ring_128b.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2019 Arm Limited + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include diff --git a/lib/librte_eventdev/rte_event_ring_128b.h b/lib/librte_eventdev/rte_event_ring_128b.h new file mode 100644 index 000000000..3079d7b49 --- /dev/null +++ b/lib/librte_eventdev/rte_event_ring_128b.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2019 Arm Limited + */ + +#ifndef _RTE_EVENT_RING_128_H_ +#define _RTE_EVENT_RING_128_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "rte_eventdev.h" + +/* Event ring will use its own template. Otherwise, the 'struct rte_event' + * needs to change to 'union rte_event' to include a standard 128b data type + * such as __int128_t which results in API changes. + * + * The RTE_RING_TMPLT_API_SUFFIX cannot be just '128b' as that will be + * used for standard 128b element type APIs defined by the rte_ring library. + */ +#define RTE_RING_TMPLT_API_SUFFIX event_128b +#define RTE_RING_TMPLT_ELEM_SIZE sizeof(struct rte_event) +#define RTE_RING_TMPLT_ELEM_TYPE struct rte_event +#define RTE_RING_TMPLT_EXPERIMENTAL + +#include + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_EVENT_RING_128_H_ */