DPDK-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Stephen Hemminger <stephen@networkplumber.org>
To: dev@dpdk.org
Cc: Stephen Hemminger <stephen@networkplumber.org>,
	Konstantin Ananyev <konstantin.ananyev@huawei.com>,
	Wathsala Vithanage <wathsala.vithanage@arm.com>
Subject: [PATCH 13/20] ring: promote soring API to stable
Date: Wed,  7 Oct 2026 14:39:43 -0700	[thread overview]
Message-ID: <20261007214115.3092715-14-stephen@networkplumber.org> (raw)
In-Reply-To: <20261007214115.3092715-1-stephen@networkplumber.org>

The staged ordered ring (soring) API was introduced in 25.03 and the
core enqueue, dequeue, acquire and release functions have not changed
since.

Promote those to stable. The peek API added in 26.07 is left
experimental since it is only one release old, as is the soring and
ring headtail dump debug output which may still change.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
 doc/guides/rel_notes/release_26_11.rst |  5 ++
 lib/ring/rte_soring.c                  |  4 +-
 lib/ring/rte_soring.h                  | 72 --------------------------
 lib/ring/soring.c                      | 32 ++++++------
 4 files changed, 23 insertions(+), 90 deletions(-)

diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index e9e9b1f6da..790b8943c2 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -359,6 +359,11 @@ API Changes
   ``rte_reorder_seqn``, ``rte_reorder_drain_up_to_seqn``,
   ``rte_reorder_min_seqn_set`` and ``rte_reorder_memory_footprint_get``.
 
+* ring: Promoted the staged ordered ring (soring) API from experimental
+  to stable, except the peek and dump functions.
+  The peek API added in 26.07 and the ``rte_soring_dump`` and
+  ``rte_ring_headtail_dump`` debug functions remain experimental.
+
 * telemetry: Promoted the following API from experimental to stable:
 
   * ``rte_tel_data_add_array_uint_hex``
diff --git a/lib/ring/rte_soring.c b/lib/ring/rte_soring.c
index 0d8abba69c..508de8cc74 100644
--- a/lib/ring/rte_soring.c
+++ b/lib/ring/rte_soring.c
@@ -120,7 +120,7 @@ rte_soring_dump(FILE *f, const struct rte_soring *r)
 	}
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_get_memsize, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_get_memsize)
 ssize_t
 rte_soring_get_memsize(const struct rte_soring_param *prm)
 {
@@ -154,7 +154,7 @@ soring_compilation_checks(void)
 		offsetof(struct soring_stage_headtail, unused));
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_init, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_init)
 int
 rte_soring_init(struct rte_soring *r, const struct rte_soring_param *prm)
 {
diff --git a/lib/ring/rte_soring.h b/lib/ring/rte_soring.h
index 69ada68b24..82f5c09dca 100644
--- a/lib/ring/rte_soring.h
+++ b/lib/ring/rte_soring.h
@@ -68,9 +68,6 @@ struct rte_soring_param {
 struct rte_soring;
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Calculate the memory size needed for a soring
  *
  * This function returns the number of bytes needed for a soring, given
@@ -85,14 +82,10 @@ struct rte_soring;
  *   - The memory size needed for the soring on success.
  *   - -EINVAL if provided parameter values are invalid.
  */
-__rte_experimental
 ssize_t
 rte_soring_get_memsize(const struct rte_soring_param *prm);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Initialize a soring structure.
  *
  * Initialize a soring structure in memory pointed by "r".
@@ -108,14 +101,10 @@ rte_soring_get_memsize(const struct rte_soring_param *prm);
  * @return
  *   - 0 on success, or a negative error code.
  */
-__rte_experimental
 int
 rte_soring_init(struct rte_soring *r,  const struct rte_soring_param *prm);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Return the total number of filled entries in a soring.
  *
  * @param r
@@ -123,14 +112,10 @@ rte_soring_init(struct rte_soring *r,  const struct rte_soring_param *prm);
  * @return
  *   The number of entries in the soring.
  */
-__rte_experimental
 unsigned int
 rte_soring_count(const struct rte_soring *r);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Return the total number of unfilled entries in a soring.
  *
  * @param r
@@ -138,7 +123,6 @@ rte_soring_count(const struct rte_soring *r);
  * @return
  *   The number of free entries in the soring.
  */
-__rte_experimental
 unsigned int
 rte_soring_free_count(const struct rte_soring *r);
 
@@ -158,9 +142,6 @@ void
 rte_soring_dump(FILE *f, const struct rte_soring *r);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Enqueue several objects on the soring.
  * Enqueues exactly requested number of objects or none.
  *
@@ -178,15 +159,11 @@ rte_soring_dump(FILE *f, const struct rte_soring *r);
  * @return
  *   - Actual number of objects enqueued, either 0 or n.
  */
-__rte_experimental
 uint32_t
 rte_soring_enqueue_bulk(struct rte_soring *r, const void *objs,
 	uint32_t n, uint32_t *free_space);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Enqueue several objects plus metadata on the soring.
  * Enqueues exactly requested number of objects or none.
  *
@@ -212,15 +189,11 @@ rte_soring_enqueue_bulk(struct rte_soring *r, const void *objs,
  * @return
  *   - Actual number of objects enqueued, either 0 or n.
  */
-__rte_experimental
 uint32_t
 rte_soring_enqueux_bulk(struct rte_soring *r, const void *objs,
 	const void *meta, uint32_t n, uint32_t *free_space);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Enqueue several objects on the soring.
  * Enqueues up to requested number of objects.
  *
@@ -238,15 +211,11 @@ rte_soring_enqueux_bulk(struct rte_soring *r, const void *objs,
  * @return
  *   - Actual number of objects enqueued.
  */
-__rte_experimental
 uint32_t
 rte_soring_enqueue_burst(struct rte_soring *r, const void *objs,
 	uint32_t n, uint32_t *free_space);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Enqueue several objects plus metadata on the soring.
  * Enqueues up to requested number of objects.
  *
@@ -272,15 +241,11 @@ rte_soring_enqueue_burst(struct rte_soring *r, const void *objs,
  * @return
  *   - Actual number of objects enqueued.
  */
-__rte_experimental
 uint32_t
 rte_soring_enqueux_burst(struct rte_soring *r, const void *objs,
 	const void *meta, uint32_t n, uint32_t *free_space);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Dequeue several objects from the soring.
  * Dequeues exactly requested number of objects or none.
  *
@@ -298,15 +263,11 @@ rte_soring_enqueux_burst(struct rte_soring *r, const void *objs,
  * @return
  *   - Actual number of objects dequeued, either 0 or 'num'.
  */
-__rte_experimental
 uint32_t
 rte_soring_dequeue_bulk(struct rte_soring *r, void *objs,
 	uint32_t num, uint32_t *available);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Dequeue several objects plus metadata from the soring.
  * Dequeues exactly requested number of objects or none.
  *
@@ -332,15 +293,11 @@ rte_soring_dequeue_bulk(struct rte_soring *r, void *objs,
  * @return
  *   - Actual number of objects dequeued, either 0 or 'num'.
  */
-__rte_experimental
 uint32_t
 rte_soring_dequeux_bulk(struct rte_soring *r, void *objs, void *meta,
 	uint32_t num, uint32_t *available);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Dequeue several objects from the soring.
  * Dequeues up to requested number of objects.
  *
@@ -358,15 +315,11 @@ rte_soring_dequeux_bulk(struct rte_soring *r, void *objs, void *meta,
  * @return
  *   - Actual number of objects dequeued.
  */
-__rte_experimental
 uint32_t
 rte_soring_dequeue_burst(struct rte_soring *r, void *objs,
 	uint32_t num, uint32_t *available);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Dequeue several objects plus metadata from the soring.
  * Dequeues up to requested number of objects.
  *
@@ -392,15 +345,11 @@ rte_soring_dequeue_burst(struct rte_soring *r, void *objs,
  * @return
  *   - Actual number of objects dequeued.
  */
-__rte_experimental
 uint32_t
 rte_soring_dequeux_burst(struct rte_soring *r, void *objs, void *meta,
 	uint32_t num, uint32_t *available);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Acquire several objects from the soring for given stage.
  * Acquires exactly requested number of objects or none.
  *
@@ -424,15 +373,11 @@ rte_soring_dequeux_burst(struct rte_soring *r, void *objs, void *meta,
  * @return
  *   - Actual number of objects acquired, either 0 or 'num'.
  */
-__rte_experimental
 uint32_t
 rte_soring_acquire_bulk(struct rte_soring *r, void *objs,
 	uint32_t stage, uint32_t num, uint32_t *ftoken, uint32_t *available);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Acquire several objects plus metadata from the soring for given stage.
  * Acquires exactly requested number of objects or none.
  *
@@ -464,15 +409,11 @@ rte_soring_acquire_bulk(struct rte_soring *r, void *objs,
  * @return
  *   - Actual number of objects acquired, either 0 or 'num'.
  */
-__rte_experimental
 uint32_t
 rte_soring_acquirx_bulk(struct rte_soring *r, void *objs, void *meta,
 	uint32_t stage, uint32_t num, uint32_t *ftoken, uint32_t *available);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Acquire several objects from the soring for given stage.
  * Acquires up to requested number of objects.
  *
@@ -496,15 +437,11 @@ rte_soring_acquirx_bulk(struct rte_soring *r, void *objs, void *meta,
  * @return
  *   - Actual number of objects acquired.
  */
-__rte_experimental
 uint32_t
 rte_soring_acquire_burst(struct rte_soring *r, void *objs,
 	uint32_t stage, uint32_t num, uint32_t *ftoken, uint32_t *available);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Acquire several objects plus metadata from the soring for given stage.
  * Acquires up to requested number of objects.
  *
@@ -536,15 +473,11 @@ rte_soring_acquire_burst(struct rte_soring *r, void *objs,
  * @return
  *   - Actual number of objects acquired.
  */
-__rte_experimental
 uint32_t
 rte_soring_acquirx_burst(struct rte_soring *r, void *objs, void *meta,
 	uint32_t stage, uint32_t num, uint32_t *ftoken, uint32_t *available);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Release several objects for given stage back to the soring.
  * Note that it means these objects become available for next stage or
  * dequeue.
@@ -565,15 +498,11 @@ rte_soring_acquirx_burst(struct rte_soring *r, void *objs, void *meta,
  * @param ftoken
  *   Opaque 'token' value obtained from acquire() op.
  */
-__rte_experimental
 void
 rte_soring_release(struct rte_soring *r, const void *objs,
 	uint32_t stage, uint32_t n, uint32_t ftoken);
 
 /**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
  * Release several objects plus metadata for given stage back to the soring.
  * Note that it means these objects become available for next stage or
  * dequeue.
@@ -602,7 +531,6 @@ rte_soring_release(struct rte_soring *r, const void *objs,
  * @param ftoken
  *   Opaque 'token' value obtained from acquire() op.
  */
-__rte_experimental
 void
 rte_soring_releasx(struct rte_soring *r, const void *objs,
 	const void *meta, uint32_t stage, uint32_t n, uint32_t ftoken);
diff --git a/lib/ring/soring.c b/lib/ring/soring.c
index 45292c0f78..d2f67a7b48 100644
--- a/lib/ring/soring.c
+++ b/lib/ring/soring.c
@@ -635,7 +635,7 @@ soring_release(struct rte_soring *r, const void *objs,
  * Public functions (data-path) start here.
  */
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_release, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_release)
 void
 rte_soring_release(struct rte_soring *r, const void *objs,
 	uint32_t stage, uint32_t n, uint32_t ftoken)
@@ -644,7 +644,7 @@ rte_soring_release(struct rte_soring *r, const void *objs,
 }
 
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_releasx, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_releasx)
 void
 rte_soring_releasx(struct rte_soring *r, const void *objs,
 	const void *meta, uint32_t stage, uint32_t n, uint32_t ftoken)
@@ -652,7 +652,7 @@ rte_soring_releasx(struct rte_soring *r, const void *objs,
 	soring_release(r, objs, meta, stage, n, ftoken);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_enqueue_bulk, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_enqueue_bulk)
 uint32_t
 rte_soring_enqueue_bulk(struct rte_soring *r, const void *objs, uint32_t n,
 	uint32_t *free_space)
@@ -661,7 +661,7 @@ rte_soring_enqueue_bulk(struct rte_soring *r, const void *objs, uint32_t n,
 			free_space);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_enqueux_bulk, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_enqueux_bulk)
 uint32_t
 rte_soring_enqueux_bulk(struct rte_soring *r, const void *objs,
 	const void *meta, uint32_t n, uint32_t *free_space)
@@ -670,7 +670,7 @@ rte_soring_enqueux_bulk(struct rte_soring *r, const void *objs,
 			free_space);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_enqueue_burst, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_enqueue_burst)
 uint32_t
 rte_soring_enqueue_burst(struct rte_soring *r, const void *objs, uint32_t n,
 	uint32_t *free_space)
@@ -679,7 +679,7 @@ rte_soring_enqueue_burst(struct rte_soring *r, const void *objs, uint32_t n,
 			free_space);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_enqueux_burst, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_enqueux_burst)
 uint32_t
 rte_soring_enqueux_burst(struct rte_soring *r, const void *objs,
 	const void *meta, uint32_t n, uint32_t *free_space)
@@ -688,7 +688,7 @@ rte_soring_enqueux_burst(struct rte_soring *r, const void *objs,
 			free_space);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_dequeue_bulk, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_dequeue_bulk)
 uint32_t
 rte_soring_dequeue_bulk(struct rte_soring *r, void *objs, uint32_t num,
 	uint32_t *available)
@@ -697,7 +697,7 @@ rte_soring_dequeue_bulk(struct rte_soring *r, void *objs, uint32_t num,
 			available);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_dequeux_bulk, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_dequeux_bulk)
 uint32_t
 rte_soring_dequeux_bulk(struct rte_soring *r, void *objs, void *meta,
 	uint32_t num, uint32_t *available)
@@ -706,7 +706,7 @@ rte_soring_dequeux_bulk(struct rte_soring *r, void *objs, void *meta,
 			available);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_dequeue_burst, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_dequeue_burst)
 uint32_t
 rte_soring_dequeue_burst(struct rte_soring *r, void *objs, uint32_t num,
 	uint32_t *available)
@@ -715,7 +715,7 @@ rte_soring_dequeue_burst(struct rte_soring *r, void *objs, uint32_t num,
 			available);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_dequeux_burst, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_dequeux_burst)
 uint32_t
 rte_soring_dequeux_burst(struct rte_soring *r, void *objs, void *meta,
 	uint32_t num, uint32_t *available)
@@ -724,7 +724,7 @@ rte_soring_dequeux_burst(struct rte_soring *r, void *objs, void *meta,
 			available);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_acquire_bulk, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_acquire_bulk)
 uint32_t
 rte_soring_acquire_bulk(struct rte_soring *r, void *objs,
 	uint32_t stage, uint32_t num, uint32_t *ftoken, uint32_t *available)
@@ -733,7 +733,7 @@ rte_soring_acquire_bulk(struct rte_soring *r, void *objs,
 			RTE_RING_QUEUE_FIXED, ftoken, available);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_acquirx_bulk, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_acquirx_bulk)
 uint32_t
 rte_soring_acquirx_bulk(struct rte_soring *r, void *objs, void *meta,
 	uint32_t stage, uint32_t num, uint32_t *ftoken, uint32_t *available)
@@ -742,7 +742,7 @@ rte_soring_acquirx_bulk(struct rte_soring *r, void *objs, void *meta,
 			RTE_RING_QUEUE_FIXED, ftoken, available);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_acquire_burst, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_acquire_burst)
 uint32_t
 rte_soring_acquire_burst(struct rte_soring *r, void *objs,
 	uint32_t stage, uint32_t num, uint32_t *ftoken, uint32_t *available)
@@ -751,7 +751,7 @@ rte_soring_acquire_burst(struct rte_soring *r, void *objs,
 			RTE_RING_QUEUE_VARIABLE, ftoken, available);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_acquirx_burst, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_acquirx_burst)
 uint32_t
 rte_soring_acquirx_burst(struct rte_soring *r, void *objs, void *meta,
 	uint32_t stage, uint32_t num, uint32_t *ftoken, uint32_t *available)
@@ -760,7 +760,7 @@ rte_soring_acquirx_burst(struct rte_soring *r, void *objs, void *meta,
 			RTE_RING_QUEUE_VARIABLE, ftoken, available);
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_count, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_count)
 unsigned int
 rte_soring_count(const struct rte_soring *r)
 {
@@ -770,7 +770,7 @@ rte_soring_count(const struct rte_soring *r)
 	return (count > r->capacity) ? r->capacity : count;
 }
 
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_soring_free_count, 25.03)
+RTE_EXPORT_SYMBOL(rte_soring_free_count)
 unsigned int
 rte_soring_free_count(const struct rte_soring *r)
 {
-- 
2.53.0


  parent reply	other threads:[~2026-10-07 21:42 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
2026-10-07 21:39 ` [PATCH 01/20] eal: add missing export for rte_basename Stephen Hemminger
2026-10-08  9:56   ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 02/20] eal: promote rte_basename to stable Stephen Hemminger
2026-10-08  9:56   ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 03/20] eal: promote explicit zero and sensitive free " Stephen Hemminger
2026-10-08 10:01   ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 04/20] eal: promote rte_size_to_str " Stephen Hemminger
2026-10-08 10:01   ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 05/20] eal: promote lcore variables API " Stephen Hemminger
2026-10-08 10:04   ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 06/20] cmdline: promote bool token ops " Stephen Hemminger
2026-10-08 10:05   ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 07/20] ethdev: promote link connector to string " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 08/20] port: promote SWX port API " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 09/20] table: promote SWX table " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 10/20] pipeline: promote SWX IPsec " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 11/20] pipeline: promote SWX pipeline and control " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 12/20] power: promote PM QoS and uncore " Stephen Hemminger
2026-10-07 21:39 ` Stephen Hemminger [this message]
2026-10-07 21:39 ` [PATCH 14/20] dispatcher: promote " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 15/20] argparse: " Stephen Hemminger
2026-10-08 10:15   ` Bruce Richardson
2026-10-10  2:45   ` fengchengwen
2026-10-07 21:39 ` [PATCH 16/20] node: " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 17/20] hash: promote RCU reclaim and thash key generation " Stephen Hemminger
2026-10-08 10:16   ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 18/20] cryptodev: promote algorithm helpers " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 19/20] pdcp: promote API " Stephen Hemminger
2026-10-07 21:39 ` [PATCH 20/20] mempool: promote memory range and alignment " Stephen Hemminger
2026-10-08  7:19   ` Morten Brørup

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261007214115.3092715-14-stephen@networkplumber.org \
    --to=stephen@networkplumber.org \
    --cc=dev@dpdk.org \
    --cc=konstantin.ananyev@huawei.com \
    --cc=wathsala.vithanage@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox