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 D02CDA052A; Fri, 10 Jul 2020 18:21:39 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3A7DA1D9A4; Fri, 10 Jul 2020 18:21:39 +0200 (CEST) Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by dpdk.org (Postfix) with ESMTP id 0DD081D9A0 for ; Fri, 10 Jul 2020 18:21:36 +0200 (CEST) IronPort-SDR: 9j/YvsA40ESqH5Tp/bnzJY+kUnZGrt61MtxyZcLO5awirHd4hE+e6DspVlU+Y5kG4xZybtQmN1 OdZrn2MNSAQg== X-IronPort-AV: E=McAfee;i="6000,8403,9678"; a="135704528" X-IronPort-AV: E=Sophos;i="5.75,336,1589266800"; d="scan'208";a="135704528" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jul 2020 09:21:35 -0700 IronPort-SDR: AWHT2TlIsIlVCNsKd7b1OyabGE2h0K+c6ixNnHXboQOIc0hGH8V1eyG6ja80GtRleP4ufh7keL Zf9WiZ6priuQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.75,336,1589266800"; d="scan'208";a="280697710" Received: from sivswdev08.ir.intel.com ([10.237.217.47]) by orsmga003.jf.intel.com with ESMTP; 10 Jul 2020 09:21:34 -0700 From: Konstantin Ananyev To: dev@dpdk.org Cc: olivier.matz@6wind.com, arybchenko@solarflare.com, jielong.zjl@antfin.com, gage.eads@intel.com, Konstantin Ananyev Date: Fri, 10 Jul 2020 17:21:19 +0100 Message-Id: <20200710162119.27653-1-konstantin.ananyev@intel.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20200629161024.29059-1-konstantin.ananyev@intel.com> References: <20200629161024.29059-1-konstantin.ananyev@intel.com> Subject: [dpdk-dev] [PATCH v3] mempool/ring: add support for new ring sync modes 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" Two new sync modes were introduced into rte_ring: relaxed tail sync (RTS) and head/tail sync (HTS). This change provides user with ability to select these modes for ring based mempool via mempool ops API. Signed-off-by: Konstantin Ananyev Acked-by: Gage Eads --- v3: silently ignore F_SP_PUT/F_SC_GET (Olivier comment) v2: update Release Notes (as per comments) doc/guides/rel_notes/release_20_08.rst | 6 ++ drivers/mempool/ring/rte_mempool_ring.c | 88 ++++++++++++++++++++++--- 2 files changed, 85 insertions(+), 9 deletions(-) diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst index 17d70e7c1..fff819fca 100644 --- a/doc/guides/rel_notes/release_20_08.rst +++ b/doc/guides/rel_notes/release_20_08.rst @@ -171,6 +171,12 @@ New Features See the :doc:`../sample_app_ug/l2_forward_real_virtual` for more details of this parameter usage. +* **Added support for new sync modes into mempool ring driver.** + + Added ability to select new ring synchronisation modes: + ``relaxed tail sync (ring_mt_rts)`` and ``head/tail sync (ring_mt_hts)`` + via mempool ops API. + Removed Items ------------- diff --git a/drivers/mempool/ring/rte_mempool_ring.c b/drivers/mempool/ring/rte_mempool_ring.c index bc123fc52..b1f09ff28 100644 --- a/drivers/mempool/ring/rte_mempool_ring.c +++ b/drivers/mempool/ring/rte_mempool_ring.c @@ -25,6 +25,22 @@ common_ring_sp_enqueue(struct rte_mempool *mp, void * const *obj_table, obj_table, n, NULL) == 0 ? -ENOBUFS : 0; } +static int +rts_ring_mp_enqueue(struct rte_mempool *mp, void * const *obj_table, + unsigned int n) +{ + return rte_ring_mp_rts_enqueue_bulk(mp->pool_data, + obj_table, n, NULL) == 0 ? -ENOBUFS : 0; +} + +static int +hts_ring_mp_enqueue(struct rte_mempool *mp, void * const *obj_table, + unsigned int n) +{ + return rte_ring_mp_hts_enqueue_bulk(mp->pool_data, + obj_table, n, NULL) == 0 ? -ENOBUFS : 0; +} + static int common_ring_mc_dequeue(struct rte_mempool *mp, void **obj_table, unsigned n) { @@ -39,17 +55,30 @@ common_ring_sc_dequeue(struct rte_mempool *mp, void **obj_table, unsigned n) obj_table, n, NULL) == 0 ? -ENOBUFS : 0; } +static int +rts_ring_mc_dequeue(struct rte_mempool *mp, void **obj_table, unsigned int n) +{ + return rte_ring_mc_rts_dequeue_bulk(mp->pool_data, + obj_table, n, NULL) == 0 ? -ENOBUFS : 0; +} + +static int +hts_ring_mc_dequeue(struct rte_mempool *mp, void **obj_table, unsigned int n) +{ + return rte_ring_mc_hts_dequeue_bulk(mp->pool_data, + obj_table, n, NULL) == 0 ? -ENOBUFS : 0; +} + static unsigned common_ring_get_count(const struct rte_mempool *mp) { return rte_ring_count(mp->pool_data); } - static int -common_ring_alloc(struct rte_mempool *mp) +ring_alloc(struct rte_mempool *mp, uint32_t rg_flags) { - int rg_flags = 0, ret; + int ret; char rg_name[RTE_RING_NAMESIZE]; struct rte_ring *r; @@ -60,12 +89,6 @@ common_ring_alloc(struct rte_mempool *mp) return -rte_errno; } - /* ring flags */ - if (mp->flags & MEMPOOL_F_SP_PUT) - rg_flags |= RING_F_SP_ENQ; - if (mp->flags & MEMPOOL_F_SC_GET) - rg_flags |= RING_F_SC_DEQ; - /* * Allocate the ring that will be used to store objects. * Ring functions will return appropriate errors if we are @@ -82,6 +105,31 @@ common_ring_alloc(struct rte_mempool *mp) return 0; } +static int +common_ring_alloc(struct rte_mempool *mp) +{ + uint32_t rg_flags = 0; + + if (mp->flags & MEMPOOL_F_SP_PUT) + rg_flags |= RING_F_SP_ENQ; + if (mp->flags & MEMPOOL_F_SC_GET) + rg_flags |= RING_F_SC_DEQ; + + return ring_alloc(mp, rg_flags); +} + +static int +rts_ring_alloc(struct rte_mempool *mp) +{ + return ring_alloc(mp, RING_F_MP_RTS_ENQ | RING_F_MC_RTS_DEQ); +} + +static int +hts_ring_alloc(struct rte_mempool *mp) +{ + return ring_alloc(mp, RING_F_MP_HTS_ENQ | RING_F_MC_HTS_DEQ); +} + static void common_ring_free(struct rte_mempool *mp) { @@ -130,7 +178,29 @@ static const struct rte_mempool_ops ops_sp_mc = { .get_count = common_ring_get_count, }; +/* ops for mempool with ring in MT_RTS sync mode */ +static const struct rte_mempool_ops ops_mt_rts = { + .name = "ring_mt_rts", + .alloc = rts_ring_alloc, + .free = common_ring_free, + .enqueue = rts_ring_mp_enqueue, + .dequeue = rts_ring_mc_dequeue, + .get_count = common_ring_get_count, +}; + +/* ops for mempool with ring in MT_HTS sync mode */ +static const struct rte_mempool_ops ops_mt_hts = { + .name = "ring_mt_hts", + .alloc = hts_ring_alloc, + .free = common_ring_free, + .enqueue = hts_ring_mp_enqueue, + .dequeue = hts_ring_mc_dequeue, + .get_count = common_ring_get_count, +}; + MEMPOOL_REGISTER_OPS(ops_mp_mc); MEMPOOL_REGISTER_OPS(ops_sp_sc); MEMPOOL_REGISTER_OPS(ops_mp_sc); MEMPOOL_REGISTER_OPS(ops_sp_mc); +MEMPOOL_REGISTER_OPS(ops_mt_rts); +MEMPOOL_REGISTER_OPS(ops_mt_hts); -- 2.17.1