From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 533E1A2EDB for ; Fri, 6 Sep 2019 21:05:32 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8B8C01F40E; Fri, 6 Sep 2019 21:05:30 +0200 (CEST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by dpdk.org (Postfix) with ESMTP id 32D611F3ED for ; Fri, 6 Sep 2019 21:05:29 +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 78DAA28; Fri, 6 Sep 2019 12:05:28 -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 6DF403F59C; Fri, 6 Sep 2019 12:05:28 -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:04 -0500 Message-Id: <20190906190510.11146-1-honnappa.nagarahalli@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190828144614.25284-1-honnappa.nagarahalli@arm.com> References: <20190828144614.25284-1-honnappa.nagarahalli@arm.com> Subject: [dpdk-dev] [PATCH v2 0/6] lib/ring: templates to support custom element size 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" The current rte_ring hard-codes the type of the ring element to 'void *', hence the size of the element is hard-coded to 32b/64b. Since the ring element type is not an input to rte_ring APIs, it results in couple of issues: 1) If an application requires to store an element which is not 64b, it needs to write its own ring APIs similar to rte_event_ring APIs. This creates additional burden on the programmers, who end up making work-arounds and often waste memory. 2) If there are multiple libraries that store elements of the same type, currently they would have to write their own rte_ring APIs. This results in code duplication. This patch consists of several parts: 1) New APIs to support configurable ring element size These will help reduce code duplication in the templates. I think these can be made internal (do not expose to DPDK applications, but expose to DPDK libraries), feedback needed. 2) rte_ring templates The templates provide an easy way to add new APIs for different ring element types/sizes which can be used by multiple libraries. These also allow for creating APIs to store elements of custom types (for ex: a structure) The template needs 4 parameters: a) RTE_RING_TMPLT_API_SUFFIX - This is used as a suffix to the rte_ring APIs. For ex: if RTE_RING_TMPLT_API_SUFFIX is '32b', the API name will be rte_ring_create_32b b) RTE_RING_TMPLT_ELEM_SIZE - Size of the ring element in bytes. For ex: sizeof(uint32_t) c) RTE_RING_TMPLT_ELEM_TYPE - Type of the ring element. For ex: uint32_t. If a common ring library does not use a standard data type, it should create its own type by defining a structure with standard data type. For ex: for an elment size of 96b, one could define a structure struct s_96b { uint32_t a[3]; } The common library can use this structure to define RTE_RING_TMPLT_ELEM_TYPE. The application using this common ring library should define its element type as a union with the above structure. union app_element_type { struct s_96b v; struct app_element { uint16_t a; uint16_t b; uint32_t c; uint32_t d; } } d) RTE_RING_TMPLT_EXPERIMENTAL - Indicates if the new APIs being defined are experimental. Should be set to empty to remove the experimental tag. The ring library consists of some APIs that are defined as inline functions and some APIs that are non-inline functions. The non-inline functions are in rte_ring_template.c. However, this file needs to be included in other .c files. Any feedback on how to handle this is appreciated. Note that the templates help create the APIs that are dependent on the element size (for ex: rte_ring_create, enqueue/dequeue etc). Other APIs that do NOT depend on the element size do not need to be part of the template (for ex: rte_ring_dump, rte_ring_count, rte_ring_free_count etc). 3) APIs for 32b ring element size This uses the templates to create APIs to enqueue/dequeue elements of size 32b. 4) rte_hash libray is changed to use 32b ring APIs The 32b APIs are used in rte_hash library to store the free slot index and free bucket index. 5) Event Dev changed to use ring templates Event Dev defines its own 128b ring APIs using the templates. This helps in keeping the 'struct rte_event' as is. If Event Dev has to use generic 128b ring APIs, it requires 'struct rte_event' to change to 'union rte_event' to include a generic data type such as '__int128_t'. This breaks the API compatibility and results in large number of changes. With this change, the event rings are stored on rte_ring's tailq. Event Dev specific ring list is NOT available. IMO, this does not have any impact to the user. This patch results in following checkpatch issue: WARNING:UNSPECIFIED_INT: Prefer 'unsigned int' to bare use of 'unsigned' However, this patch is following the rules in the existing code. Please let me know if this needs to be fixed. v2 - Change Event Ring implementation to use ring templates (Jerin, Pavan) Honnappa Nagarahalli (6): lib/ring: apis to support configurable element size lib/ring: add template to support different element sizes tools/checkpatch: relax constraints on __rte_experimental lib/ring: add ring APIs to support 32b ring elements lib/hash: use ring with 32b element size to save memory lib/eventdev: use ring templates for event rings devtools/checkpatches.sh | 11 +- 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 +++ lib/librte_hash/rte_cuckoo_hash.c | 55 ++-- lib/librte_hash/rte_cuckoo_hash.h | 2 +- lib/librte_ring/Makefile | 9 +- lib/librte_ring/meson.build | 11 +- lib/librte_ring/rte_ring.c | 34 ++- lib/librte_ring/rte_ring.h | 72 +++++ lib/librte_ring/rte_ring_32.c | 19 ++ lib/librte_ring/rte_ring_32.h | 36 +++ lib/librte_ring/rte_ring_template.c | 46 +++ lib/librte_ring/rte_ring_template.h | 330 ++++++++++++++++++++++ lib/librte_ring/rte_ring_version.map | 4 + 18 files changed, 660 insertions(+), 223 deletions(-) create mode 100644 lib/librte_eventdev/rte_event_ring_128b.c create mode 100644 lib/librte_eventdev/rte_event_ring_128b.h create mode 100644 lib/librte_ring/rte_ring_32.c create mode 100644 lib/librte_ring/rte_ring_32.h create mode 100644 lib/librte_ring/rte_ring_template.c create mode 100644 lib/librte_ring/rte_ring_template.h -- 2.17.1