From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D73A745B01; Tue, 15 Oct 2024 15:01:23 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B228A400D7; Tue, 15 Oct 2024 15:01:23 +0200 (CEST) Received: from forward500b.mail.yandex.net (forward500b.mail.yandex.net [178.154.239.144]) by mails.dpdk.org (Postfix) with ESMTP id 77867400D6 for ; Tue, 15 Oct 2024 15:01:22 +0200 (CEST) Received: from mail-nwsmtp-smtp-production-main-84.iva.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-84.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:9519:0:640:299f:0]) by forward500b.mail.yandex.net (Yandex) with ESMTPS id C027561662; Tue, 15 Oct 2024 16:01:21 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-84.iva.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id C1LmJKRThCg0-FpdjzJU8; Tue, 15 Oct 2024 16:01:20 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1728997280; bh=2drFWSd9CJ2pULW4b8zbaK8DlM8GXUzpvcxmBQpbST4=; h=Cc:Message-Id:References:Date:In-Reply-To:Subject:To:From; b=JpI51ti3jLaQo+fjv1mB53u8FH2Hyy1WhfVKd/pQRcnGNeE/XrOjxVqCxCTIKrL6u 71O+C34MSVt0yqRhWsj7wCk4fgpPlGaH+T4H2NNsGpfzHNZbj1/1fYNbBWtJvURlTX +VkPyjalrxgmKV+dVx4lA6/qtPPhdGTwt3TJ2NGE= Authentication-Results: mail-nwsmtp-smtp-production-main-84.iva.yp-c.yandex.net; dkim=pass header.i=@yandex.ru From: Konstantin Ananyev To: dev@dpdk.org Cc: honnappa.nagarahalli@arm.com, jerinj@marvell.com, hemant.agrawal@nxp.com, bruce.richardson@intel.com, drc@linux.vnet.ibm.com, ruifeng.wang@arm.com, mb@smartsharesystems.com, eimear.morrissey@huawei.com, stephen@networkplumber.org, Konstantin Ananyev Subject: [PATCH v5 0/6] Stage-Ordered API and other extensions for ring library Date: Tue, 15 Oct 2024 14:01:05 +0100 Message-Id: <20241015130111.826-1-konstantin.v.ananyev@yandex.ru> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240917120946.1212-1-konstantin.v.ananyev@yandex.ru> References: <20240917120946.1212-1-konstantin.v.ananyev@yandex.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Yandex-Filter: 1 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Konstantin Ananyev NOTE UPFRONT: this version is still not ready for merging. Missing items: - ARM/PPC tests passing - PG update v4 -> v5 - fix public API/doc comments from Jerin - update devtools/build-dict.sh (Stephen) - fix MSVC warnings - introduce new test-suite for meson (stress) with ring_stress_autotest and soring_stress_autotest in it - enhance error report in tests - reorder some sync code in soring and add extra checks (for better debuggability) v3 -> v4: - fix compilation/doxygen complains (attempt #2) - updated release notes v2 -> v3: - fix compilation/doxygen complains - dropped patch: "examples/l3fwd: make ACL work in pipeline and eventdev modes": [2] As was mentioned in the patch desctiption it was way too big, controversial and incomplete. If the community is ok to introduce pipeline model into the l3fwd, then it is propbably worth to be a separate patch series. v1 -> v2: - rename 'elmst/objst' to 'meta' (Morten) - introduce new data-path APIs set: one with both meta{} and objs[], second with just objs[] (Morten) - split data-path APIs into burst/bulk flavours (same as rte_ring) - added dump function for te_soring and improved dump() for rte_ring. - dropped patch: " ring: minimize reads of the counterpart cache-line" - no performance gain observed - actually it does change behavior of conventional rte_ring enqueue/dequeue APIs - it could return available/free less then actually exist in the ring. As in some other libs we reliy on that information - it will introduce problems. The main aim of these series is to extend ring library with new API that allows user to create/use Staged-Ordered-Ring (SORING) abstraction. In addition to that there are few other patches that serve different purposes: - first two patches are just code reordering to de-duplicate and generalize existing rte_ring code. - patch #3 extends rte_ring_dump() to correctly print head/tail metadata for different sync modes. - next two patches introduce SORING API into the ring library and provide UT for it. SORING overview =============== Staged-Ordered-Ring (SORING) provides a SW abstraction for 'ordered' queues with multiple processing 'stages'. It is based on conventional DPDK rte_ring, re-uses many of its concepts, and even substantial part of its code. It can be viewed as an 'extension' of rte_ring functionality. In particular, main SORING properties: - circular ring buffer with fixed size objects - producer, consumer plus multiple processing stages in between. - allows to split objects processing into multiple stages. - objects remain in the same ring while moving from one stage to the other, initial order is preserved, no extra copying needed. - preserves the ingress order of objects within the queue across multiple stages - each stage (and producer/consumer) can be served by single and/or multiple threads. - number of stages, size and number of objects in the ring are configurable at ring initialization time. Data-path API provides four main operations: - enqueue/dequeue works in the same manner as for conventional rte_ring, all rte_ring synchronization types are supported. - acquire/release - for each stage there is an acquire (start) and release (finish) operation. After some objects are 'acquired' - given thread can safely assume that it has exclusive ownership of these objects till it will invoke 'release' for them. After 'release', objects can be 'acquired' by next stage and/or dequeued by the consumer (in case of last stage). Expected use-case: applications that uses pipeline model (probably with multiple stages) for packet processing, when preserving incoming packet order is important. The concept of ‘ring with stages’ is similar to DPDK OPDL eventdev PMD [1], but the internals are different. In particular, SORING maintains internal array of 'states' for each element in the ring that is shared by all threads/processes that access the ring. That allows 'release' to avoid excessive waits on the tail value and helps to improve performancei and scalability. In terms of performance, with our measurements rte_soring and conventional rte_ring provide nearly identical numbers. As an example, on our SUT: Intel ICX CPU @ 2.00GHz, l3fwd (--lookup=acl) in pipeline mode [2] both rte_ring and rte_soring reach ~20Mpps for single I/O lcore and same number of worker lcores. [1] https://www.dpdk.org/wp-content/uploads/sites/35/2018/06/DPDK-China2017-Ma-OPDL.pdf [2] https://patchwork.dpdk.org/project/dpdk/patch/20240906131348.804-7-konstantin.v.ananyev@yandex.ru/ Eimear Morrissey (1): ring: make dump function more verbose Konstantin Ananyev (5): ring: common functions for 'move head' ops ring: make copying functions generic ring/soring: introduce Staged Ordered Ring app/test: add unit tests for soring API test: add stress test suite .mailmap | 1 + app/test/meson.build | 3 + app/test/suites/meson.build | 10 + app/test/test.h | 1 + app/test/test_ring_stress.c | 2 +- app/test/test_ring_stress_impl.h | 1 + app/test/test_soring.c | 442 +++++++++++++ app/test/test_soring_mt_stress.c | 40 ++ app/test/test_soring_stress.c | 48 ++ app/test/test_soring_stress.h | 35 ++ app/test/test_soring_stress_impl.h | 834 +++++++++++++++++++++++++ devtools/build-dict.sh | 1 + doc/api/doxy-api-index.md | 1 + doc/guides/rel_notes/release_24_11.rst | 8 + lib/ring/meson.build | 4 +- lib/ring/rte_ring.c | 87 ++- lib/ring/rte_ring.h | 15 + lib/ring/rte_ring_c11_pvt.h | 134 +--- lib/ring/rte_ring_elem_pvt.h | 181 ++++-- lib/ring/rte_ring_generic_pvt.h | 121 +--- lib/ring/rte_ring_hts_elem_pvt.h | 85 +-- lib/ring/rte_ring_rts_elem_pvt.h | 85 +-- lib/ring/rte_soring.c | 182 ++++++ lib/ring/rte_soring.h | 555 ++++++++++++++++ lib/ring/soring.c | 561 +++++++++++++++++ lib/ring/soring.h | 124 ++++ lib/ring/version.map | 26 + 27 files changed, 3190 insertions(+), 397 deletions(-) create mode 100644 app/test/test_soring.c create mode 100644 app/test/test_soring_mt_stress.c create mode 100644 app/test/test_soring_stress.c create mode 100644 app/test/test_soring_stress.h create mode 100644 app/test/test_soring_stress_impl.h create mode 100644 lib/ring/rte_soring.c create mode 100644 lib/ring/rte_soring.h create mode 100644 lib/ring/soring.c create mode 100644 lib/ring/soring.h -- 2.35.3