[v3] mempool/ring: add support for new ring sync modes
Checks
Commit Message
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
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.
> 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.
>
>
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.
@@ -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
-------------
@@ -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);