[v3] mempool/ring: add support for new ring sync modes

Message ID 20200710162119.27653-1-konstantin.ananyev@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series [v3] mempool/ring: add support for new ring sync modes |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Performance-Testing fail build patch failure
ci/travis-robot success Travis build: passed
ci/Intel-compilation success Compilation OK
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-testing success Testing PASS

Commit Message

Ananyev, Konstantin July 10, 2020, 4:21 p.m. UTC
  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 <konstantin.ananyev@intel.com>
Acked-by: Gage Eads <gage.eads@intel.com>
---

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(-)
  

Comments

Thomas Monjalon July 10, 2020, 10:44 p.m. UTC | #1
10/07/2020 18:21, Konstantin Ananyev:
> 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.

No, the user cannot use these modes because there is no doc,
except in release notes.

Sorry I don't understand why I have to do such obvious comment
after so many years.
And more importantly, why nobody else asked for doc?

I think I will add "UNMAINTAINED" for doc in MAINTAINERS file.
If nobody is interested in doc maintenance, we could "git rm doc/".

Sorry in advance for hijacking this thread.

[...]
> --- 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.

Please check the comment on top of new features about the ordering.
Mempool features should be mentioned earlier in the list.
  
Ananyev, Konstantin July 13, 2020, 12:58 p.m. UTC | #2
> 10/07/2020 18:21, Konstantin Ananyev:
> > 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.
> 
> No, the user cannot use these modes because there is no doc,
> except in release notes.

AFAIK, there is no section for rte_ring and others SW based 
mempool drivers:
https://doc.dpdk.org/guides/mempool/index.html
Are you asking me to add such section as part of this patch?
 
> 
> Sorry I don't understand why I have to do such obvious comment
> after so many years.
> And more importantly, why nobody else asked for doc?
> 
> I think I will add "UNMAINTAINED" for doc in MAINTAINERS file.
> If nobody is interested in doc maintenance, we could "git rm doc/".
> 
> Sorry in advance for hijacking this thread.
> 
> [...]
> > --- 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.
> 
> Please check the comment on top of new features about the ordering.
> Mempool features should be mentioned earlier in the list.
> 
>
  
Thomas Monjalon July 13, 2020, 1:57 p.m. UTC | #3
13/07/2020 14:58, Ananyev, Konstantin:
> > 10/07/2020 18:21, Konstantin Ananyev:
> > > 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.
> > 
> > No, the user cannot use these modes because there is no doc,
> > except in release notes.
> 
> AFAIK, there is no section for rte_ring and others SW based 
> mempool drivers:
> https://doc.dpdk.org/guides/mempool/index.html
> Are you asking me to add such section as part of this patch?

I'm asking to provide some documentation to the users yes.

It can be in doc you pointed above with a link from the prog guide:
https://doc.dpdk.org/guides/prog_guide/mempool_lib.html#mempool-handlers

And because it is solving issues in some use cases,
it needs to be called out why and when use these options.
  

Patch

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);