* [PATCH 00/20] promote long standing experimental API to stable
@ 2026-10-07 21:39 Stephen Hemminger
2026-10-07 21:39 ` [PATCH 01/20] eal: add missing export for rte_basename Stephen Hemminger
` (19 more replies)
0 siblings, 20 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
The experimental tag is supposed to be temporary: a way to ship an API
while its shape is still being settled. In practice many symbols keep
the tag long after the interface has stopped changing. That discourages
use, because applications reasonably avoid an API that advertises it may
disappear, and it hides the small number of APIs that really are still
in flux.
This series promotes 196 symbols across fifteen libraries. The oldest
date from 20.11 and the bulk are three years old or more. In every case
the prototype has not changed since it was introduced, and most are in
use by in-tree applications, examples or drivers.
By introduction release:
20.11 SWX port, table and pipeline API
21.05 SWX fd and ring ports, wildcard match table,
cryptodev raw enqueue/dequeue and mbuf-to-vec helpers
21.08 SWX selector table
21.11 SWX learner table
22.07 SWX hash function registration, learner timeout and rearm
22.11 SWX pipeline lookup and code generation
23.03 SWX RSS and IPsec, cryptodev algorithm name helpers
23.07 pdcp library, node ip6 route and rewrite
23.11 dispatcher library, node ip4 reassembly and udp4 input,
power uncore environment and frequency list
24.03 argparse parse and parse_type, node ethdev rx next update
24.07 hash RCU queue reclaim, mempool memory range and
object alignment getters
24.11 power PM QoS, thash key generation, eal lcore variables,
cryptodev asymmetric opcap check
25.03 soring enqueue, dequeue, acquire and release,
cmdline bool token ops
25.07 node ip4/ip6 FIB and mbuf dynfield register,
rte_memzero_explicit, rte_free_sensitive, rte_size_to_str
25.11 argparse print_help, rte_basename,
ethdev link connector to string
Where a library had nothing left to keep experimental the file level
"all functions in this file may be changed or removed" warnings are
dropped as well, along with the then unused rte_compat.h includes.
The node library deserves a note. Most of its headers carried that file
level warning while rte_node_ip4_route_add() and rte_node_ip4_rewrite_add()
sat underneath it as stable exports, so the warning was already wrong.
The whole library is promoted. An API that cannot be declared stable
after several releases of use is not helping anyone, and should be
removed rather than left in limbo.
Deliberately left experimental:
- trace point symbols (__rte_*_trace_*) in eal, ethdev, eventdev,
cryptodev, dmadev, bbdev and mempool
- debug and dump output whose format may still change:
rte_soring_dump, rte_ring_headtail_dump, rte_bbdev_queue_ops_dump,
rte_bbdev_ops_param_string and rte_bbdev_ops_trace
- APIs with only one implementation, where the interface should not
be frozen before a second driver has tried to use it.
- the metrics rte_metrics_tel_* API, which has no in-tree users and
should be deprecated rather than promoted; a deprecation notice
will be sent separately
- new subsystems that have not had a release of real use: the
eventdev vector adapter, the graph feature arc and the pmu
library (all 25.07), and the dmadev access pair group API (25.11)
- the soring peek API, rte_eth_get_queue_rate_limit,
rte_mempool_stats_reset and rte_bbdev_queue_stats_get, added in
26.07
- rte_cpu_socket_id, added this release
- rte_event_eth_rx_adapter_queues_add, deferred in commit
42235267000c ("eventdev/eth_rx: promote adapter API to stable")
- eal rte_vfio_get_device_info, left alone while the VFIO rework is
in progress
- rte_str_skip_leading_spaces, a static inline in rte_string_fns.h
with no exported symbol; it can follow separately
- mbuf history API; debug and new in 25.11
No change in functionality, and test results are the same as
before these changes.
Stephen Hemminger (20):
eal: add missing export for rte_basename
eal: promote rte_basename to stable
eal: promote explicit zero and sensitive free to stable
eal: promote rte_size_to_str to stable
eal: promote lcore variables API to stable
cmdline: promote bool token ops to stable
ethdev: promote link connector to string to stable
port: promote SWX port API to stable
table: promote SWX table API to stable
pipeline: promote SWX IPsec API to stable
pipeline: promote SWX pipeline and control API to stable
power: promote PM QoS and uncore API to stable
ring: promote soring API to stable
dispatcher: promote API to stable
argparse: promote API to stable
node: promote API to stable
hash: promote RCU reclaim and thash key generation to stable
cryptodev: promote algorithm helpers to stable
pdcp: promote API to stable
mempool: promote memory range and alignment to stable
doc/guides/rel_notes/release_26_11.rst | 50 ++++++++-
lib/argparse/rte_argparse.c | 6 +-
lib/argparse/rte_argparse.h | 13 ---
lib/cmdline/cmdline_parse_bool.c | 2 +-
lib/cryptodev/rte_crypto_sym.h | 2 -
lib/cryptodev/rte_cryptodev.c | 10 +-
lib/cryptodev/rte_cryptodev.h | 10 --
lib/dispatcher/rte_dispatcher.c | 26 ++---
lib/dispatcher/rte_dispatcher.h | 18 ---
lib/eal/common/eal_common_lcore_var.c | 2 +-
lib/eal/common/eal_common_memory.c | 2 +-
lib/eal/common/eal_common_string_fns.c | 2 +-
lib/eal/common/rte_malloc.c | 2 +-
lib/eal/include/rte_common.h | 4 -
lib/eal/include/rte_lcore_var.h | 3 -
lib/eal/include/rte_malloc.h | 4 -
lib/eal/include/rte_memory.h | 4 -
lib/eal/include/rte_string_fns.h | 4 -
lib/eal/unix/rte_basename.c | 2 +-
lib/eal/windows/rte_basename.c | 2 +
lib/ethdev/rte_ethdev.c | 2 +-
lib/ethdev/rte_ethdev.h | 4 -
lib/hash/rte_cuckoo_hash.c | 2 +-
lib/hash/rte_hash.h | 1 -
lib/hash/rte_thash.c | 2 +-
lib/hash/rte_thash.h | 4 -
lib/mempool/rte_mempool.c | 4 +-
lib/mempool/rte_mempool.h | 8 --
lib/node/ethdev_ctrl.c | 2 +-
lib/node/ip4_lookup_fib.c | 4 +-
lib/node/ip4_reassembly.c | 2 +-
lib/node/ip6_lookup.c | 2 +-
lib/node/ip6_lookup_fib.c | 4 +-
lib/node/ip6_rewrite.c | 2 +-
lib/node/node_mbuf_dynfield.c | 2 +-
lib/node/rte_node_eth_api.h | 6 -
lib/node/rte_node_ip4_api.h | 9 --
lib/node/rte_node_ip6_api.h | 9 --
lib/node/rte_node_mbuf_dynfield.h | 6 -
lib/node/rte_node_pkt_cls_api.h | 4 -
lib/node/rte_node_udp4_input_api.h | 8 --
lib/node/udp4_input.c | 4 +-
lib/pdcp/rte_pdcp.c | 10 +-
lib/pdcp/rte_pdcp.h | 29 -----
lib/pdcp/rte_pdcp_group.h | 6 -
lib/pipeline/rte_swx_ctl.c | 34 +++---
lib/pipeline/rte_swx_ctl.h | 61 -----------
lib/pipeline/rte_swx_ipsec.c | 14 +--
lib/pipeline/rte_swx_ipsec.h | 8 --
lib/pipeline/rte_swx_pipeline.c | 146 ++++++++++++-------------
lib/pipeline/rte_swx_pipeline.h | 32 ------
lib/port/rte_swx_port_ethdev.c | 4 +-
lib/port/rte_swx_port_fd.c | 4 +-
lib/port/rte_swx_port_ring.c | 4 +-
lib/port/rte_swx_port_source_sink.c | 6 +-
lib/power/rte_power_qos.c | 4 +-
lib/power/rte_power_qos.h | 10 --
lib/power/rte_power_uncore.c | 8 +-
lib/power/rte_power_uncore.h | 5 -
lib/ring/rte_soring.c | 4 +-
lib/ring/rte_soring.h | 72 ------------
lib/ring/soring.c | 32 +++---
lib/table/rte_swx_table_em.c | 4 +-
lib/table/rte_swx_table_learner.c | 20 ++--
lib/table/rte_swx_table_learner.h | 12 --
lib/table/rte_swx_table_selector.c | 12 +-
lib/table/rte_swx_table_selector.h | 8 --
lib/table/rte_swx_table_wm.c | 2 +-
68 files changed, 248 insertions(+), 562 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 30+ messages in thread
* [PATCH 01/20] eal: add missing export for rte_basename
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
@ 2026-10-07 21:39 ` 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
` (18 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, stable, Dmitry Kozlyuk, Bruce Richardson
The export for rte_basename was missed on the Windows version.
If it is a public API it needs to be on all OS's supported.
Fixes: b8a75ece45fe ("eal: add basename function for common path manipulation")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/eal/windows/rte_basename.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/lib/eal/windows/rte_basename.c b/lib/eal/windows/rte_basename.c
index f4dfc08a0a..ede913e6c1 100644
--- a/lib/eal/windows/rte_basename.c
+++ b/lib/eal/windows/rte_basename.c
@@ -4,8 +4,10 @@
#include <string.h>
#include <stdlib.h>
+#include <eal_export.h>
#include <rte_string_fns.h>
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_basename, 25.11)
size_t
rte_basename(const char *path, char *buf, size_t buflen)
{
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 02/20] eal: promote rte_basename to stable
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-07 21:39 ` 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
` (17 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Dmitry Kozlyuk
rte_basename() was added in 25.11 as a portable replacement for
basename(), whose behaviour differs between the POSIX and GNU versions.
The prototype has not changed.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/eal/include/rte_string_fns.h | 4 ----
lib/eal/unix/rte_basename.c | 2 +-
lib/eal/windows/rte_basename.c | 2 +-
3 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/lib/eal/include/rte_string_fns.h b/lib/eal/include/rte_string_fns.h
index b3b5bdf275..f7cfbf00b6 100644
--- a/lib/eal/include/rte_string_fns.h
+++ b/lib/eal/include/rte_string_fns.h
@@ -140,9 +140,6 @@ rte_str_skip_leading_spaces(const char *src)
}
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Provides the final component of a path, similar to POSIX basename function.
*
* This API provides the similar behaviour on all platforms, Linux, BSD, Windows,
@@ -167,7 +164,6 @@ rte_str_skip_leading_spaces(const char *src)
* If the return value is >= buflen, truncation occurred.
* Return (size_t)-1 on error (Windows only)
*/
-__rte_experimental
size_t
rte_basename(const char *path, char *buf, size_t buflen);
diff --git a/lib/eal/unix/rte_basename.c b/lib/eal/unix/rte_basename.c
index a72d6bb3c9..f70c30b0f8 100644
--- a/lib/eal/unix/rte_basename.c
+++ b/lib/eal/unix/rte_basename.c
@@ -10,7 +10,7 @@
#include <eal_export.h>
#include <rte_string_fns.h>
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_basename, 25.11)
+RTE_EXPORT_SYMBOL(rte_basename)
size_t
rte_basename(const char *path, char *buf, size_t buflen)
{
diff --git a/lib/eal/windows/rte_basename.c b/lib/eal/windows/rte_basename.c
index ede913e6c1..2c8cc9dc9d 100644
--- a/lib/eal/windows/rte_basename.c
+++ b/lib/eal/windows/rte_basename.c
@@ -7,7 +7,7 @@
#include <eal_export.h>
#include <rte_string_fns.h>
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_basename, 25.11)
+RTE_EXPORT_SYMBOL(rte_basename)
size_t
rte_basename(const char *path, char *buf, size_t buflen)
{
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 03/20] eal: promote explicit zero and sensitive free to stable
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-07 21:39 ` [PATCH 02/20] eal: promote rte_basename to stable Stephen Hemminger
@ 2026-10-07 21:39 ` 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
` (16 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Anatoly Burakov
rte_memzero_explicit() and rte_free_sensitive() were added in 25.07 and
have not changed since. They are used by the QAT crypto driver for
asymmetric and symmetric session keys and by the ixgbe IPsec code, which
are exactly the sensitive data paths they exist for.
An API for clearing keys is of little use to applications while it is
marked as subject to change, so promote it.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/eal/common/eal_common_memory.c | 2 +-
lib/eal/common/rte_malloc.c | 2 +-
lib/eal/include/rte_malloc.h | 4 ----
lib/eal/include/rte_memory.h | 4 ----
4 files changed, 2 insertions(+), 10 deletions(-)
diff --git a/lib/eal/common/eal_common_memory.c b/lib/eal/common/eal_common_memory.c
index 33681e7a37..c12b9e1e7f 100644
--- a/lib/eal/common/eal_common_memory.c
+++ b/lib/eal/common/eal_common_memory.c
@@ -1730,7 +1730,7 @@ RTE_INIT(memory_telemetry)
#endif /* telemetry !RTE_EXEC_ENV_WINDOWS */
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_memzero_explicit, 25.07)
+RTE_EXPORT_SYMBOL(rte_memzero_explicit)
void
rte_memzero_explicit(void *dst, size_t sz)
{
diff --git a/lib/eal/common/rte_malloc.c b/lib/eal/common/rte_malloc.c
index 388e5a63b6..0c71f26df3 100644
--- a/lib/eal/common/rte_malloc.c
+++ b/lib/eal/common/rte_malloc.c
@@ -56,7 +56,7 @@ rte_free(void *addr)
mem_free(addr, true, false);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_free_sensitive, 25.07)
+RTE_EXPORT_SYMBOL(rte_free_sensitive)
void
rte_free_sensitive(void *addr)
{
diff --git a/lib/eal/include/rte_malloc.h b/lib/eal/include/rte_malloc.h
index 0a397e7723..c42006b594 100644
--- a/lib/eal/include/rte_malloc.h
+++ b/lib/eal/include/rte_malloc.h
@@ -53,9 +53,6 @@ rte_free(void *ptr);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Frees the memory space pointed to by the provided pointer
* and guarantees it will be zero'd before reuse.
* This function is slower than simple rte_free() it should only
@@ -70,7 +67,6 @@ rte_free(void *ptr);
* @param ptr
* The pointer to memory to be freed.
*/
-__rte_experimental
void
rte_free_sensitive(void *ptr);
diff --git a/lib/eal/include/rte_memory.h b/lib/eal/include/rte_memory.h
index 940770f1eb..a7749ceed1 100644
--- a/lib/eal/include/rte_memory.h
+++ b/lib/eal/include/rte_memory.h
@@ -729,9 +729,6 @@ int
rte_mem_alloc_validator_unregister(const char *name, int socket_id);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Fill memory with zero's (e.g. sensitive keys).
* Normally using memset() is fine, but in cases where clearing out local data
* before going out of scope is required, use rte_memzero_explicit() instead
@@ -742,7 +739,6 @@ rte_mem_alloc_validator_unregister(const char *name, int socket_id);
* @param sz
* Number of bytes to fill.
*/
-__rte_experimental
void
rte_memzero_explicit(void *dst, size_t sz);
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 04/20] eal: promote rte_size_to_str to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (2 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 03/20] eal: promote explicit zero and sensitive free " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-08 10:01 ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 05/20] eal: promote lcore variables API " Stephen Hemminger
` (15 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
rte_size_to_str() was added in 25.07 and has not changed. Its
counterpart rte_str_to_size() is already stable.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/eal/common/eal_common_string_fns.c | 2 +-
lib/eal/include/rte_common.h | 4 ----
2 files changed, 1 insertion(+), 5 deletions(-)
diff --git a/lib/eal/common/eal_common_string_fns.c b/lib/eal/common/eal_common_string_fns.c
index e0dc48bd80..00ce95c011 100644
--- a/lib/eal/common/eal_common_string_fns.c
+++ b/lib/eal/common/eal_common_string_fns.c
@@ -114,7 +114,7 @@ rte_str_to_size(const char *str)
return size;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_size_to_str, 25.07)
+RTE_EXPORT_SYMBOL(rte_size_to_str)
char *
rte_size_to_str(char *buf, int buf_size, uint64_t count, bool use_iec, const char *unit)
{
diff --git a/lib/eal/include/rte_common.h b/lib/eal/include/rte_common.h
index c3f5bae6dc..6c4ae332fc 100644
--- a/lib/eal/include/rte_common.h
+++ b/lib/eal/include/rte_common.h
@@ -1137,9 +1137,6 @@ uint64_t
rte_str_to_size(const char *str);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Converts the uint64_t value provided to a human-readable string.
* It null-terminates the string, truncating the data if needed.
* An optional unit (like "B") can be provided as a string. It will be
@@ -1167,7 +1164,6 @@ rte_str_to_size(const char *str);
* @return
* buf on success, NULL if the buffer is too small.
*/
-__rte_experimental
char *
rte_size_to_str(char *buf, int buf_size, uint64_t count, bool use_iec, const char *unit);
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 05/20] eal: promote lcore variables API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (3 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 04/20] eal: promote rte_size_to_str " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-08 10:04 ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 06/20] cmdline: promote bool token ops " Stephen Hemminger
` (14 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Mattias Rönnblom
rte_lcore_var_alloc() was added in 24.11 and has not changed. The
RTE_LCORE_VAR_* macros that form the public interface were never marked
experimental, so the header carried a file level warning while the
macros applications actually use looked stable.
The API is used by rte_random, rte_service, the x86 power intrinsics and
the power PMD management code. Promote the allocator and drop the file
level warning.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 4 ++++
lib/eal/common/eal_common_lcore_var.c | 2 +-
lib/eal/include/rte_lcore_var.h | 3 ---
3 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 934efaaf93..62e7df5728 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -240,6 +240,10 @@ API Changes
are now declared with an alignment of 1 on all architectures.
The compiler may generate narrower loads and stores than before.
+* eal: Promoted ``rte_memzero_explicit``, ``rte_free_sensitive``,
+ ``rte_basename``, ``rte_size_to_str`` and the lcore variables API
+ from experimental to stable.
+
* ethdev: Updated VMDq related API.
* At port configuration time, the number of VMDq pools advertised by a driver
diff --git a/lib/eal/common/eal_common_lcore_var.c b/lib/eal/common/eal_common_lcore_var.c
index 8a7920ed0f..a2af0e19d8 100644
--- a/lib/eal/common/eal_common_lcore_var.c
+++ b/lib/eal/common/eal_common_lcore_var.c
@@ -76,7 +76,7 @@ lcore_var_alloc(size_t size, size_t align)
return handle;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_lcore_var_alloc, 24.11)
+RTE_EXPORT_SYMBOL(rte_lcore_var_alloc)
void *
rte_lcore_var_alloc(size_t size, size_t align)
{
diff --git a/lib/eal/include/rte_lcore_var.h b/lib/eal/include/rte_lcore_var.h
index 48b022e84e..2737ae947b 100644
--- a/lib/eal/include/rte_lcore_var.h
+++ b/lib/eal/include/rte_lcore_var.h
@@ -15,8 +15,6 @@
*
* Please refer to the lcore variables' programmer's guide
* for an overview of this API and its implementation.
- *
- * EXPERIMENTAL: this API may change, or be removed, without prior notice.
*/
#include <stddef.h>
@@ -199,7 +197,6 @@ rte_lcore_var_lcore(unsigned int lcore_id, void *handle)
* The variable's handle, stored in a void pointer value.
* The value is always non-NULL.
*/
-__rte_experimental
void *
rte_lcore_var_alloc(size_t size, size_t align)
__rte_alloc_align(2);
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 06/20] cmdline: promote bool token ops to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (4 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 05/20] eal: promote lcore variables API " Stephen Hemminger
@ 2026-10-07 21:39 ` 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
` (13 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
The cmdline_token_bool_ops structure was added in 25.03 and has not
changed. It was the only experimental symbol left in the cmdline
library, where the other 69 exports are already stable.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 2 ++
lib/cmdline/cmdline_parse_bool.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 62e7df5728..3ad6ba2d81 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -221,6 +221,8 @@ API Changes
Also, make sure to start the actual text at the margin.
=======================================================
+* cmdline: Promoted ``cmdline_token_bool_ops`` from experimental to stable.
+
* eal: Improved pointer arithmetic macros.
* ``RTE_PTR_ADD``, ``RTE_PTR_SUB``, ``RTE_PTR_ALIGN``, ``RTE_PTR_ALIGN_CEIL``,
diff --git a/lib/cmdline/cmdline_parse_bool.c b/lib/cmdline/cmdline_parse_bool.c
index d5d5499531..ef41d2bc17 100644
--- a/lib/cmdline/cmdline_parse_bool.c
+++ b/lib/cmdline/cmdline_parse_bool.c
@@ -18,7 +18,7 @@ cmdline_get_help_bool(cmdline_parse_token_hdr_t *tk, char *dstbuf,
unsigned int size);
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(cmdline_token_bool_ops, 25.03)
+RTE_EXPORT_SYMBOL(cmdline_token_bool_ops)
struct cmdline_token_ops cmdline_token_bool_ops = {
.parse = cmdline_parse_bool,
.complete_get_nb = NULL,
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 07/20] ethdev: promote link connector to string to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (5 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 06/20] cmdline: promote bool token ops " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 08/20] port: promote SWX port API " Stephen Hemminger
` (12 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Thomas Monjalon, Andrew Rybchenko
rte_eth_link_connector_to_str() was added in 25.11 and has not changed.
It is a pure enum to string helper with no driver involvement, like the
already stable rte_eth_link_speed_to_str().
The xstats counter enable and query functions are left experimental.
They are currently implemented only by net/mlx5, so the interface
should not be frozen before a second driver has tried to use it.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 3 ++-
lib/ethdev/rte_ethdev.c | 2 +-
lib/ethdev/rte_ethdev.h | 4 ----
3 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 3ad6ba2d81..ac8ce1d9a5 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -300,7 +300,8 @@ API Changes
* utility functions:
``rte_eth_get_monitor_addr``, ``rte_eth_representor_info_get``,
``rte_eth_buffer_split_get_supported_hdr_ptypes``,
- ``rte_eth_timesync_adjust_freq`` and ``rte_tm_node_query``
+ ``rte_eth_timesync_adjust_freq``, ``rte_tm_node_query``,
+ and ``rte_eth_link_connector_to_str``
* buffer split and error handling types:
``rte_eth_rxseg_split``, ``rte_eth_rxseg``, ``rte_eth_rxseg_capa``
and ``rte_eth_err_handle_mode``
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index 7c57a9bb8f..338be3a289 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -3329,7 +3329,7 @@ rte_eth_link_to_str(char *str, size_t len, const struct rte_eth_link *eth_link)
return ret;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_connector_to_str, 25.11)
+RTE_EXPORT_SYMBOL(rte_eth_link_connector_to_str)
const char *
rte_eth_link_connector_to_str(enum rte_eth_link_connector link_connector)
{
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index ae43420cf6..a3642b3c6e 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -3075,9 +3075,6 @@ int rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *link)
const char *rte_eth_link_speed_to_str(uint32_t link_speed);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* This function converts an Ethernet link type to a string.
*
* @param link_connector
@@ -3085,7 +3082,6 @@ const char *rte_eth_link_speed_to_str(uint32_t link_speed);
* @return
* NULL for invalid link connector values otherwise the string representation of the link type.
*/
-__rte_experimental
const char *rte_eth_link_connector_to_str(enum rte_eth_link_connector link_connector);
/**
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 08/20] port: promote SWX port API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (6 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 07/20] ethdev: promote link connector to string " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 09/20] table: promote SWX table " Stephen Hemminger
` (11 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Cristian Dumitrescu
The SWX port ops structures have been experimental since 20.11 (ethdev,
source/sink) and 21.05 (fd, ring). They have not changed since being
introduced and are the only port API remaining now that the legacy
rte_port_* API has been removed, so there is no reason to keep them
experimental.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/port/rte_swx_port_ethdev.c | 4 ++--
lib/port/rte_swx_port_fd.c | 4 ++--
lib/port/rte_swx_port_ring.c | 4 ++--
lib/port/rte_swx_port_source_sink.c | 6 +++---
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/lib/port/rte_swx_port_ethdev.c b/lib/port/rte_swx_port_ethdev.c
index de6d0e5bb3..509762901b 100644
--- a/lib/port/rte_swx_port_ethdev.c
+++ b/lib/port/rte_swx_port_ethdev.c
@@ -402,7 +402,7 @@ writer_stats_read(void *port, struct rte_swx_port_out_stats *stats)
/*
* Summary of port operations
*/
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_ethdev_reader_ops, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_port_ethdev_reader_ops)
struct rte_swx_port_in_ops rte_swx_port_ethdev_reader_ops = {
.create = reader_create,
.free = reader_free,
@@ -410,7 +410,7 @@ struct rte_swx_port_in_ops rte_swx_port_ethdev_reader_ops = {
.stats_read = reader_stats_read,
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_ethdev_writer_ops, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_port_ethdev_writer_ops)
struct rte_swx_port_out_ops rte_swx_port_ethdev_writer_ops = {
.create = writer_create,
.free = writer_free,
diff --git a/lib/port/rte_swx_port_fd.c b/lib/port/rte_swx_port_fd.c
index 72783d2b0f..0851ee66e1 100644
--- a/lib/port/rte_swx_port_fd.c
+++ b/lib/port/rte_swx_port_fd.c
@@ -345,7 +345,7 @@ writer_stats_read(void *port, struct rte_swx_port_out_stats *stats)
/*
* Summary of port operations
*/
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_fd_reader_ops, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_port_fd_reader_ops)
struct rte_swx_port_in_ops rte_swx_port_fd_reader_ops = {
.create = reader_create,
.free = reader_free,
@@ -353,7 +353,7 @@ struct rte_swx_port_in_ops rte_swx_port_fd_reader_ops = {
.stats_read = reader_stats_read,
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_fd_writer_ops, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_port_fd_writer_ops)
struct rte_swx_port_out_ops rte_swx_port_fd_writer_ops = {
.create = writer_create,
.free = writer_free,
diff --git a/lib/port/rte_swx_port_ring.c b/lib/port/rte_swx_port_ring.c
index 3ac652ac09..badd595481 100644
--- a/lib/port/rte_swx_port_ring.c
+++ b/lib/port/rte_swx_port_ring.c
@@ -407,7 +407,7 @@ writer_stats_read(void *port, struct rte_swx_port_out_stats *stats)
/*
* Summary of port operations
*/
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_ring_reader_ops, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_port_ring_reader_ops)
struct rte_swx_port_in_ops rte_swx_port_ring_reader_ops = {
.create = reader_create,
.free = reader_free,
@@ -415,7 +415,7 @@ struct rte_swx_port_in_ops rte_swx_port_ring_reader_ops = {
.stats_read = reader_stats_read,
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_ring_writer_ops, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_port_ring_writer_ops)
struct rte_swx_port_out_ops rte_swx_port_ring_writer_ops = {
.create = writer_create,
.free = writer_free,
diff --git a/lib/port/rte_swx_port_source_sink.c b/lib/port/rte_swx_port_source_sink.c
index af8b9ec68d..96ad739982 100644
--- a/lib/port/rte_swx_port_source_sink.c
+++ b/lib/port/rte_swx_port_source_sink.c
@@ -202,7 +202,7 @@ source_stats_read(void *port, struct rte_swx_port_in_stats *stats)
memcpy(stats, &p->stats, sizeof(p->stats));
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_source_ops, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_port_source_ops)
struct rte_swx_port_in_ops rte_swx_port_source_ops = {
.create = source_create,
.free = source_free,
@@ -212,7 +212,7 @@ struct rte_swx_port_in_ops rte_swx_port_source_ops = {
#else
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_source_ops, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_port_source_ops)
struct rte_swx_port_in_ops rte_swx_port_source_ops = {
.create = NULL,
.free = NULL,
@@ -383,7 +383,7 @@ sink_stats_read(void *port, struct rte_swx_port_out_stats *stats)
/*
* Summary of port operations
*/
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_port_sink_ops, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_port_sink_ops)
struct rte_swx_port_out_ops rte_swx_port_sink_ops = {
.create = sink_create,
.free = sink_free,
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 09/20] table: promote SWX table API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (7 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 08/20] port: promote SWX port API " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 10/20] pipeline: promote SWX IPsec " Stephen Hemminger
` (10 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Cristian Dumitrescu
The SWX table symbols have been experimental since 20.11 (exact match),
21.05 (wildcard match), 21.08 (selector) and 21.11 (learner), with only
the learner timeout and rearm additions in 22.07 being more recent.
The interface has been unchanged for several releases and is the only
table API remaining now that the legacy rte_table_* API has been
removed, so promote it to stable.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/table/rte_swx_table_em.c | 4 ++--
lib/table/rte_swx_table_learner.c | 20 ++++++++++----------
lib/table/rte_swx_table_learner.h | 12 ------------
lib/table/rte_swx_table_selector.c | 12 ++++++------
lib/table/rte_swx_table_selector.h | 8 --------
lib/table/rte_swx_table_wm.c | 2 +-
6 files changed, 19 insertions(+), 39 deletions(-)
diff --git a/lib/table/rte_swx_table_em.c b/lib/table/rte_swx_table_em.c
index c408ea6fc3..ad49443389 100644
--- a/lib/table/rte_swx_table_em.c
+++ b/lib/table/rte_swx_table_em.c
@@ -646,7 +646,7 @@ table_footprint(struct rte_swx_table_params *params,
return memory_footprint;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_exact_match_unoptimized_ops, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_exact_match_unoptimized_ops)
struct rte_swx_table_ops rte_swx_table_exact_match_unoptimized_ops = {
.footprint_get = table_footprint,
.mailbox_size_get = table_mailbox_size_get_unoptimized,
@@ -657,7 +657,7 @@ struct rte_swx_table_ops rte_swx_table_exact_match_unoptimized_ops = {
.free = table_free,
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_exact_match_ops, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_exact_match_ops)
struct rte_swx_table_ops rte_swx_table_exact_match_ops = {
.footprint_get = table_footprint,
.mailbox_size_get = table_mailbox_size_get,
diff --git a/lib/table/rte_swx_table_learner.c b/lib/table/rte_swx_table_learner.c
index 3680bf26c1..633f9df2e2 100644
--- a/lib/table/rte_swx_table_learner.c
+++ b/lib/table/rte_swx_table_learner.c
@@ -273,7 +273,7 @@ table_entry_id_get(struct table *t, struct table_bucket *b, size_t bucket_key_po
return (bucket_id << TABLE_KEYS_PER_BUCKET_LOG2) + bucket_key_pos;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_footprint_get, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_footprint_get)
uint64_t
rte_swx_table_learner_footprint_get(struct rte_swx_table_learner_params *params)
{
@@ -285,7 +285,7 @@ rte_swx_table_learner_footprint_get(struct rte_swx_table_learner_params *params)
return status ? 0 : p.total_size;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_create, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_create)
void *
rte_swx_table_learner_create(struct rte_swx_table_learner_params *params, int numa_node)
{
@@ -309,7 +309,7 @@ rte_swx_table_learner_create(struct rte_swx_table_learner_params *params, int nu
return t;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_free, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_free)
void
rte_swx_table_learner_free(void *table)
{
@@ -321,7 +321,7 @@ rte_swx_table_learner_free(void *table)
env_free(t, t->params.total_size);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_timeout_update, 22.07)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_timeout_update)
int
rte_swx_table_learner_timeout_update(void *table,
uint32_t key_timeout_id,
@@ -359,14 +359,14 @@ struct mailbox {
int state;
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_mailbox_size_get, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_mailbox_size_get)
uint64_t
rte_swx_table_learner_mailbox_size_get(void)
{
return sizeof(struct mailbox);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_lookup, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_lookup)
int
rte_swx_table_learner_lookup(void *table,
void *mailbox,
@@ -453,7 +453,7 @@ rte_swx_table_learner_lookup(void *table,
}
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_rearm, 22.07)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_rearm)
void
rte_swx_table_learner_rearm(void *table,
void *mailbox,
@@ -477,7 +477,7 @@ rte_swx_table_learner_rearm(void *table,
b->time[bucket_key_pos] = (input_time + key_timeout) >> 32;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_rearm_new, 22.07)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_rearm_new)
void
rte_swx_table_learner_rearm_new(void *table,
void *mailbox,
@@ -502,7 +502,7 @@ rte_swx_table_learner_rearm_new(void *table,
b->key_timeout_id[bucket_key_pos] = (uint8_t)key_timeout_id;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_add, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_add)
uint32_t
rte_swx_table_learner_add(void *table,
void *mailbox,
@@ -579,7 +579,7 @@ rte_swx_table_learner_add(void *table,
return 1;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_learner_delete, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_table_learner_delete)
void
rte_swx_table_learner_delete(void *table __rte_unused,
void *mailbox)
diff --git a/lib/table/rte_swx_table_learner.h b/lib/table/rte_swx_table_learner.h
index 9a18be083d..92f1ed949e 100644
--- a/lib/table/rte_swx_table_learner.h
+++ b/lib/table/rte_swx_table_learner.h
@@ -45,8 +45,6 @@
#include <stdint.h>
#include <sys/types.h>
-#include <rte_compat.h>
-
#include "rte_swx_hash_func.h"
#ifdef __cplusplus
@@ -107,7 +105,6 @@ struct rte_swx_table_learner_params {
* @return
* Table memory footprint in bytes.
*/
-__rte_experimental
uint64_t
rte_swx_table_learner_footprint_get(struct rte_swx_table_learner_params *params);
@@ -121,7 +118,6 @@ rte_swx_table_learner_footprint_get(struct rte_swx_table_learner_params *params)
* @return
* Table mailbox footprint in bytes.
*/
-__rte_experimental
uint64_t
rte_swx_table_learner_mailbox_size_get(void);
@@ -135,7 +131,6 @@ rte_swx_table_learner_mailbox_size_get(void);
* @return
* Table handle, on success, or NULL, on error.
*/
-__rte_experimental
void *
rte_swx_table_learner_create(struct rte_swx_table_learner_params *params, int numa_node);
@@ -152,7 +147,6 @@ rte_swx_table_learner_create(struct rte_swx_table_learner_params *params, int nu
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument(s).
*/
-__rte_experimental
int
rte_swx_table_learner_timeout_update(void *table,
uint32_t key_timeout_id,
@@ -206,7 +200,6 @@ rte_swx_table_learner_timeout_update(void *table,
* 0 when the table lookup operation is not yet completed, and 1 when the table lookup operation
* is completed. No other return values are allowed.
*/
-__rte_experimental
int
rte_swx_table_learner_lookup(void *table,
void *mailbox,
@@ -239,7 +232,6 @@ rte_swx_table_learner_lookup(void *table,
* @return
* 0 on success, 1 or error (table full).
*/
-__rte_experimental
uint32_t
rte_swx_table_learner_add(void *table,
void *mailbox,
@@ -261,7 +253,6 @@ rte_swx_table_learner_add(void *table,
* @param[in] time
* Current time measured in CPU clock cycles.
*/
-__rte_experimental
void
rte_swx_table_learner_rearm(void *table,
void *mailbox,
@@ -282,7 +273,6 @@ rte_swx_table_learner_rearm(void *table,
* @param[in] key_timeout_id
* Key timeout ID.
*/
-__rte_experimental
void
rte_swx_table_learner_rearm_new(void *table,
void *mailbox,
@@ -301,7 +291,6 @@ rte_swx_table_learner_rearm_new(void *table,
* @param[in] mailbox
* Mailbox for the current operation.
*/
-__rte_experimental
void
rte_swx_table_learner_delete(void *table,
void *mailbox);
@@ -312,7 +301,6 @@ rte_swx_table_learner_delete(void *table,
* @param[in] table
* Table handle.
*/
-__rte_experimental
void
rte_swx_table_learner_free(void *table);
diff --git a/lib/table/rte_swx_table_selector.c b/lib/table/rte_swx_table_selector.c
index d42f67f157..041fc70db5 100644
--- a/lib/table/rte_swx_table_selector.c
+++ b/lib/table/rte_swx_table_selector.c
@@ -171,7 +171,7 @@ struct table {
uint32_t n_members_per_group_max_log2;
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_selector_footprint_get, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_table_selector_footprint_get)
uint64_t
rte_swx_table_selector_footprint_get(uint32_t n_groups_max, uint32_t n_members_per_group_max)
{
@@ -184,7 +184,7 @@ rte_swx_table_selector_footprint_get(uint32_t n_groups_max, uint32_t n_members_p
return sizeof(struct table) + group_table_size + members_size;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_selector_free, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_table_selector_free)
void
rte_swx_table_selector_free(void *table)
{
@@ -262,7 +262,7 @@ group_set(struct table *t,
uint32_t group_id,
struct rte_swx_table_selector_group *group);
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_selector_create, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_table_selector_create)
void *
rte_swx_table_selector_create(struct rte_swx_table_selector_params *params,
struct rte_swx_table_selector_group **groups,
@@ -532,7 +532,7 @@ group_set(struct table *t,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_selector_group_set, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_table_selector_group_set)
int
rte_swx_table_selector_group_set(void *table,
uint32_t group_id,
@@ -547,14 +547,14 @@ struct mailbox {
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_selector_mailbox_size_get, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_table_selector_mailbox_size_get)
uint64_t
rte_swx_table_selector_mailbox_size_get(void)
{
return sizeof(struct mailbox);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_selector_select, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_table_selector_select)
int
rte_swx_table_selector_select(void *table,
void *mailbox __rte_unused,
diff --git a/lib/table/rte_swx_table_selector.h b/lib/table/rte_swx_table_selector.h
index ef29bdb6b0..d13f556803 100644
--- a/lib/table/rte_swx_table_selector.h
+++ b/lib/table/rte_swx_table_selector.h
@@ -13,8 +13,6 @@
#include <stdint.h>
-#include <rte_compat.h>
-
#include "rte_swx_table.h"
#ifdef __cplusplus
@@ -83,7 +81,6 @@ struct rte_swx_table_selector_group {
* @return
* Selector table memory footprint in bytes.
*/
-__rte_experimental
uint64_t
rte_swx_table_selector_footprint_get(uint32_t n_groups_max, uint32_t n_members_per_group_max);
@@ -97,7 +94,6 @@ rte_swx_table_selector_footprint_get(uint32_t n_groups_max, uint32_t n_members_p
* @return
* Selector table mailbox footprint in bytes.
*/
-__rte_experimental
uint64_t
rte_swx_table_selector_mailbox_size_get(void);
@@ -115,7 +111,6 @@ rte_swx_table_selector_mailbox_size_get(void);
* @return
* Table handle, on success, or NULL, on error.
*/
-__rte_experimental
void *
rte_swx_table_selector_create(struct rte_swx_table_selector_params *params,
struct rte_swx_table_selector_group **groups,
@@ -135,7 +130,6 @@ rte_swx_table_selector_create(struct rte_swx_table_selector_params *params,
* -EINVAL: Invalid argument(s);
* -ENOSPC: Too many group members.
*/
-__rte_experimental
int
rte_swx_table_selector_group_set(void *table,
uint32_t group_id,
@@ -177,7 +171,6 @@ rte_swx_table_selector_group_set(void *table,
* 0 when the operation is not yet completed, and 1 when the operation is complete. No other
* return values are allowed.
*/
-__rte_experimental
int
rte_swx_table_selector_select(void *table,
void *mailbox,
@@ -191,7 +184,6 @@ rte_swx_table_selector_select(void *table,
* @param[in] table
* Selector table handle.
*/
-__rte_experimental
void
rte_swx_table_selector_free(void *table);
diff --git a/lib/table/rte_swx_table_wm.c b/lib/table/rte_swx_table_wm.c
index c57738dda3..626192341a 100644
--- a/lib/table/rte_swx_table_wm.c
+++ b/lib/table/rte_swx_table_wm.c
@@ -458,7 +458,7 @@ table_lookup(void *table,
return 1;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_table_wildcard_match_ops, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_table_wildcard_match_ops)
struct rte_swx_table_ops rte_swx_table_wildcard_match_ops = {
.footprint_get = NULL,
.mailbox_size_get = table_mailbox_size_get,
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 10/20] pipeline: promote SWX IPsec API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (8 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 09/20] table: promote SWX table " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 11/20] pipeline: promote SWX pipeline and control " Stephen Hemminger
` (9 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Cristian Dumitrescu
The rte_swx_ipsec_* symbols have been experimental since 23.03 and have
had no functional change since. Promote them to stable along with the
rest of the SWX pipeline API.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/pipeline/rte_swx_ipsec.c | 14 +++++++-------
lib/pipeline/rte_swx_ipsec.h | 8 --------
2 files changed, 7 insertions(+), 15 deletions(-)
diff --git a/lib/pipeline/rte_swx_ipsec.c b/lib/pipeline/rte_swx_ipsec.c
index 553056fad2..2b2b5e5e5f 100644
--- a/lib/pipeline/rte_swx_ipsec.c
+++ b/lib/pipeline/rte_swx_ipsec.c
@@ -178,7 +178,7 @@ static struct rte_tailq_elem rte_swx_ipsec_tailq = {
EAL_REGISTER_TAILQ(rte_swx_ipsec_tailq)
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ipsec_find, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ipsec_find)
struct rte_swx_ipsec *
rte_swx_ipsec_find(const char *name)
{
@@ -263,7 +263,7 @@ ipsec_unregister(struct rte_swx_ipsec *ipsec)
static void
ipsec_session_free(struct rte_swx_ipsec *ipsec, struct rte_ipsec_session *s);
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ipsec_free, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ipsec_free)
void
rte_swx_ipsec_free(struct rte_swx_ipsec *ipsec)
{
@@ -294,7 +294,7 @@ rte_swx_ipsec_free(struct rte_swx_ipsec *ipsec)
env_free(ipsec, ipsec->total_size);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ipsec_create, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ipsec_create)
int
rte_swx_ipsec_create(struct rte_swx_ipsec **ipsec_out,
const char *name,
@@ -722,7 +722,7 @@ rte_swx_ipsec_post_crypto(struct rte_swx_ipsec *ipsec)
}
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ipsec_run, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ipsec_run)
void
rte_swx_ipsec_run(struct rte_swx_ipsec *ipsec)
{
@@ -1134,7 +1134,7 @@ do { \
} \
} while (0)
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ipsec_sa_read, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ipsec_sa_read)
struct rte_swx_ipsec_sa_params *
rte_swx_ipsec_sa_read(struct rte_swx_ipsec *ipsec __rte_unused,
const char *string,
@@ -1768,7 +1768,7 @@ ipsec_session_free(struct rte_swx_ipsec *ipsec,
memset(s, 0, sizeof(*s));
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ipsec_sa_add, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ipsec_sa_add)
int
rte_swx_ipsec_sa_add(struct rte_swx_ipsec *ipsec,
struct rte_swx_ipsec_sa_params *sa_params,
@@ -1808,7 +1808,7 @@ rte_swx_ipsec_sa_add(struct rte_swx_ipsec *ipsec,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ipsec_sa_delete, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ipsec_sa_delete)
void
rte_swx_ipsec_sa_delete(struct rte_swx_ipsec *ipsec,
uint32_t sa_id)
diff --git a/lib/pipeline/rte_swx_ipsec.h b/lib/pipeline/rte_swx_ipsec.h
index 6cff18084f..cfd6140d02 100644
--- a/lib/pipeline/rte_swx_ipsec.h
+++ b/lib/pipeline/rte_swx_ipsec.h
@@ -46,7 +46,6 @@
#include <stdio.h>
#include <netinet/in.h>
-#include <rte_compat.h>
#include <rte_crypto_sym.h>
#include <rte_ip6.h>
@@ -125,7 +124,6 @@ struct rte_swx_ipsec_input_packet_metadata {
* @return
* Valid IPsec instance handle if found or NULL otherwise.
*/
-__rte_experimental
struct rte_swx_ipsec *
rte_swx_ipsec_find(const char *name);
@@ -147,7 +145,6 @@ rte_swx_ipsec_find(const char *name);
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Pipeline with this name already exists.
*/
-__rte_experimental
int
rte_swx_ipsec_create(struct rte_swx_ipsec **ipsec,
const char *name,
@@ -160,7 +157,6 @@ rte_swx_ipsec_create(struct rte_swx_ipsec **ipsec,
* @param[in] ipsec
* IPsec instance handle.
*/
-__rte_experimental
void
rte_swx_ipsec_free(struct rte_swx_ipsec *ipsec);
@@ -174,7 +170,6 @@ rte_swx_ipsec_free(struct rte_swx_ipsec *ipsec);
* @param[in] ipsec
* IPsec instance handle.
*/
-__rte_experimental
void
rte_swx_ipsec_run(struct rte_swx_ipsec *ipsec);
@@ -297,7 +292,6 @@ struct rte_swx_ipsec_sa_params {
* @return
* 0 on success or error code otherwise.
*/
-__rte_experimental
int
rte_swx_ipsec_sa_add(struct rte_swx_ipsec *ipsec,
struct rte_swx_ipsec_sa_params *sa_params,
@@ -314,7 +308,6 @@ rte_swx_ipsec_sa_add(struct rte_swx_ipsec *ipsec,
* @param[in] sa_id
* The SA ID.
*/
-__rte_experimental
void
rte_swx_ipsec_sa_delete(struct rte_swx_ipsec *ipsec,
uint32_t sa_id);
@@ -367,7 +360,6 @@ rte_swx_ipsec_sa_delete(struct rte_swx_ipsec *ipsec,
* @return
* Pointer to valid IPsec SA parameters data structure on success or NULL on error.
*/
-__rte_experimental
struct rte_swx_ipsec_sa_params *
rte_swx_ipsec_sa_read(struct rte_swx_ipsec *ipsec,
const char *string,
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 11/20] pipeline: promote SWX pipeline and control API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (9 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 10/20] pipeline: promote SWX IPsec " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 12/20] power: promote PM QoS and uncore " Stephen Hemminger
` (8 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Cristian Dumitrescu
The rte_swx_pipeline_* symbols date from 20.11, with later additions for
the register and meter arrays (21.05), selector (21.08), learner (21.11),
hash function registration (22.07), pipeline lookup and code generation
(22.11) and RSS (23.03). The rte_swx_ctl_* control plane symbols span the
same range of releases.
The API has been in use unchanged for several releases and is the only
pipeline API remaining now that the legacy rte_pipeline_* API has been
removed, so promote it to stable.
The pipeline and control parts are promoted together because they cannot
be separated: rte_swx_ctl.h declares symbols defined in both
rte_swx_ctl.c and rte_swx_pipeline.c, so dropping __rte_experimental from
that header requires updating the exports in both files at once.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 5 +
lib/pipeline/rte_swx_ctl.c | 34 +++---
lib/pipeline/rte_swx_ctl.h | 61 -----------
lib/pipeline/rte_swx_pipeline.c | 146 ++++++++++++-------------
lib/pipeline/rte_swx_pipeline.h | 32 ------
5 files changed, 95 insertions(+), 183 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index ac8ce1d9a5..fad1a53e04 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -343,6 +343,11 @@ API Changes
``rte_event_port_profile_links_get`` and
``rte_event_port_profile_unlink``
+* pipeline: Promoted the SWX API from experimental to stable:
+ the ``rte_swx_pipeline_*``, ``rte_swx_ctl_*`` and ``rte_swx_ipsec_*``
+ functions in pipeline, the ``rte_swx_table_*`` symbols in table and
+ the ``rte_swx_port_*`` symbols in port.
+
* reorder: Promoted the following API from experimental to stable:
``rte_reorder_seqn``, ``rte_reorder_drain_up_to_seqn``,
``rte_reorder_min_seqn_set`` and ``rte_reorder_memory_footprint_get``.
diff --git a/lib/pipeline/rte_swx_ctl.c b/lib/pipeline/rte_swx_ctl.c
index d24764cbbe..eaa8b7bb28 100644
--- a/lib/pipeline/rte_swx_ctl.c
+++ b/lib/pipeline/rte_swx_ctl.c
@@ -1170,7 +1170,7 @@ static struct rte_tailq_elem rte_swx_ctl_pipeline_tailq = {
EAL_REGISTER_TAILQ(rte_swx_ctl_pipeline_tailq)
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_find, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_find)
struct rte_swx_ctl_pipeline *
rte_swx_ctl_pipeline_find(const char *name)
{
@@ -1250,7 +1250,7 @@ ctl_unregister(struct rte_swx_ctl_pipeline *ctl)
rte_mcfg_tailq_write_unlock();
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_free, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_free)
void
rte_swx_ctl_pipeline_free(struct rte_swx_ctl_pipeline *ctl)
{
@@ -1273,7 +1273,7 @@ rte_swx_ctl_pipeline_free(struct rte_swx_ctl_pipeline *ctl)
free(ctl);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_create, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_create)
struct rte_swx_ctl_pipeline *
rte_swx_ctl_pipeline_create(struct rte_swx_pipeline *p)
{
@@ -1552,7 +1552,7 @@ rte_swx_ctl_pipeline_create(struct rte_swx_pipeline *p)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_table_entry_add, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_table_entry_add)
int
rte_swx_ctl_pipeline_table_entry_add(struct rte_swx_ctl_pipeline *ctl,
const char *table_name,
@@ -1667,7 +1667,7 @@ rte_swx_ctl_pipeline_table_entry_add(struct rte_swx_ctl_pipeline *ctl,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_table_entry_delete, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_table_entry_delete)
int
rte_swx_ctl_pipeline_table_entry_delete(struct rte_swx_ctl_pipeline *ctl,
const char *table_name,
@@ -1758,7 +1758,7 @@ rte_swx_ctl_pipeline_table_entry_delete(struct rte_swx_ctl_pipeline *ctl,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_table_default_entry_add, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_table_default_entry_add)
int
rte_swx_ctl_pipeline_table_default_entry_add(struct rte_swx_ctl_pipeline *ctl,
const char *table_name,
@@ -2096,7 +2096,7 @@ table_abort(struct rte_swx_ctl_pipeline *ctl, uint32_t table_id)
table_pending_default_free(table);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_selector_group_add, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_selector_group_add)
int
rte_swx_ctl_pipeline_selector_group_add(struct rte_swx_ctl_pipeline *ctl,
const char *selector_name,
@@ -2124,7 +2124,7 @@ rte_swx_ctl_pipeline_selector_group_add(struct rte_swx_ctl_pipeline *ctl,
return -ENOSPC;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_selector_group_delete, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_selector_group_delete)
int
rte_swx_ctl_pipeline_selector_group_delete(struct rte_swx_ctl_pipeline *ctl,
const char *selector_name,
@@ -2176,7 +2176,7 @@ rte_swx_ctl_pipeline_selector_group_delete(struct rte_swx_ctl_pipeline *ctl,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_selector_group_member_add, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_selector_group_member_add)
int
rte_swx_ctl_pipeline_selector_group_member_add(struct rte_swx_ctl_pipeline *ctl,
const char *selector_name,
@@ -2236,7 +2236,7 @@ rte_swx_ctl_pipeline_selector_group_member_add(struct rte_swx_ctl_pipeline *ctl,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_selector_group_member_delete, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_selector_group_member_delete)
int
rte_swx_ctl_pipeline_selector_group_member_delete(struct rte_swx_ctl_pipeline *ctl,
const char *selector_name,
@@ -2490,7 +2490,7 @@ learner_default_entry_duplicate(struct rte_swx_ctl_pipeline *ctl,
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_learner_default_entry_add, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_learner_default_entry_add)
int
rte_swx_ctl_pipeline_learner_default_entry_add(struct rte_swx_ctl_pipeline *ctl,
const char *learner_name,
@@ -2564,7 +2564,7 @@ learner_abort(struct rte_swx_ctl_pipeline *ctl, uint32_t learner_id)
learner_pending_default_free(l);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_commit, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_commit)
int
rte_swx_ctl_pipeline_commit(struct rte_swx_ctl_pipeline *ctl, int abort_on_fail)
{
@@ -2651,7 +2651,7 @@ rte_swx_ctl_pipeline_commit(struct rte_swx_ctl_pipeline *ctl, int abort_on_fail)
return status;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_abort, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_abort)
void
rte_swx_ctl_pipeline_abort(struct rte_swx_ctl_pipeline *ctl)
{
@@ -2986,7 +2986,7 @@ token_is_comment(const char *token)
#define RTE_SWX_CTL_ENTRY_TOKENS_MAX 256
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_table_entry_read, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_table_entry_read)
struct rte_swx_table_entry *
rte_swx_ctl_pipeline_table_entry_read(struct rte_swx_ctl_pipeline *ctl,
const char *table_name,
@@ -3186,7 +3186,7 @@ rte_swx_ctl_pipeline_table_entry_read(struct rte_swx_ctl_pipeline *ctl,
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_learner_default_entry_read, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_learner_default_entry_read)
struct rte_swx_table_entry *
rte_swx_ctl_pipeline_learner_default_entry_read(struct rte_swx_ctl_pipeline *ctl,
const char *learner_name,
@@ -3339,7 +3339,7 @@ table_entry_printf(FILE *f,
fprintf(f, "\n");
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_table_fprintf, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_table_fprintf)
int
rte_swx_ctl_pipeline_table_fprintf(FILE *f,
struct rte_swx_ctl_pipeline *ctl,
@@ -3390,7 +3390,7 @@ rte_swx_ctl_pipeline_table_fprintf(FILE *f,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_selector_fprintf, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_selector_fprintf)
int
rte_swx_ctl_pipeline_selector_fprintf(FILE *f,
struct rte_swx_ctl_pipeline *ctl,
diff --git a/lib/pipeline/rte_swx_ctl.h b/lib/pipeline/rte_swx_ctl.h
index c4e63753f5..ee85eea852 100644
--- a/lib/pipeline/rte_swx_ctl.h
+++ b/lib/pipeline/rte_swx_ctl.h
@@ -12,7 +12,6 @@
#include <stdint.h>
#include <stdio.h>
-#include <rte_compat.h>
#include <rte_meter.h>
#include "rte_swx_port.h"
@@ -83,7 +82,6 @@ struct rte_swx_ctl_pipeline_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_info_get(struct rte_swx_pipeline *p,
struct rte_swx_ctl_pipeline_info *pipeline);
@@ -99,7 +97,6 @@ rte_swx_ctl_pipeline_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_numa_node_get(struct rte_swx_pipeline *p,
int *numa_node);
@@ -121,7 +118,6 @@ rte_swx_ctl_pipeline_numa_node_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_port_in_stats_read(struct rte_swx_pipeline *p,
uint32_t port_id,
@@ -140,7 +136,6 @@ rte_swx_ctl_pipeline_port_in_stats_read(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_port_out_stats_read(struct rte_swx_pipeline *p,
uint32_t port_id,
@@ -172,7 +167,6 @@ struct rte_swx_ctl_action_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_action_info_get(struct rte_swx_pipeline *p,
uint32_t action_id,
@@ -208,7 +202,6 @@ struct rte_swx_ctl_action_arg_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_action_arg_info_get(struct rte_swx_pipeline *p,
uint32_t action_id,
@@ -259,7 +252,6 @@ struct rte_swx_ctl_table_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_table_info_get(struct rte_swx_pipeline *p,
uint32_t table_id,
@@ -303,7 +295,6 @@ struct rte_swx_ctl_table_match_field_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_table_match_field_info_get(struct rte_swx_pipeline *p,
uint32_t table_id,
@@ -340,7 +331,6 @@ struct rte_swx_ctl_table_action_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_table_action_info_get(struct rte_swx_pipeline *p,
uint32_t table_id,
@@ -366,7 +356,6 @@ rte_swx_ctl_table_action_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_table_ops_get(struct rte_swx_pipeline *p,
uint32_t table_id,
@@ -405,7 +394,6 @@ struct rte_swx_table_stats {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_table_stats_read(struct rte_swx_pipeline *p,
const char *table_name,
@@ -443,7 +431,6 @@ struct rte_swx_ctl_selector_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_selector_info_get(struct rte_swx_pipeline *p,
uint32_t selector_id,
@@ -462,7 +449,6 @@ rte_swx_ctl_selector_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_selector_group_id_field_info_get(struct rte_swx_pipeline *p,
uint32_t selector_id,
@@ -483,7 +469,6 @@ rte_swx_ctl_selector_group_id_field_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_selector_field_info_get(struct rte_swx_pipeline *p,
uint32_t selector_id,
@@ -503,7 +488,6 @@ rte_swx_ctl_selector_field_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_selector_member_id_field_info_get(struct rte_swx_pipeline *p,
uint32_t selector_id,
@@ -528,7 +512,6 @@ struct rte_swx_pipeline_selector_stats {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_selector_stats_read(struct rte_swx_pipeline *p,
const char *selector_name,
@@ -575,7 +558,6 @@ struct rte_swx_ctl_learner_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_learner_info_get(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -596,7 +578,6 @@ rte_swx_ctl_learner_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_learner_match_field_info_get(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -620,7 +601,6 @@ rte_swx_ctl_learner_match_field_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_learner_action_info_get(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -642,7 +622,6 @@ rte_swx_ctl_learner_action_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_learner_timeout_get(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -664,7 +643,6 @@ rte_swx_ctl_pipeline_learner_timeout_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_learner_timeout_set(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -714,7 +692,6 @@ struct rte_swx_learner_stats {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_learner_stats_read(struct rte_swx_pipeline *p,
const char *learner_name,
@@ -750,7 +727,6 @@ struct rte_swx_pipeline_mirroring_session_params {
* -EINVAL: Invalid argument;
* -EEXIST: Pipeline was already built successfully.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_mirroring_session_set(struct rte_swx_pipeline *p,
uint32_t session_id,
@@ -790,7 +766,6 @@ struct rte_swx_table_state {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_pipeline_table_state_get(struct rte_swx_pipeline *p,
struct rte_swx_table_state **table_state);
@@ -809,7 +784,6 @@ rte_swx_pipeline_table_state_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_pipeline_table_state_set(struct rte_swx_pipeline *p,
struct rte_swx_table_state *table_state);
@@ -829,7 +803,6 @@ struct rte_swx_ctl_pipeline;
* @return
* Valid pipeline control handle if found or NULL otherwise.
*/
-__rte_experimental
struct rte_swx_ctl_pipeline *
rte_swx_ctl_pipeline_find(const char *name);
@@ -841,7 +814,6 @@ rte_swx_ctl_pipeline_find(const char *name);
* @return
* Pipeline control handle, on success, or NULL, on error.
*/
-__rte_experimental
struct rte_swx_ctl_pipeline *
rte_swx_ctl_pipeline_create(struct rte_swx_pipeline *p);
@@ -861,7 +833,6 @@ rte_swx_ctl_pipeline_create(struct rte_swx_pipeline *p);
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_table_entry_add(struct rte_swx_ctl_pipeline *ctl,
const char *table_name,
@@ -883,7 +854,6 @@ rte_swx_ctl_pipeline_table_entry_add(struct rte_swx_ctl_pipeline *ctl,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_table_default_entry_add(struct rte_swx_ctl_pipeline *ctl,
const char *table_name,
@@ -906,7 +876,6 @@ rte_swx_ctl_pipeline_table_default_entry_add(struct rte_swx_ctl_pipeline *ctl,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_table_entry_delete(struct rte_swx_ctl_pipeline *ctl,
const char *table_name,
@@ -931,7 +900,6 @@ rte_swx_ctl_pipeline_table_entry_delete(struct rte_swx_ctl_pipeline *ctl,
* -EINVAL: Invalid argument;
* -ENOSPC: All groups are currently in use, no group available.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_selector_group_add(struct rte_swx_ctl_pipeline *ctl,
const char *selector_name,
@@ -954,7 +922,6 @@ rte_swx_ctl_pipeline_selector_group_add(struct rte_swx_ctl_pipeline *ctl,
* -EINVAL: Invalid argument;
* -ENOMEM: Not enough memory.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_selector_group_delete(struct rte_swx_ctl_pipeline *ctl,
const char *selector_name,
@@ -984,7 +951,6 @@ rte_swx_ctl_pipeline_selector_group_delete(struct rte_swx_ctl_pipeline *ctl,
* -ENOMEM: Not enough memory;
* -ENOSPC: The group is full.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_selector_group_member_add(struct rte_swx_ctl_pipeline *ctl,
const char *selector_name,
@@ -1010,7 +976,6 @@ rte_swx_ctl_pipeline_selector_group_member_add(struct rte_swx_ctl_pipeline *ctl,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_selector_group_member_delete(struct rte_swx_ctl_pipeline *ctl,
const char *selector_name,
@@ -1032,7 +997,6 @@ rte_swx_ctl_pipeline_selector_group_member_delete(struct rte_swx_ctl_pipeline *c
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_learner_default_entry_add(struct rte_swx_ctl_pipeline *ctl,
const char *learner_name,
@@ -1053,7 +1017,6 @@ rte_swx_ctl_pipeline_learner_default_entry_add(struct rte_swx_ctl_pipeline *ctl,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_commit(struct rte_swx_ctl_pipeline *ctl,
int abort_on_fail);
@@ -1066,7 +1029,6 @@ rte_swx_ctl_pipeline_commit(struct rte_swx_ctl_pipeline *ctl,
* @param[in] ctl
* Pipeline control handle.
*/
-__rte_experimental
void
rte_swx_ctl_pipeline_abort(struct rte_swx_ctl_pipeline *ctl);
@@ -1089,7 +1051,6 @@ rte_swx_ctl_pipeline_abort(struct rte_swx_ctl_pipeline *ctl);
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
struct rte_swx_table_entry *
rte_swx_ctl_pipeline_table_entry_read(struct rte_swx_ctl_pipeline *ctl,
const char *table_name,
@@ -1115,7 +1076,6 @@ rte_swx_ctl_pipeline_table_entry_read(struct rte_swx_ctl_pipeline *ctl,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
struct rte_swx_table_entry *
rte_swx_ctl_pipeline_learner_default_entry_read(struct rte_swx_ctl_pipeline *ctl,
const char *learner_name,
@@ -1137,7 +1097,6 @@ rte_swx_ctl_pipeline_learner_default_entry_read(struct rte_swx_ctl_pipeline *ctl
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_table_fprintf(FILE *f,
struct rte_swx_ctl_pipeline *ctl,
@@ -1158,7 +1117,6 @@ rte_swx_ctl_pipeline_table_fprintf(FILE *f,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_selector_fprintf(FILE *f,
struct rte_swx_ctl_pipeline *ctl,
@@ -1190,7 +1148,6 @@ struct rte_swx_ctl_regarray_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_regarray_info_get(struct rte_swx_pipeline *p,
uint32_t regarray_id,
@@ -1211,7 +1168,6 @@ rte_swx_ctl_regarray_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_regarray_read(struct rte_swx_pipeline *p,
const char *regarray_name,
@@ -1233,7 +1189,6 @@ rte_swx_ctl_pipeline_regarray_read(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_regarray_write(struct rte_swx_pipeline *p,
const char *regarray_name,
@@ -1258,7 +1213,6 @@ rte_swx_ctl_pipeline_regarray_write(struct rte_swx_pipeline *p,
* -EINVAL: Invalid argument;
* -ENOMEM: Not enough memory.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_regarray_read_with_key(struct rte_swx_pipeline *p,
const char *regarray_name,
@@ -1284,7 +1238,6 @@ rte_swx_ctl_pipeline_regarray_read_with_key(struct rte_swx_pipeline *p,
* -EINVAL: Invalid argument;
* -ENOMEM: Not enough memory.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_regarray_write_with_key(struct rte_swx_pipeline *p,
const char *regarray_name,
@@ -1318,7 +1271,6 @@ struct rte_swx_ctl_metarray_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_metarray_info_get(struct rte_swx_pipeline *p,
uint32_t metarray_id,
@@ -1339,7 +1291,6 @@ rte_swx_ctl_metarray_info_get(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Meter profile with this name already exists.
*/
-__rte_experimental
int
rte_swx_ctl_meter_profile_add(struct rte_swx_pipeline *p,
const char *name,
@@ -1357,7 +1308,6 @@ rte_swx_ctl_meter_profile_add(struct rte_swx_pipeline *p,
* -EINVAL: Invalid argument;
* -EBUSY: Meter profile is currently in use.
*/
-__rte_experimental
int
rte_swx_ctl_meter_profile_delete(struct rte_swx_pipeline *p,
const char *name);
@@ -1380,7 +1330,6 @@ rte_swx_ctl_meter_profile_delete(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_meter_reset(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -1405,7 +1354,6 @@ rte_swx_ctl_meter_reset(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_meter_set(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -1436,7 +1384,6 @@ struct rte_swx_ctl_meter_stats {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_meter_stats_read(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -1463,7 +1410,6 @@ rte_swx_ctl_meter_stats_read(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_meter_reset_with_key(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -1491,7 +1437,6 @@ rte_swx_ctl_meter_reset_with_key(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_meter_set_with_key(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -1516,7 +1461,6 @@ rte_swx_ctl_meter_set_with_key(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_meter_stats_read_with_key(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -1547,7 +1491,6 @@ struct rte_swx_ctl_rss_info {
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_rss_info_get(struct rte_swx_pipeline *p,
uint32_t rss_obj_id,
@@ -1566,7 +1509,6 @@ rte_swx_ctl_rss_info_get(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_rss_key_size_read(struct rte_swx_pipeline *p,
const char *rss_obj_name,
@@ -1585,7 +1527,6 @@ rte_swx_ctl_pipeline_rss_key_size_read(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_rss_key_read(struct rte_swx_pipeline *p,
const char *rss_obj_name,
@@ -1606,7 +1547,6 @@ rte_swx_ctl_pipeline_rss_key_read(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_ctl_pipeline_rss_key_write(struct rte_swx_pipeline *p,
const char *rss_obj_name,
@@ -1620,7 +1560,6 @@ rte_swx_ctl_pipeline_rss_key_write(struct rte_swx_pipeline *p,
* Pipeline control handle.
* If ctl is NULL, no operation is performed.
*/
-__rte_experimental
void
rte_swx_ctl_pipeline_free(struct rte_swx_ctl_pipeline *ctl);
diff --git a/lib/pipeline/rte_swx_pipeline.c b/lib/pipeline/rte_swx_pipeline.c
index 8ceb1fe88d..5263fa642e 100644
--- a/lib/pipeline/rte_swx_pipeline.c
+++ b/lib/pipeline/rte_swx_pipeline.c
@@ -122,7 +122,7 @@ struct_type_field_find(struct struct_type *st, const char *name)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_struct_type_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_struct_type_register)
int
rte_swx_pipeline_struct_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -254,7 +254,7 @@ port_in_type_find(struct rte_swx_pipeline *p, const char *name)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_port_in_type_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_port_in_type_register)
int
rte_swx_pipeline_port_in_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -298,7 +298,7 @@ port_in_find(struct rte_swx_pipeline *p, uint32_t port_id)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_port_in_config, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_port_in_config)
int
rte_swx_pipeline_port_in_config(struct rte_swx_pipeline *p,
uint32_t port_id,
@@ -417,7 +417,7 @@ port_out_type_find(struct rte_swx_pipeline *p, const char *name)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_port_out_type_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_port_out_type_register)
int
rte_swx_pipeline_port_out_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -463,7 +463,7 @@ port_out_find(struct rte_swx_pipeline *p, uint32_t port_id)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_port_out_config, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_port_out_config)
int
rte_swx_pipeline_port_out_config(struct rte_swx_pipeline *p,
uint32_t port_id,
@@ -570,7 +570,7 @@ port_out_free(struct rte_swx_pipeline *p)
/*
* Packet mirroring.
*/
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_mirroring_config, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_mirroring_config)
int
rte_swx_pipeline_mirroring_config(struct rte_swx_pipeline *p,
struct rte_swx_pipeline_mirroring_params *params)
@@ -767,7 +767,7 @@ extern_obj_mailbox_field_parse(struct rte_swx_pipeline *p,
return f;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_extern_type_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_extern_type_register)
int
rte_swx_pipeline_extern_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -808,7 +808,7 @@ rte_swx_pipeline_extern_type_register(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_extern_type_member_func_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_extern_type_member_func_register)
int
rte_swx_pipeline_extern_type_member_func_register(struct rte_swx_pipeline *p,
const char *extern_type_name,
@@ -846,7 +846,7 @@ rte_swx_pipeline_extern_type_member_func_register(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_extern_object_config, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_extern_object_config)
int
rte_swx_pipeline_extern_object_config(struct rte_swx_pipeline *p,
const char *extern_type_name,
@@ -1063,7 +1063,7 @@ extern_func_mailbox_field_parse(struct rte_swx_pipeline *p,
return f;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_extern_func_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_extern_func_register)
int
rte_swx_pipeline_extern_func_register(struct rte_swx_pipeline *p,
const char *name,
@@ -1192,7 +1192,7 @@ hash_func_find(struct rte_swx_pipeline *p, const char *name)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_hash_func_register, 22.07)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_hash_func_register)
int
rte_swx_pipeline_hash_func_register(struct rte_swx_pipeline *p,
const char *name,
@@ -1293,7 +1293,7 @@ rss_find_by_id(struct rte_swx_pipeline *p, uint32_t rss_obj_id)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_rss_config, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_rss_config)
int
rte_swx_pipeline_rss_config(struct rte_swx_pipeline *p, const char *name)
{
@@ -1471,7 +1471,7 @@ header_field_parse(struct rte_swx_pipeline *p,
return f;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_packet_header_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_packet_header_register)
int
rte_swx_pipeline_packet_header_register(struct rte_swx_pipeline *p,
const char *name,
@@ -1610,7 +1610,7 @@ metadata_field_parse(struct rte_swx_pipeline *p, const char *name)
return struct_type_field_find(p->metadata_st, &name[2]);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_packet_metadata_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_packet_metadata_register)
int
rte_swx_pipeline_packet_metadata_register(struct rte_swx_pipeline *p,
const char *struct_type_name)
@@ -7870,7 +7870,7 @@ action_does_learning(struct action *a)
return 0; /* FALSE */
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_action_config, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_action_config)
int
rte_swx_pipeline_action_config(struct rte_swx_pipeline *p,
const char *name,
@@ -8235,7 +8235,7 @@ table_find_by_id(struct rte_swx_pipeline *p, uint32_t id)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_table_type_register, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_table_type_register)
int
rte_swx_pipeline_table_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -8405,7 +8405,7 @@ table_match_fields_check(struct rte_swx_pipeline *p,
return status;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_table_config, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_table_config)
int
rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
const char *name,
@@ -8909,7 +8909,7 @@ selector_fields_check(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_selector_config, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_selector_config)
int
rte_swx_pipeline_selector_config(struct rte_swx_pipeline *p,
const char *name,
@@ -9382,7 +9382,7 @@ learner_action_learning_check(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_learner_config, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_learner_config)
int
rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
const char *name,
@@ -9956,7 +9956,7 @@ regarray_find_by_id(struct rte_swx_pipeline *p, uint32_t id)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_regarray_config, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_regarray_config)
int
rte_swx_pipeline_regarray_config(struct rte_swx_pipeline *p,
const char *name,
@@ -10095,7 +10095,7 @@ metarray_find_by_id(struct rte_swx_pipeline *p, uint32_t id)
return NULL;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_metarray_config, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_metarray_config)
int
rte_swx_pipeline_metarray_config(struct rte_swx_pipeline *p,
const char *name,
@@ -10246,7 +10246,7 @@ static struct rte_tailq_elem rte_swx_pipeline_tailq = {
EAL_REGISTER_TAILQ(rte_swx_pipeline_tailq)
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_find, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_find)
struct rte_swx_pipeline *
rte_swx_pipeline_find(const char *name)
{
@@ -10326,7 +10326,7 @@ pipeline_unregister(struct rte_swx_pipeline *p)
rte_mcfg_tailq_write_unlock();
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_free, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_free)
void
rte_swx_pipeline_free(struct rte_swx_pipeline *p)
{
@@ -10472,7 +10472,7 @@ hash_funcs_register(struct rte_swx_pipeline *p)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_config, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_config)
int
rte_swx_pipeline_config(struct rte_swx_pipeline **p, const char *name, int numa_node)
{
@@ -10549,7 +10549,7 @@ rte_swx_pipeline_config(struct rte_swx_pipeline **p, const char *name, int numa_
return status;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_instructions_config, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_instructions_config)
int
rte_swx_pipeline_instructions_config(struct rte_swx_pipeline *p,
const char **instructions,
@@ -10572,7 +10572,7 @@ rte_swx_pipeline_instructions_config(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_build, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_build)
int
rte_swx_pipeline_build(struct rte_swx_pipeline *p)
{
@@ -10691,7 +10691,7 @@ rte_swx_pipeline_build(struct rte_swx_pipeline *p)
return status;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_run, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_run)
void
rte_swx_pipeline_run(struct rte_swx_pipeline *p, uint32_t n_instructions)
{
@@ -10701,7 +10701,7 @@ rte_swx_pipeline_run(struct rte_swx_pipeline *p, uint32_t n_instructions)
instr_exec(p);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_flush, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_flush)
void
rte_swx_pipeline_flush(struct rte_swx_pipeline *p)
{
@@ -10718,7 +10718,7 @@ rte_swx_pipeline_flush(struct rte_swx_pipeline *p)
/*
* Control.
*/
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_info_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_info_get)
int
rte_swx_ctl_pipeline_info_get(struct rte_swx_pipeline *p,
struct rte_swx_ctl_pipeline_info *pipeline)
@@ -10752,7 +10752,7 @@ rte_swx_ctl_pipeline_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_numa_node_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_numa_node_get)
int
rte_swx_ctl_pipeline_numa_node_get(struct rte_swx_pipeline *p, int *numa_node)
{
@@ -10763,7 +10763,7 @@ rte_swx_ctl_pipeline_numa_node_get(struct rte_swx_pipeline *p, int *numa_node)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_action_info_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_action_info_get)
int
rte_swx_ctl_action_info_get(struct rte_swx_pipeline *p,
uint32_t action_id,
@@ -10783,7 +10783,7 @@ rte_swx_ctl_action_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_action_arg_info_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_action_arg_info_get)
int
rte_swx_ctl_action_arg_info_get(struct rte_swx_pipeline *p,
uint32_t action_id,
@@ -10808,7 +10808,7 @@ rte_swx_ctl_action_arg_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_table_info_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_table_info_get)
int
rte_swx_ctl_table_info_get(struct rte_swx_pipeline *p,
uint32_t table_id,
@@ -10833,7 +10833,7 @@ rte_swx_ctl_table_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_table_match_field_info_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_table_match_field_info_get)
int
rte_swx_ctl_table_match_field_info_get(struct rte_swx_pipeline *p,
uint32_t table_id,
@@ -10859,7 +10859,7 @@ rte_swx_ctl_table_match_field_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_table_action_info_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_table_action_info_get)
int
rte_swx_ctl_table_action_info_get(struct rte_swx_pipeline *p,
uint32_t table_id,
@@ -10883,7 +10883,7 @@ rte_swx_ctl_table_action_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_table_ops_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_table_ops_get)
int
rte_swx_ctl_table_ops_get(struct rte_swx_pipeline *p,
uint32_t table_id,
@@ -10910,7 +10910,7 @@ rte_swx_ctl_table_ops_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_selector_info_get, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_selector_info_get)
int
rte_swx_ctl_selector_info_get(struct rte_swx_pipeline *p,
uint32_t selector_id,
@@ -10934,7 +10934,7 @@ rte_swx_ctl_selector_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_selector_group_id_field_info_get, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_selector_group_id_field_info_get)
int
rte_swx_ctl_selector_group_id_field_info_get(struct rte_swx_pipeline *p,
uint32_t selector_id,
@@ -10957,7 +10957,7 @@ rte_swx_ctl_selector_group_id_field_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_selector_field_info_get, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_selector_field_info_get)
int
rte_swx_ctl_selector_field_info_get(struct rte_swx_pipeline *p,
uint32_t selector_id,
@@ -10983,7 +10983,7 @@ rte_swx_ctl_selector_field_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_selector_member_id_field_info_get, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_selector_member_id_field_info_get)
int
rte_swx_ctl_selector_member_id_field_info_get(struct rte_swx_pipeline *p,
uint32_t selector_id,
@@ -11006,7 +11006,7 @@ rte_swx_ctl_selector_member_id_field_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_learner_info_get, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_learner_info_get)
int
rte_swx_ctl_learner_info_get(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -11032,7 +11032,7 @@ rte_swx_ctl_learner_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_learner_match_field_info_get, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_learner_match_field_info_get)
int
rte_swx_ctl_learner_match_field_info_get(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -11058,7 +11058,7 @@ rte_swx_ctl_learner_match_field_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_learner_action_info_get, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_learner_action_info_get)
int
rte_swx_ctl_learner_action_info_get(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -11085,7 +11085,7 @@ rte_swx_ctl_learner_action_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_learner_timeout_get, 22.07)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_learner_timeout_get)
int
rte_swx_ctl_pipeline_learner_timeout_get(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -11105,7 +11105,7 @@ rte_swx_ctl_pipeline_learner_timeout_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_learner_timeout_set, 22.07)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_learner_timeout_set)
int
rte_swx_ctl_pipeline_learner_timeout_set(struct rte_swx_pipeline *p,
uint32_t learner_id,
@@ -11137,7 +11137,7 @@ rte_swx_ctl_pipeline_learner_timeout_set(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_table_state_get, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_table_state_get)
int
rte_swx_pipeline_table_state_get(struct rte_swx_pipeline *p,
struct rte_swx_table_state **table_state)
@@ -11149,7 +11149,7 @@ rte_swx_pipeline_table_state_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_table_state_set, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_table_state_set)
int
rte_swx_pipeline_table_state_set(struct rte_swx_pipeline *p,
struct rte_swx_table_state *table_state)
@@ -11161,7 +11161,7 @@ rte_swx_pipeline_table_state_set(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_port_in_stats_read, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_port_in_stats_read)
int
rte_swx_ctl_pipeline_port_in_stats_read(struct rte_swx_pipeline *p,
uint32_t port_id,
@@ -11180,7 +11180,7 @@ rte_swx_ctl_pipeline_port_in_stats_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_port_out_stats_read, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_port_out_stats_read)
int
rte_swx_ctl_pipeline_port_out_stats_read(struct rte_swx_pipeline *p,
uint32_t port_id,
@@ -11199,7 +11199,7 @@ rte_swx_ctl_pipeline_port_out_stats_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_table_stats_read, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_table_stats_read)
int
rte_swx_ctl_pipeline_table_stats_read(struct rte_swx_pipeline *p,
const char *table_name,
@@ -11227,7 +11227,7 @@ rte_swx_ctl_pipeline_table_stats_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_selector_stats_read, 21.08)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_selector_stats_read)
int
rte_swx_ctl_pipeline_selector_stats_read(struct rte_swx_pipeline *p,
const char *selector_name,
@@ -11247,7 +11247,7 @@ rte_swx_ctl_pipeline_selector_stats_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_learner_stats_read, 21.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_learner_stats_read)
int
rte_swx_ctl_pipeline_learner_stats_read(struct rte_swx_pipeline *p,
const char *learner_name,
@@ -11281,7 +11281,7 @@ rte_swx_ctl_pipeline_learner_stats_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_regarray_info_get, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_regarray_info_get)
int
rte_swx_ctl_regarray_info_get(struct rte_swx_pipeline *p,
uint32_t regarray_id,
@@ -11301,7 +11301,7 @@ rte_swx_ctl_regarray_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_regarray_read, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_regarray_read)
int
rte_swx_ctl_pipeline_regarray_read(struct rte_swx_pipeline *p,
const char *regarray_name,
@@ -11323,7 +11323,7 @@ rte_swx_ctl_pipeline_regarray_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_regarray_write, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_regarray_write)
int
rte_swx_ctl_pipeline_regarray_write(struct rte_swx_pipeline *p,
const char *regarray_name,
@@ -11345,7 +11345,7 @@ rte_swx_ctl_pipeline_regarray_write(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_metarray_info_get, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_metarray_info_get)
int
rte_swx_ctl_metarray_info_get(struct rte_swx_pipeline *p,
uint32_t metarray_id,
@@ -11365,7 +11365,7 @@ rte_swx_ctl_metarray_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_meter_profile_add, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_meter_profile_add)
int
rte_swx_ctl_meter_profile_add(struct rte_swx_pipeline *p,
const char *name,
@@ -11398,7 +11398,7 @@ rte_swx_ctl_meter_profile_add(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_meter_profile_delete, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_meter_profile_delete)
int
rte_swx_ctl_meter_profile_delete(struct rte_swx_pipeline *p,
const char *name)
@@ -11419,7 +11419,7 @@ rte_swx_ctl_meter_profile_delete(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_meter_reset, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_meter_reset)
int
rte_swx_ctl_meter_reset(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -11448,7 +11448,7 @@ rte_swx_ctl_meter_reset(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_meter_set, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_meter_set)
int
rte_swx_ctl_meter_set(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -11485,7 +11485,7 @@ rte_swx_ctl_meter_set(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_meter_stats_read, 21.05)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_meter_stats_read)
int
rte_swx_ctl_meter_stats_read(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -11514,7 +11514,7 @@ rte_swx_ctl_meter_stats_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_mirroring_session_set, 20.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_mirroring_session_set)
int
rte_swx_ctl_pipeline_mirroring_session_set(struct rte_swx_pipeline *p,
uint32_t session_id,
@@ -11721,7 +11721,7 @@ rte_swx_ctl_pipeline_table_entry_id_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_regarray_read_with_key, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_regarray_read_with_key)
int
rte_swx_ctl_pipeline_regarray_read_with_key(struct rte_swx_pipeline *p,
const char *regarray_name,
@@ -11739,7 +11739,7 @@ rte_swx_ctl_pipeline_regarray_read_with_key(struct rte_swx_pipeline *p,
return rte_swx_ctl_pipeline_regarray_read(p, regarray_name, entry_id, value);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_regarray_write_with_key, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_regarray_write_with_key)
int
rte_swx_ctl_pipeline_regarray_write_with_key(struct rte_swx_pipeline *p,
const char *regarray_name,
@@ -11757,7 +11757,7 @@ rte_swx_ctl_pipeline_regarray_write_with_key(struct rte_swx_pipeline *p,
return rte_swx_ctl_pipeline_regarray_write(p, regarray_name, entry_id, value);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_meter_reset_with_key, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_meter_reset_with_key)
int
rte_swx_ctl_meter_reset_with_key(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -11774,7 +11774,7 @@ rte_swx_ctl_meter_reset_with_key(struct rte_swx_pipeline *p,
return rte_swx_ctl_meter_reset(p, metarray_name, entry_id);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_meter_set_with_key, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_meter_set_with_key)
int
rte_swx_ctl_meter_set_with_key(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -11792,7 +11792,7 @@ rte_swx_ctl_meter_set_with_key(struct rte_swx_pipeline *p,
return rte_swx_ctl_meter_set(p, metarray_name, entry_id, profile_name);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_meter_stats_read_with_key, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_meter_stats_read_with_key)
int
rte_swx_ctl_meter_stats_read_with_key(struct rte_swx_pipeline *p,
const char *metarray_name,
@@ -11810,7 +11810,7 @@ rte_swx_ctl_meter_stats_read_with_key(struct rte_swx_pipeline *p,
return rte_swx_ctl_meter_stats_read(p, metarray_name, entry_id, stats);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_rss_info_get, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_rss_info_get)
int
rte_swx_ctl_rss_info_get(struct rte_swx_pipeline *p,
uint32_t rss_obj_id,
@@ -11831,7 +11831,7 @@ rte_swx_ctl_rss_info_get(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_rss_key_size_read, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_rss_key_size_read)
int
rte_swx_ctl_pipeline_rss_key_size_read(struct rte_swx_pipeline *p,
const char *rss_name,
@@ -11856,7 +11856,7 @@ rte_swx_ctl_pipeline_rss_key_size_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_rss_key_read, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_rss_key_read)
int
rte_swx_ctl_pipeline_rss_key_read(struct rte_swx_pipeline *p,
const char *rss_name,
@@ -11881,7 +11881,7 @@ rte_swx_ctl_pipeline_rss_key_read(struct rte_swx_pipeline *p,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_ctl_pipeline_rss_key_write, 23.03)
+RTE_EXPORT_SYMBOL(rte_swx_ctl_pipeline_rss_key_write)
int
rte_swx_ctl_pipeline_rss_key_write(struct rte_swx_pipeline *p,
const char *rss_name,
@@ -14583,7 +14583,7 @@ pipeline_adjust(struct rte_swx_pipeline *p, struct instruction_group_list *igl)
instr_jmp_resolve(p->instructions, p->instruction_data, p->n_instructions);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_codegen, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_codegen)
int
rte_swx_pipeline_codegen(FILE *spec_file,
FILE *code_file,
@@ -14677,7 +14677,7 @@ rte_swx_pipeline_codegen(FILE *spec_file,
return status;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_swx_pipeline_build_from_lib, 22.11)
+RTE_EXPORT_SYMBOL(rte_swx_pipeline_build_from_lib)
int
rte_swx_pipeline_build_from_lib(struct rte_swx_pipeline **pipeline,
const char *name,
diff --git a/lib/pipeline/rte_swx_pipeline.h b/lib/pipeline/rte_swx_pipeline.h
index 882bd4bf6f..1eccba4753 100644
--- a/lib/pipeline/rte_swx_pipeline.h
+++ b/lib/pipeline/rte_swx_pipeline.h
@@ -12,8 +12,6 @@
#include <stdint.h>
#include <stdio.h>
-#include <rte_compat.h>
-
#include "rte_swx_port.h"
#include "rte_swx_table.h"
#include "rte_swx_extern.h"
@@ -52,7 +50,6 @@ struct rte_swx_pipeline;
* @return
* Valid pipeline handle if found or NULL otherwise.
*/
-__rte_experimental
struct rte_swx_pipeline *
rte_swx_pipeline_find(const char *name);
@@ -72,7 +69,6 @@ rte_swx_pipeline_find(const char *name);
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Pipeline with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_config(struct rte_swx_pipeline **p,
const char *name,
@@ -97,7 +93,6 @@ rte_swx_pipeline_config(struct rte_swx_pipeline **p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Input port type with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_port_in_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -120,7 +115,6 @@ rte_swx_pipeline_port_in_type_register(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -ENODEV: Input port object creation error.
*/
-__rte_experimental
int
rte_swx_pipeline_port_in_config(struct rte_swx_pipeline *p,
uint32_t port_id,
@@ -146,7 +140,6 @@ rte_swx_pipeline_port_in_config(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Output port type with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_port_out_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -169,7 +162,6 @@ rte_swx_pipeline_port_out_type_register(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -ENODEV: Output port object creation error.
*/
-__rte_experimental
int
rte_swx_pipeline_port_out_config(struct rte_swx_pipeline *p,
uint32_t port_id,
@@ -211,7 +203,6 @@ struct rte_swx_pipeline_mirroring_params {
* -ENOMEM: Not enough memory;
* -EEXIST: Pipeline was already built successfully.
*/
-__rte_experimental
int
rte_swx_pipeline_mirroring_config(struct rte_swx_pipeline *p,
struct rte_swx_pipeline_mirroring_params *params);
@@ -242,7 +233,6 @@ rte_swx_pipeline_mirroring_config(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Extern type with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_extern_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -268,7 +258,6 @@ rte_swx_pipeline_extern_type_register(struct rte_swx_pipeline *p,
* -EEXIST: Member function with this name already exists for this type;
* -ENOSPC: Maximum number of member functions reached for this type.
*/
-__rte_experimental
int
rte_swx_pipeline_extern_type_member_func_register(struct rte_swx_pipeline *p,
const char *extern_type_name,
@@ -295,7 +284,6 @@ rte_swx_pipeline_extern_type_member_func_register(struct rte_swx_pipeline *p,
* -EEXIST: Extern object with this name already exists;
* -ENODEV: Extern object constructor error.
*/
-__rte_experimental
int
rte_swx_pipeline_extern_object_config(struct rte_swx_pipeline *p,
const char *extern_type_name,
@@ -321,7 +309,6 @@ rte_swx_pipeline_extern_object_config(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Extern function with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_extern_func_register(struct rte_swx_pipeline *p,
const char *name,
@@ -346,7 +333,6 @@ rte_swx_pipeline_extern_func_register(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Hash function with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_hash_func_register(struct rte_swx_pipeline *p,
const char *name,
@@ -369,7 +355,6 @@ rte_swx_pipeline_hash_func_register(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: RSS object with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_rss_config(struct rte_swx_pipeline *p,
const char *name);
@@ -425,7 +410,6 @@ struct rte_swx_field_params {
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Struct type with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_struct_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -449,7 +433,6 @@ rte_swx_pipeline_struct_type_register(struct rte_swx_pipeline *p,
* -EEXIST: Header with this name already exists;
* -ENOSPC: Maximum number of headers reached for the pipeline.
*/
-__rte_experimental
int
rte_swx_pipeline_packet_header_register(struct rte_swx_pipeline *p,
const char *name,
@@ -466,7 +449,6 @@ rte_swx_pipeline_packet_header_register(struct rte_swx_pipeline *p,
* 0 on success or the following error codes otherwise:
* -EINVAL: Invalid argument.
*/
-__rte_experimental
int
rte_swx_pipeline_packet_metadata_register(struct rte_swx_pipeline *p,
const char *struct_type_name);
@@ -601,7 +583,6 @@ rte_swx_pipeline_packet_metadata_register(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Action with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_action_config(struct rte_swx_pipeline *p,
const char *name,
@@ -630,7 +611,6 @@ rte_swx_pipeline_action_config(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Table type with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_table_type_register(struct rte_swx_pipeline *p,
const char *name,
@@ -739,7 +719,6 @@ struct rte_swx_pipeline_table_params {
* -EEXIST: Table with this name already exists;
* -ENODEV: Table creation error.
*/
-__rte_experimental
int
rte_swx_pipeline_table_config(struct rte_swx_pipeline *p,
const char *name,
@@ -793,7 +772,6 @@ struct rte_swx_pipeline_selector_params {
* -EEXIST: Selector table with this name already exists;
* -ENODEV: Selector table creation error.
*/
-__rte_experimental
int
rte_swx_pipeline_selector_config(struct rte_swx_pipeline *p,
const char *name,
@@ -881,7 +859,6 @@ struct rte_swx_pipeline_learner_params {
* -EEXIST: Learner table with this name already exists;
* -ENODEV: Learner table creation error.
*/
-__rte_experimental
int
rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
const char *name,
@@ -907,7 +884,6 @@ rte_swx_pipeline_learner_config(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Register array with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_regarray_config(struct rte_swx_pipeline *p,
const char *name,
@@ -930,7 +906,6 @@ rte_swx_pipeline_regarray_config(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Meter array with this name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_metarray_config(struct rte_swx_pipeline *p,
const char *name,
@@ -950,7 +925,6 @@ rte_swx_pipeline_metarray_config(struct rte_swx_pipeline *p,
* -EINVAL: Invalid argument;
* -ENOMEM: Not enough space/cannot allocate memory.
*/
-__rte_experimental
int
rte_swx_pipeline_instructions_config(struct rte_swx_pipeline *p,
const char **instructions,
@@ -971,7 +945,6 @@ rte_swx_pipeline_instructions_config(struct rte_swx_pipeline *p,
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Pipeline was already built successfully.
*/
-__rte_experimental
int
rte_swx_pipeline_build(struct rte_swx_pipeline *p);
@@ -993,7 +966,6 @@ rte_swx_pipeline_build(struct rte_swx_pipeline *p);
* -ENOMEM: Not enough space/cannot allocate memory;
* -EEXIST: Resource with the same name already exists.
*/
-__rte_experimental
int
rte_swx_pipeline_codegen(FILE *spec_file,
FILE *code_file,
@@ -1026,7 +998,6 @@ rte_swx_pipeline_codegen(FILE *spec_file,
* -EEXIST: Pipeline with this name already exists;
* -ENODEV: Extern object or table creation error.
*/
-__rte_experimental
int
rte_swx_pipeline_build_from_lib(struct rte_swx_pipeline **p,
const char *name,
@@ -1042,7 +1013,6 @@ rte_swx_pipeline_build_from_lib(struct rte_swx_pipeline **p,
* @param[in] n_instructions
* Number of instructions to execute.
*/
-__rte_experimental
void
rte_swx_pipeline_run(struct rte_swx_pipeline *p,
uint32_t n_instructions);
@@ -1056,7 +1026,6 @@ rte_swx_pipeline_run(struct rte_swx_pipeline *p,
* Pipeline handle.
* If p is NULL, no operation is performed.
*/
-__rte_experimental
void
rte_swx_pipeline_flush(struct rte_swx_pipeline *p);
@@ -1066,7 +1035,6 @@ rte_swx_pipeline_flush(struct rte_swx_pipeline *p);
* @param[in] p
* Pipeline handle.
*/
-__rte_experimental
void
rte_swx_pipeline_free(struct rte_swx_pipeline *p);
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 12/20] power: promote PM QoS and uncore API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (10 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 11/20] pipeline: promote SWX pipeline and control " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 13/20] ring: promote soring " Stephen Hemminger
` (7 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Anatoly Burakov, Sivaprasad Tummala
The PM QoS API (rte_power_qos_{set,get}_cpu_resume_latency) has been
experimental since 24.11, and the uncore environment and frequency list
functions (rte_power_{set,unset,get}_uncore_env, rte_power_uncore_freqs)
since 23.11.
These interfaces have not changed since they were introduced and the
rest of the uncore API is already stable, so promote them.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 7 +++++++
lib/power/rte_power_qos.c | 4 ++--
lib/power/rte_power_qos.h | 10 ----------
lib/power/rte_power_uncore.c | 8 ++++----
lib/power/rte_power_uncore.h | 5 -----
5 files changed, 13 insertions(+), 21 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index fad1a53e04..e9e9b1f6da 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -348,6 +348,13 @@ API Changes
functions in pipeline, the ``rte_swx_table_*`` symbols in table and
the ``rte_swx_port_*`` symbols in port.
+* power: Promoted the following API from experimental to stable:
+
+ * PM QoS: ``rte_power_qos_set_cpu_resume_latency`` and
+ ``rte_power_qos_get_cpu_resume_latency``
+ * uncore: ``rte_power_set_uncore_env``, ``rte_power_unset_uncore_env``,
+ ``rte_power_get_uncore_env`` and ``rte_power_uncore_freqs``
+
* reorder: Promoted the following API from experimental to stable:
``rte_reorder_seqn``, ``rte_reorder_drain_up_to_seqn``,
``rte_reorder_min_seqn_set`` and ``rte_reorder_memory_footprint_get``.
diff --git a/lib/power/rte_power_qos.c b/lib/power/rte_power_qos.c
index d8d8d36a76..3ecfcc54fa 100644
--- a/lib/power/rte_power_qos.c
+++ b/lib/power/rte_power_qos.c
@@ -18,7 +18,7 @@
#define PM_QOS_CPU_RESUME_LATENCY_BUF_LEN 32
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_power_qos_set_cpu_resume_latency, 24.11)
+RTE_EXPORT_SYMBOL(rte_power_qos_set_cpu_resume_latency)
int
rte_power_qos_set_cpu_resume_latency(uint16_t lcore_id, int latency)
{
@@ -69,7 +69,7 @@ rte_power_qos_set_cpu_resume_latency(uint16_t lcore_id, int latency)
return ret;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_power_qos_get_cpu_resume_latency, 24.11)
+RTE_EXPORT_SYMBOL(rte_power_qos_get_cpu_resume_latency)
int
rte_power_qos_get_cpu_resume_latency(uint16_t lcore_id)
{
diff --git a/lib/power/rte_power_qos.h b/lib/power/rte_power_qos.h
index 05a3f51ae2..d8c5ab92d5 100644
--- a/lib/power/rte_power_qos.h
+++ b/lib/power/rte_power_qos.h
@@ -7,8 +7,6 @@
#include <stdint.h>
-#include <rte_compat.h>
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -36,9 +34,6 @@ extern "C" {
#define RTE_POWER_QOS_RESUME_LATENCY_NO_CONSTRAINT INT32_MAX
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* @param lcore_id
* target logical core id
*
@@ -48,13 +43,9 @@ extern "C" {
* @return
* 0 on success. Otherwise negative value is returned.
*/
-__rte_experimental
int rte_power_qos_set_cpu_resume_latency(uint16_t lcore_id, int latency);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Get the current resume latency of this logical core.
* The default value in kernel is @see RTE_POWER_QOS_RESUME_LATENCY_NO_CONSTRAINT
* if don't set it.
@@ -63,7 +54,6 @@ int rte_power_qos_set_cpu_resume_latency(uint16_t lcore_id, int latency);
* Negative value on failure.
* >= 0 means the actual resume latency limit on this core.
*/
-__rte_experimental
int rte_power_qos_get_cpu_resume_latency(uint16_t lcore_id);
#ifdef __cplusplus
diff --git a/lib/power/rte_power_uncore.c b/lib/power/rte_power_uncore.c
index b50e09a2ad..90e83d9f2a 100644
--- a/lib/power/rte_power_uncore.c
+++ b/lib/power/rte_power_uncore.c
@@ -46,7 +46,7 @@ rte_power_register_uncore_ops(struct rte_power_uncore_ops *driver_ops)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_power_set_uncore_env, 23.11)
+RTE_EXPORT_SYMBOL(rte_power_set_uncore_env)
int
rte_power_set_uncore_env(enum rte_uncore_power_mgmt_env env)
{
@@ -86,7 +86,7 @@ rte_power_set_uncore_env(enum rte_uncore_power_mgmt_env env)
return ret;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_power_unset_uncore_env, 23.11)
+RTE_EXPORT_SYMBOL(rte_power_unset_uncore_env)
void
rte_power_unset_uncore_env(void)
{
@@ -95,7 +95,7 @@ rte_power_unset_uncore_env(void)
rte_spinlock_unlock(&global_env_cfg_lock);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_power_get_uncore_env, 23.11)
+RTE_EXPORT_SYMBOL(rte_power_get_uncore_env)
enum rte_uncore_power_mgmt_env
rte_power_get_uncore_env(void)
{
@@ -180,7 +180,7 @@ rte_power_uncore_freq_min(unsigned int pkg, unsigned int die)
return global_uncore_ops->freq_min(pkg, die);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_power_uncore_freqs, 23.11)
+RTE_EXPORT_SYMBOL(rte_power_uncore_freqs)
int
rte_power_uncore_freqs(unsigned int pkg, unsigned int die,
uint32_t *freqs, uint32_t num)
diff --git a/lib/power/rte_power_uncore.h b/lib/power/rte_power_uncore.h
index 66aea1b37f..9599839d89 100644
--- a/lib/power/rte_power_uncore.h
+++ b/lib/power/rte_power_uncore.h
@@ -11,7 +11,6 @@
* Uncore Frequency Management
*/
-#include <rte_compat.h>
#include <rte_common.h>
#ifdef __cplusplus
@@ -39,14 +38,12 @@ enum rte_uncore_power_mgmt_env {
* - 0 on success.
* - Negative on error.
*/
-__rte_experimental
int rte_power_set_uncore_env(enum rte_uncore_power_mgmt_env env);
/**
* Unset the global uncore environment configuration.
* This can only be called after all threads have completed.
*/
-__rte_experimental
void rte_power_unset_uncore_env(void);
/**
@@ -55,7 +52,6 @@ void rte_power_unset_uncore_env(void);
* @return
* power_management_env The configured environment.
*/
-__rte_experimental
enum rte_uncore_power_mgmt_env rte_power_get_uncore_env(void);
/**
@@ -203,7 +199,6 @@ int rte_power_uncore_freq_min(unsigned int pkg, unsigned int die);
* - The number of available index's in frequency array.
* - Negative on error.
*/
-__rte_experimental
int rte_power_uncore_freqs(unsigned int pkg, unsigned int die,
uint32_t *freqs, uint32_t num);
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 13/20] ring: promote soring API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (11 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 12/20] power: promote PM QoS and uncore " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 14/20] dispatcher: promote " Stephen Hemminger
` (6 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Konstantin Ananyev, Wathsala Vithanage
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
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 14/20] dispatcher: promote API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (12 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 13/20] ring: promote soring " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 15/20] argparse: " Stephen Hemminger
` (5 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Mattias Rönnblom
The dispatcher library was added in 23.11 and none of its functions
have changed since. It has been experimental for two years, which is
long enough to call the interface settled.
Promote all of it: the whole library is covered by a single file level
experimental warning in the header, so there is nothing left to keep
experimental once the symbols are promoted.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 4 ++++
lib/dispatcher/rte_dispatcher.c | 26 +++++++++++++-------------
lib/dispatcher/rte_dispatcher.h | 18 ------------------
3 files changed, 17 insertions(+), 31 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 790b8943c2..5b60203afd 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -223,6 +223,10 @@ API Changes
* cmdline: Promoted ``cmdline_token_bool_ops`` from experimental to stable.
+* dispatcher: Promoted the whole library API from experimental to stable.
+ The ``rte_dispatcher_*`` functions are unchanged since the library was
+ added in 23.11.
+
* eal: Improved pointer arithmetic macros.
* ``RTE_PTR_ADD``, ``RTE_PTR_SUB``, ``RTE_PTR_ALIGN``, ``RTE_PTR_ALIGN_CEIL``,
diff --git a/lib/dispatcher/rte_dispatcher.c b/lib/dispatcher/rte_dispatcher.c
index a35967f7b7..2e8e121ed8 100644
--- a/lib/dispatcher/rte_dispatcher.c
+++ b/lib/dispatcher/rte_dispatcher.c
@@ -267,7 +267,7 @@ evd_service_unregister(struct rte_dispatcher *dispatcher)
return rc;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_create, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_create)
struct rte_dispatcher *
rte_dispatcher_create(uint8_t event_dev_id)
{
@@ -302,7 +302,7 @@ rte_dispatcher_create(uint8_t event_dev_id)
return dispatcher;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_free, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_free)
int
rte_dispatcher_free(struct rte_dispatcher *dispatcher)
{
@@ -320,7 +320,7 @@ rte_dispatcher_free(struct rte_dispatcher *dispatcher)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_service_id_get, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_service_id_get)
uint32_t
rte_dispatcher_service_id_get(const struct rte_dispatcher *dispatcher)
{
@@ -344,7 +344,7 @@ lcore_port_index(struct rte_dispatcher_lcore *lcore,
return -1;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_bind_port_to_lcore, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_bind_port_to_lcore)
int
rte_dispatcher_bind_port_to_lcore(struct rte_dispatcher *dispatcher,
uint8_t event_port_id, uint16_t batch_size, uint64_t timeout,
@@ -374,7 +374,7 @@ rte_dispatcher_bind_port_to_lcore(struct rte_dispatcher *dispatcher,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_unbind_port_from_lcore, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_unbind_port_from_lcore)
int
rte_dispatcher_unbind_port_from_lcore(struct rte_dispatcher *dispatcher,
uint8_t event_port_id, unsigned int lcore_id)
@@ -457,7 +457,7 @@ evd_install_handler(struct rte_dispatcher *dispatcher,
}
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_register, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_register)
int
rte_dispatcher_register(struct rte_dispatcher *dispatcher,
rte_dispatcher_match_t match_fun, void *match_data,
@@ -529,7 +529,7 @@ evd_uninstall_handler(struct rte_dispatcher *dispatcher, int handler_id)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_unregister, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_unregister)
int
rte_dispatcher_unregister(struct rte_dispatcher *dispatcher, int handler_id)
{
@@ -583,7 +583,7 @@ evd_alloc_finalizer(struct rte_dispatcher *dispatcher)
return finalizer;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_finalize_register, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_finalize_register)
int
rte_dispatcher_finalize_register(struct rte_dispatcher *dispatcher,
rte_dispatcher_finalize_t finalize_fun, void *finalize_data)
@@ -601,7 +601,7 @@ rte_dispatcher_finalize_register(struct rte_dispatcher *dispatcher,
return finalizer->id;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_finalize_unregister, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_finalize_unregister)
int
rte_dispatcher_finalize_unregister(struct rte_dispatcher *dispatcher,
int finalizer_id)
@@ -653,14 +653,14 @@ evd_set_service_runstate(struct rte_dispatcher *dispatcher, int state)
RTE_VERIFY(rc == 0);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_start, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_start)
void
rte_dispatcher_start(struct rte_dispatcher *dispatcher)
{
evd_set_service_runstate(dispatcher, 1);
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_stop, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_stop)
void
rte_dispatcher_stop(struct rte_dispatcher *dispatcher)
{
@@ -677,7 +677,7 @@ evd_aggregate_stats(struct rte_dispatcher_stats *result,
result->ev_drop_count += part->ev_drop_count;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_stats_get, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_stats_get)
void
rte_dispatcher_stats_get(const struct rte_dispatcher *dispatcher,
struct rte_dispatcher_stats *stats)
@@ -694,7 +694,7 @@ rte_dispatcher_stats_get(const struct rte_dispatcher *dispatcher,
}
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_dispatcher_stats_reset, 23.11)
+RTE_EXPORT_SYMBOL(rte_dispatcher_stats_reset)
void
rte_dispatcher_stats_reset(struct rte_dispatcher *dispatcher)
{
diff --git a/lib/dispatcher/rte_dispatcher.h b/lib/dispatcher/rte_dispatcher.h
index ba2c353073..9f080be249 100644
--- a/lib/dispatcher/rte_dispatcher.h
+++ b/lib/dispatcher/rte_dispatcher.h
@@ -10,10 +10,6 @@
*
* RTE Dispatcher
*
- * @warning
- * @b EXPERIMENTAL:
- * All functions in this file may be changed or removed without prior notice.
- *
* The purpose of the dispatcher is to help decouple different parts
* of an application (e.g., modules), sharing the same underlying
* event device.
@@ -22,7 +18,6 @@
#include <stdbool.h>
#include <stdint.h>
-#include <rte_compat.h>
#include <rte_eventdev.h>
#ifdef __cplusplus
@@ -127,7 +122,6 @@ struct rte_dispatcher_stats {
* A pointer to a new dispatcher instance, or NULL on failure, in which
* case rte_errno is set.
*/
-__rte_experimental
struct rte_dispatcher *
rte_dispatcher_create(uint8_t event_dev_id);
@@ -141,7 +135,6 @@ rte_dispatcher_create(uint8_t event_dev_id);
* - 0: Success
* - <0: Error code on failure
*/
-__rte_experimental
int
rte_dispatcher_free(struct rte_dispatcher *dispatcher);
@@ -154,7 +147,6 @@ rte_dispatcher_free(struct rte_dispatcher *dispatcher);
* @return
* The dispatcher service's id.
*/
-__rte_experimental
uint32_t
rte_dispatcher_service_id_get(const struct rte_dispatcher *dispatcher);
@@ -199,7 +191,6 @@ rte_dispatcher_service_id_get(const struct rte_dispatcher *dispatcher);
* - -EEXISTS: Event port is already configured.
* - -EINVAL: Invalid arguments.
*/
-__rte_experimental
int
rte_dispatcher_bind_port_to_lcore(struct rte_dispatcher *dispatcher,
uint8_t event_port_id, uint16_t batch_size, uint64_t timeout,
@@ -225,7 +216,6 @@ rte_dispatcher_bind_port_to_lcore(struct rte_dispatcher *dispatcher,
* - 0: Success
* - -ENOENT: Event port id not bound to this @c lcore_id.
*/
-__rte_experimental
int
rte_dispatcher_unbind_port_from_lcore(struct rte_dispatcher *dispatcher,
uint8_t event_port_id, unsigned int lcore_id);
@@ -289,7 +279,6 @@ rte_dispatcher_unbind_port_from_lcore(struct rte_dispatcher *dispatcher,
* - >= 0: The identifier for this registration.
* - -ENOMEM: Unable to allocate sufficient resources.
*/
-__rte_experimental
int
rte_dispatcher_register(struct rte_dispatcher *dispatcher,
rte_dispatcher_match_t match_fun, void *match_cb_data,
@@ -313,7 +302,6 @@ rte_dispatcher_register(struct rte_dispatcher *dispatcher,
* - 0: Success
* - -EINVAL: The @c handler_id parameter was invalid.
*/
-__rte_experimental
int
rte_dispatcher_unregister(struct rte_dispatcher *dispatcher, int handler_id);
@@ -355,7 +343,6 @@ rte_dispatcher_unregister(struct rte_dispatcher *dispatcher, int handler_id);
* - >= 0: The identifier for this registration.
* - -ENOMEM: Unable to allocate sufficient resources.
*/
-__rte_experimental
int
rte_dispatcher_finalize_register(struct rte_dispatcher *dispatcher,
rte_dispatcher_finalize_t finalize_fun, void *finalize_data);
@@ -378,7 +365,6 @@ rte_dispatcher_finalize_register(struct rte_dispatcher *dispatcher,
* - 0: Success
* - -EINVAL: The @c reg_id parameter was invalid.
*/
-__rte_experimental
int
rte_dispatcher_finalize_unregister(struct rte_dispatcher *dispatcher, int reg_id);
@@ -403,7 +389,6 @@ rte_dispatcher_finalize_unregister(struct rte_dispatcher *dispatcher, int reg_id
* @param dispatcher
* The dispatcher instance.
*/
-__rte_experimental
void
rte_dispatcher_start(struct rte_dispatcher *dispatcher);
@@ -415,7 +400,6 @@ rte_dispatcher_start(struct rte_dispatcher *dispatcher);
* @param dispatcher
* The dispatcher instance.
*/
-__rte_experimental
void
rte_dispatcher_stop(struct rte_dispatcher *dispatcher);
@@ -430,7 +414,6 @@ rte_dispatcher_stop(struct rte_dispatcher *dispatcher);
* @param[out] stats
* A pointer to a structure to fill with statistics.
*/
-__rte_experimental
void
rte_dispatcher_stats_get(const struct rte_dispatcher *dispatcher,
struct rte_dispatcher_stats *stats);
@@ -445,7 +428,6 @@ rte_dispatcher_stats_get(const struct rte_dispatcher *dispatcher,
* @param dispatcher
* The dispatcher instance.
*/
-__rte_experimental
void
rte_dispatcher_stats_reset(struct rte_dispatcher *dispatcher);
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 15/20] argparse: promote API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (13 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 14/20] dispatcher: promote " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-08 10:15 ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 16/20] node: " Stephen Hemminger
` (4 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Chengwen Feng
The rte_argparse_parse() and rte_argparse_parse_type() functions were
added in 24.03 and rte_argparse_print_help() in 25.11. No prototype has
changed and they are used by the EAL option parsing as well as several
applications and examples, so the interface is settled.
This promotes the whole library, so the header no longer needs
rte_compat.h.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 2 ++
lib/argparse/rte_argparse.c | 6 +++---
lib/argparse/rte_argparse.h | 13 -------------
3 files changed, 5 insertions(+), 16 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 5b60203afd..afe28eb754 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -221,6 +221,8 @@ API Changes
Also, make sure to start the actual text at the margin.
=======================================================
+* argparse: Promoted the whole library API from experimental to stable.
+
* cmdline: Promoted ``cmdline_token_bool_ops`` from experimental to stable.
* dispatcher: Promoted the whole library API from experimental to stable.
diff --git a/lib/argparse/rte_argparse.c b/lib/argparse/rte_argparse.c
index 88c3e7740c..a056559965 100644
--- a/lib/argparse/rte_argparse.c
+++ b/lib/argparse/rte_argparse.c
@@ -899,7 +899,7 @@ show_args_opt_help(FILE *stream, const struct rte_argparse *obj, uint32_t align)
}
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_argparse_print_help, 25.11)
+RTE_EXPORT_SYMBOL(rte_argparse_print_help)
void
rte_argparse_print_help(FILE *stream, const struct rte_argparse *obj)
{
@@ -918,7 +918,7 @@ rte_argparse_print_help(FILE *stream, const struct rte_argparse *obj)
fprintf(stream, "\n");
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_argparse_parse, 24.03)
+RTE_EXPORT_SYMBOL(rte_argparse_parse)
int
rte_argparse_parse(const struct rte_argparse *obj, int argc, char **argv)
{
@@ -960,7 +960,7 @@ rte_argparse_parse(const struct rte_argparse *obj, int argc, char **argv)
return ret;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_argparse_parse_type, 24.03)
+RTE_EXPORT_SYMBOL(rte_argparse_parse_type)
int
rte_argparse_parse_type(const char *str, enum rte_argparse_value_type val_type, void *val)
{
diff --git a/lib/argparse/rte_argparse.h b/lib/argparse/rte_argparse.h
index f184c9c37d..467bd2edd8 100644
--- a/lib/argparse/rte_argparse.h
+++ b/lib/argparse/rte_argparse.h
@@ -30,7 +30,6 @@
#include <stdint.h>
#include <rte_bitops.h>
-#include <rte_compat.h>
#ifdef __cplusplus
extern "C" {
@@ -181,9 +180,6 @@ struct rte_argparse {
#define ARGPARSE_ARG_END() { NULL }
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Parse parameters passed until all are processed,
* or until a "--" parameter is encountered.
*
@@ -198,13 +194,9 @@ struct rte_argparse {
* number of arguments parsed (>= 0) on success.
* Otherwise negative error code is returned.
*/
-__rte_experimental
int rte_argparse_parse(const struct rte_argparse *obj, int argc, char **argv);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Output the help text information for the given argparse object.
*
* @param stream
@@ -212,13 +204,9 @@ int rte_argparse_parse(const struct rte_argparse *obj, int argc, char **argv);
* @param obj
* Parser object.
*/
-__rte_experimental
void rte_argparse_print_help(FILE *stream, const struct rte_argparse *obj);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Parse the value from the input string based on the value type.
*
* @param str
@@ -231,7 +219,6 @@ void rte_argparse_print_help(FILE *stream, const struct rte_argparse *obj);
* @return
* 0 on success. Otherwise negative value is returned.
*/
-__rte_experimental
int rte_argparse_parse_type(const char *str, enum rte_argparse_value_type val_type, void *val);
#ifdef __cplusplus
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 16/20] node: promote API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (14 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 15/20] argparse: " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 17/20] hash: promote RCU reclaim and thash key generation " Stephen Hemminger
` (3 subsequent siblings)
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Nithin Dabilpuram, Pavan Nikhilesh
The node control path functions were added between 23.07 and 25.07 and
none of the prototypes have changed. They are used by the graph
application and the l3fwd-graph example.
Most of the node headers carried a file level warning claiming that all
functions in the file may be changed or removed. That warning was
already wrong, since rte_node_ip4_route_add() and friends have been
stable for years while sitting under it.
Promote the whole library and drop those warnings. An API that cannot
be declared stable after several releases of use is not useful to
applications and should be removed instead.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 4 ++++
lib/node/ethdev_ctrl.c | 2 +-
lib/node/ip4_lookup_fib.c | 4 ++--
lib/node/ip4_reassembly.c | 2 +-
lib/node/ip6_lookup.c | 2 +-
lib/node/ip6_lookup_fib.c | 4 ++--
lib/node/ip6_rewrite.c | 2 +-
lib/node/node_mbuf_dynfield.c | 2 +-
lib/node/rte_node_eth_api.h | 6 ------
lib/node/rte_node_ip4_api.h | 9 ---------
lib/node/rte_node_ip6_api.h | 9 ---------
lib/node/rte_node_mbuf_dynfield.h | 6 ------
lib/node/rte_node_pkt_cls_api.h | 4 ----
lib/node/rte_node_udp4_input_api.h | 8 --------
lib/node/udp4_input.c | 4 ++--
15 files changed, 15 insertions(+), 53 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index afe28eb754..009db40708 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -349,6 +349,10 @@ API Changes
``rte_event_port_profile_links_get`` and
``rte_event_port_profile_unlink``
+* node: Promoted the whole library API from experimental to stable.
+ The ``rte_node_*`` control path functions date from 23.07 to 25.07 and
+ are used by the graph application and the l3fwd-graph example.
+
* pipeline: Promoted the SWX API from experimental to stable:
the ``rte_swx_pipeline_*``, ``rte_swx_ctl_*`` and ``rte_swx_ipsec_*``
functions in pipeline, the ``rte_swx_table_*`` symbols in table and
diff --git a/lib/node/ethdev_ctrl.c b/lib/node/ethdev_ctrl.c
index f717903731..3018920c79 100644
--- a/lib/node/ethdev_ctrl.c
+++ b/lib/node/ethdev_ctrl.c
@@ -141,7 +141,7 @@ rte_node_eth_config(struct rte_node_ethdev_config *conf, uint16_t nb_confs,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_ethdev_rx_next_update, 24.03)
+RTE_EXPORT_SYMBOL(rte_node_ethdev_rx_next_update)
int
rte_node_ethdev_rx_next_update(rte_node_t id, const char *edge_name)
{
diff --git a/lib/node/ip4_lookup_fib.c b/lib/node/ip4_lookup_fib.c
index 0857d889fc..3757c2880f 100644
--- a/lib/node/ip4_lookup_fib.c
+++ b/lib/node/ip4_lookup_fib.c
@@ -193,7 +193,7 @@ ip4_lookup_fib_node_process(struct rte_graph *graph, struct rte_node *node, void
return nb_objs;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_ip4_fib_create, 25.07)
+RTE_EXPORT_SYMBOL(rte_node_ip4_fib_create)
int
rte_node_ip4_fib_create(int socket, struct rte_fib_conf *conf)
{
@@ -213,7 +213,7 @@ rte_node_ip4_fib_create(int socket, struct rte_fib_conf *conf)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_ip4_fib_route_add, 25.07)
+RTE_EXPORT_SYMBOL(rte_node_ip4_fib_route_add)
int
rte_node_ip4_fib_route_add(uint32_t ip, uint8_t depth, uint16_t next_hop,
enum rte_node_ip4_lookup_next next_node)
diff --git a/lib/node/ip4_reassembly.c b/lib/node/ip4_reassembly.c
index b61ddfd7d1..f6d858bc70 100644
--- a/lib/node/ip4_reassembly.c
+++ b/lib/node/ip4_reassembly.c
@@ -128,7 +128,7 @@ ip4_reassembly_node_process(struct rte_graph *graph, struct rte_node *node, void
return idx;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_ip4_reassembly_configure, 23.11)
+RTE_EXPORT_SYMBOL(rte_node_ip4_reassembly_configure)
int
rte_node_ip4_reassembly_configure(struct rte_node_ip4_reassembly_cfg *cfg, uint16_t cnt)
{
diff --git a/lib/node/ip6_lookup.c b/lib/node/ip6_lookup.c
index 83c0500c76..679405bc53 100644
--- a/lib/node/ip6_lookup.c
+++ b/lib/node/ip6_lookup.c
@@ -258,7 +258,7 @@ ip6_lookup_node_process_scalar(struct rte_graph *graph, struct rte_node *node,
return nb_objs;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_ip6_route_add, 23.07)
+RTE_EXPORT_SYMBOL(rte_node_ip6_route_add)
int
rte_node_ip6_route_add(const struct rte_ipv6_addr *ip, uint8_t depth, uint16_t next_hop,
enum rte_node_ip6_lookup_next next_node)
diff --git a/lib/node/ip6_lookup_fib.c b/lib/node/ip6_lookup_fib.c
index 40c5c753df..74e1127b32 100644
--- a/lib/node/ip6_lookup_fib.c
+++ b/lib/node/ip6_lookup_fib.c
@@ -187,7 +187,7 @@ ip6_lookup_fib_node_process(struct rte_graph *graph, struct rte_node *node, void
return nb_objs;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_ip6_fib_create, 25.07)
+RTE_EXPORT_SYMBOL(rte_node_ip6_fib_create)
int
rte_node_ip6_fib_create(int socket, struct rte_fib6_conf *conf)
{
@@ -207,7 +207,7 @@ rte_node_ip6_fib_create(int socket, struct rte_fib6_conf *conf)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_ip6_fib_route_add, 25.07)
+RTE_EXPORT_SYMBOL(rte_node_ip6_fib_route_add)
int
rte_node_ip6_fib_route_add(const struct rte_ipv6_addr *ip, uint8_t depth, uint16_t next_hop,
enum rte_node_ip6_lookup_next next_node)
diff --git a/lib/node/ip6_rewrite.c b/lib/node/ip6_rewrite.c
index d5488e7fa3..2f43cbefe5 100644
--- a/lib/node/ip6_rewrite.c
+++ b/lib/node/ip6_rewrite.c
@@ -273,7 +273,7 @@ ip6_rewrite_set_next(uint16_t port_id, uint16_t next_index)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_ip6_rewrite_add, 23.07)
+RTE_EXPORT_SYMBOL(rte_node_ip6_rewrite_add)
int
rte_node_ip6_rewrite_add(uint16_t next_hop, uint8_t *rewrite_data,
uint8_t rewrite_len, uint16_t dst_port)
diff --git a/lib/node/node_mbuf_dynfield.c b/lib/node/node_mbuf_dynfield.c
index 9dbc80f7e5..a018a66b38 100644
--- a/lib/node/node_mbuf_dynfield.c
+++ b/lib/node/node_mbuf_dynfield.c
@@ -20,7 +20,7 @@ static const struct rte_mbuf_dynfield node_mbuf_dynfield_desc = {
.align = alignof(rte_node_mbuf_dynfield_t),
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_mbuf_dynfield_register, 25.07);
+RTE_EXPORT_SYMBOL(rte_node_mbuf_dynfield_register)
int rte_node_mbuf_dynfield_register(void)
{
struct node_mbuf_dynfield_mz *f = NULL;
diff --git a/lib/node/rte_node_eth_api.h b/lib/node/rte_node_eth_api.h
index e9221d113b..1b74706ad9 100644
--- a/lib/node/rte_node_eth_api.h
+++ b/lib/node/rte_node_eth_api.h
@@ -8,15 +8,10 @@
/**
* @file rte_node_eth_api.h
*
- * @warning
- * @b EXPERIMENTAL:
- * All functions in this file may be changed or removed without prior notice.
- *
* This API allows setting up ethdev_rx and ethdev_tx nodes
* and its queue associations.
*/
-#include <rte_compat.h>
#include <rte_common.h>
#include <rte_graph.h>
#include <rte_mempool.h>
@@ -72,7 +67,6 @@ int rte_node_eth_config(struct rte_node_ethdev_config *cfg,
* - ENOMEM: If memory allocation failed
* - 0 on successful initialization.
*/
-__rte_experimental
int rte_node_ethdev_rx_next_update(rte_node_t id, const char *edge_name);
#ifdef __cplusplus
diff --git a/lib/node/rte_node_ip4_api.h b/lib/node/rte_node_ip4_api.h
index b7bb9216b1..5c1d9013d4 100644
--- a/lib/node/rte_node_ip4_api.h
+++ b/lib/node/rte_node_ip4_api.h
@@ -8,16 +8,10 @@
/**
* @file rte_node_ip4_api.h
*
- * @warning
- * @b EXPERIMENTAL:
- * All functions in this file may be changed or removed without prior notice.
- *
* This API allows performing control path functions of ip4_* nodes
* like ip4_lookup, ip4_rewrite.
*/
#include <rte_common.h>
-#include <rte_compat.h>
-
#include <rte_fib.h>
#include <rte_graph.h>
@@ -119,7 +113,6 @@ int rte_node_ip4_rewrite_add(uint16_t next_hop, uint8_t *rewrite_data,
* @return
* 0 on success, negative otherwise.
*/
-__rte_experimental
int rte_node_ip4_reassembly_configure(struct rte_node_ip4_reassembly_cfg *cfg, uint16_t cnt);
/**
@@ -133,7 +126,6 @@ int rte_node_ip4_reassembly_configure(struct rte_node_ip4_reassembly_cfg *cfg, u
* @return
* 0 on success, negative otherwise.
*/
-__rte_experimental
int rte_node_ip4_fib_create(int socket, struct rte_fib_conf *conf);
/**
@@ -151,7 +143,6 @@ int rte_node_ip4_fib_create(int socket, struct rte_fib_conf *conf);
* @return
* 0 on success, negative otherwise.
*/
-__rte_experimental
int rte_node_ip4_fib_route_add(uint32_t ip, uint8_t depth, uint16_t next_hop,
enum rte_node_ip4_lookup_next next_node);
diff --git a/lib/node/rte_node_ip6_api.h b/lib/node/rte_node_ip6_api.h
index c0cdc3926a..0be90c93de 100644
--- a/lib/node/rte_node_ip6_api.h
+++ b/lib/node/rte_node_ip6_api.h
@@ -8,15 +8,10 @@
/**
* @file rte_node_ip6_api.h
*
- * @warning
- * @b EXPERIMENTAL:
- * All functions in this file may be changed or removed without prior notice.
- *
* This API allows performing control path functions of ip6_* nodes
* like ip6_lookup, ip6_rewrite.
*/
#include <rte_common.h>
-#include <rte_compat.h>
#include <rte_fib6.h>
#include <rte_ip6.h>
@@ -49,7 +44,6 @@ enum rte_node_ip6_lookup_next {
* @return
* 0 on success, negative otherwise.
*/
-__rte_experimental
int rte_node_ip6_route_add(const struct rte_ipv6_addr *ip, uint8_t depth, uint16_t next_hop,
enum rte_node_ip6_lookup_next next_node);
@@ -68,7 +62,6 @@ int rte_node_ip6_route_add(const struct rte_ipv6_addr *ip, uint8_t depth, uint16
* @return
* 0 on success, negative otherwise.
*/
-__rte_experimental
int rte_node_ip6_rewrite_add(uint16_t next_hop, uint8_t *rewrite_data,
uint8_t rewrite_len, uint16_t dst_port);
@@ -83,7 +76,6 @@ int rte_node_ip6_rewrite_add(uint16_t next_hop, uint8_t *rewrite_data,
* @return
* 0 on success, negative otherwise.
*/
-__rte_experimental
int rte_node_ip6_fib_create(int socket, struct rte_fib6_conf *conf);
/**
@@ -101,7 +93,6 @@ int rte_node_ip6_fib_create(int socket, struct rte_fib6_conf *conf);
* @return
* 0 on success, negative otherwise.
*/
-__rte_experimental
int rte_node_ip6_fib_route_add(const struct rte_ipv6_addr *ip, uint8_t depth, uint16_t next_hop,
enum rte_node_ip6_lookup_next next_node);
diff --git a/lib/node/rte_node_mbuf_dynfield.h b/lib/node/rte_node_mbuf_dynfield.h
index 09254c585a..f9edaee8c2 100644
--- a/lib/node/rte_node_mbuf_dynfield.h
+++ b/lib/node/rte_node_mbuf_dynfield.h
@@ -12,9 +12,6 @@
/**
* @file: rte_node_mbuf_dynfield.h
*
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Defines rte_node specific mbuf dynamic field region [rte_node_mbuf_dynfield_t]
* which can be used by both DPDK built-in and out-of-tree nodes
* for storing per-mbuf fields for graph walk.
@@ -102,7 +99,6 @@ typedef struct rte_node_mbuf_dynfield {
* @return
* Pointer to node specific mbuf dynamic field structure
*/
-__rte_experimental
static __rte_always_inline rte_node_mbuf_dynfield_t *
rte_node_mbuf_dynfield_get(struct rte_mbuf *m, const int offset)
{
@@ -120,7 +116,6 @@ rte_node_mbuf_dynfield_get(struct rte_mbuf *m, const int offset)
* @return
* Pointer to node mbuf overloadable fields
*/
-__rte_experimental
static __rte_always_inline rte_node_mbuf_overload_fields_t *
rte_node_mbuf_overload_fields_get(struct rte_mbuf *m, const int offset)
{
@@ -148,7 +143,6 @@ rte_node_mbuf_overload_fields_get(struct rte_mbuf *m, const int offset)
* - ENOMEM - no memory
* >=0 on success: dynamic field offset
*/
-__rte_experimental
int rte_node_mbuf_dynfield_register(void);
#ifdef __cplusplus
diff --git a/lib/node/rte_node_pkt_cls_api.h b/lib/node/rte_node_pkt_cls_api.h
index 6f824b4f1f..6785626d11 100644
--- a/lib/node/rte_node_pkt_cls_api.h
+++ b/lib/node/rte_node_pkt_cls_api.h
@@ -8,10 +8,6 @@
/**
* @file rte_node_pkt_cls_api.h
*
- * @warning
- * @b EXPERIMENTAL:
- * All functions in this file may be changed or removed without prior notice.
- *
* This API allows performing control path functions of pkt_cls node.
*/
diff --git a/lib/node/rte_node_udp4_input_api.h b/lib/node/rte_node_udp4_input_api.h
index 50f37b8bd9..72cb188721 100644
--- a/lib/node/rte_node_udp4_input_api.h
+++ b/lib/node/rte_node_udp4_input_api.h
@@ -8,16 +8,10 @@
/**
* @file rte_node_udp4_input_api.h
*
- * @warning
- * @b EXPERIMENTAL:
- * All functions in this file may be changed or removed without prior notice.
- *
* This API allows performing control path functions of udp4_* nodes
* like udp4_input.
*/
#include <rte_common.h>
-#include <rte_compat.h>
-
#include "rte_graph.h"
#ifdef __cplusplus
@@ -37,7 +31,6 @@ enum rte_node_udp4_input_next {
* @param usr_node
* Node registered by user to receive data.
*/
-__rte_experimental
int rte_node_udp4_usr_node_add(const char *usr_node);
/**
@@ -50,7 +43,6 @@ int rte_node_udp4_usr_node_add(const char *usr_node);
* @return
* 0 on success, negative otherwise.
*/
-__rte_experimental
int rte_node_udp4_dst_port_add(uint32_t dst_port, rte_edge_t next_node);
#ifdef __cplusplus
diff --git a/lib/node/udp4_input.c b/lib/node/udp4_input.c
index 5a74e28c85..2dc0c7a6da 100644
--- a/lib/node/udp4_input.c
+++ b/lib/node/udp4_input.c
@@ -56,7 +56,7 @@ static struct rte_hash_parameters udp4_params = {
.socket_id = 0,
};
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_udp4_dst_port_add, 23.11)
+RTE_EXPORT_SYMBOL(rte_node_udp4_dst_port_add)
int
rte_node_udp4_dst_port_add(uint32_t dst_port, rte_edge_t next_node)
{
@@ -78,7 +78,7 @@ rte_node_udp4_dst_port_add(uint32_t dst_port, rte_edge_t next_node)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_node_udp4_usr_node_add, 23.11)
+RTE_EXPORT_SYMBOL(rte_node_udp4_usr_node_add)
int
rte_node_udp4_usr_node_add(const char *usr_node)
{
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 17/20] hash: promote RCU reclaim and thash key generation to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (15 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 16/20] node: " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-08 10:16 ` Bruce Richardson
2026-10-07 21:39 ` [PATCH 18/20] cryptodev: promote algorithm helpers " Stephen Hemminger
` (2 subsequent siblings)
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev
Cc: Stephen Hemminger, Yipeng Wang, Sameh Gobriel, Bruce Richardson,
Vladimir Medvedkin
rte_hash_rcu_qsbr_dq_reclaim() was added in 24.07 and
rte_thash_gen_key() in 24.11. Neither prototype has changed and the
rest of both APIs is already stable.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 3 +++
lib/hash/rte_cuckoo_hash.c | 2 +-
lib/hash/rte_hash.h | 1 -
lib/hash/rte_thash.c | 2 +-
lib/hash/rte_thash.h | 4 ----
5 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 009db40708..f689f08338 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -349,6 +349,9 @@ API Changes
``rte_event_port_profile_links_get`` and
``rte_event_port_profile_unlink``
+* hash: Promoted ``rte_hash_rcu_qsbr_dq_reclaim`` and ``rte_thash_gen_key``
+ from experimental to stable.
+
* node: Promoted the whole library API from experimental to stable.
The ``rte_node_*`` control path functions date from 23.07 to 25.07 and
are used by the graph application and the l3fwd-graph example.
diff --git a/lib/hash/rte_cuckoo_hash.c b/lib/hash/rte_cuckoo_hash.c
index 5d495ae973..f01b796200 100644
--- a/lib/hash/rte_cuckoo_hash.c
+++ b/lib/hash/rte_cuckoo_hash.c
@@ -1921,7 +1921,7 @@ rte_hash_rcu_qsbr_add(struct rte_hash *h, struct rte_hash_rcu_config *cfg)
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_hash_rcu_qsbr_dq_reclaim, 24.07)
+RTE_EXPORT_SYMBOL(rte_hash_rcu_qsbr_dq_reclaim)
int rte_hash_rcu_qsbr_dq_reclaim(struct rte_hash *h, unsigned int *freed, unsigned int *pending,
unsigned int *available)
{
diff --git a/lib/hash/rte_hash.h b/lib/hash/rte_hash.h
index e33f0aea0f..4435941537 100644
--- a/lib/hash/rte_hash.h
+++ b/lib/hash/rte_hash.h
@@ -700,7 +700,6 @@ int rte_hash_rcu_qsbr_add(struct rte_hash *h, struct rte_hash_rcu_config *cfg);
* Possible rte_errno codes are:
* - EINVAL - invalid pointer
*/
-__rte_experimental
int rte_hash_rcu_qsbr_dq_reclaim(struct rte_hash *h, unsigned int *freed,
unsigned int *pending, unsigned int *available);
diff --git a/lib/hash/rte_thash.c b/lib/hash/rte_thash.c
index fcd41248b9..10f3f978dc 100644
--- a/lib/hash/rte_thash.c
+++ b/lib/hash/rte_thash.c
@@ -836,7 +836,7 @@ rte_thash_adjust_tuple(struct rte_thash_ctx *ctx,
return ret;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_thash_gen_key, 24.11)
+RTE_EXPORT_SYMBOL(rte_thash_gen_key)
int
rte_thash_gen_key(uint8_t *key, size_t key_len, size_t reta_sz_log,
uint32_t entropy_start, size_t entropy_sz)
diff --git a/lib/hash/rte_thash.h b/lib/hash/rte_thash.h
index 8bca430663..f0e382277a 100644
--- a/lib/hash/rte_thash.h
+++ b/lib/hash/rte_thash.h
@@ -465,9 +465,6 @@ rte_thash_adjust_tuple(struct rte_thash_ctx *ctx,
rte_thash_check_tuple_t fn, void *userdata);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Modify RSS hash key such that subtuple bits corresponding to `entropy_sz`
* bits starting from `entropy_start` will have the most even distribution with
* this key with a given ReTa size.
@@ -488,7 +485,6 @@ rte_thash_adjust_tuple(struct rte_thash_ctx *ctx,
* @return
* 0 on success negative otherwise
*/
-__rte_experimental
int
rte_thash_gen_key(uint8_t *key, size_t key_len, size_t reta_sz_log,
uint32_t entropy_start, size_t entropy_sz);
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 18/20] cryptodev: promote algorithm helpers to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (16 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 17/20] hash: promote RCU reclaim and thash key generation " Stephen Hemminger
@ 2026-10-07 21:39 ` 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
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Akhil Goyal, Fan Zhang
The algorithm name lookup helpers were added in 23.03 and the
asymmetric opcap check in 24.11. The inline raw enqueue/dequeue and
mbuf-to-vec helpers date back to 21.05. None of them have changed and
all are driver independent.
The queue pair reset, event error query and queue pair depth functions
are left experimental. They are currently implemented only by
crypto/cnxk, so the interface should not be frozen before a second
driver has tried to use it.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 4 ++++
lib/cryptodev/rte_crypto_sym.h | 2 --
lib/cryptodev/rte_cryptodev.c | 10 +++++-----
lib/cryptodev/rte_cryptodev.h | 10 ----------
4 files changed, 9 insertions(+), 17 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index f689f08338..6055c1edee 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -225,6 +225,10 @@ API Changes
* cmdline: Promoted ``cmdline_token_bool_ops`` from experimental to stable.
+* cryptodev: Promoted the algorithm name helpers and the asymmetric
+ capability check from experimental to stable, along with the inline
+ raw enqueue/dequeue and mbuf-to-vec helpers.
+
* dispatcher: Promoted the whole library API from experimental to stable.
The ``rte_dispatcher_*`` functions are unchanged since the library was
added in 23.11.
diff --git a/lib/cryptodev/rte_crypto_sym.h b/lib/cryptodev/rte_crypto_sym.h
index 630fd153bd..9bf5e63ce1 100644
--- a/lib/cryptodev/rte_crypto_sym.h
+++ b/lib/cryptodev/rte_crypto_sym.h
@@ -16,7 +16,6 @@
#include <string.h>
-#include <rte_compat.h>
#include <rte_mbuf.h>
#include <rte_memory.h>
#include <rte_mempool.h>
@@ -983,7 +982,6 @@ __rte_crypto_sym_op_attach_sym_session(struct rte_crypto_sym_op *sym_op, void *s
* - number of successfully filled entries in *vec* array.
* - negative number of elements in *vec* array required.
*/
-__rte_experimental
static inline int
rte_crypto_mbuf_to_vec(const struct rte_mbuf *mb, uint32_t ofs, uint32_t len,
struct rte_crypto_vec vec[], uint32_t num)
diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c
index 829a5d0846..f2d2e5c864 100644
--- a/lib/cryptodev/rte_cryptodev.c
+++ b/lib/cryptodev/rte_cryptodev.c
@@ -407,7 +407,7 @@ rte_cryptodev_asym_get_xform_enum(enum rte_crypto_asym_xform_type *xform_enum,
return ret;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_get_cipher_algo_string, 23.03)
+RTE_EXPORT_SYMBOL(rte_cryptodev_get_cipher_algo_string)
const char *
rte_cryptodev_get_cipher_algo_string(enum rte_crypto_cipher_algorithm algo_enum)
{
@@ -421,7 +421,7 @@ rte_cryptodev_get_cipher_algo_string(enum rte_crypto_cipher_algorithm algo_enum)
return alg_str;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_get_auth_algo_string, 23.03)
+RTE_EXPORT_SYMBOL(rte_cryptodev_get_auth_algo_string)
const char *
rte_cryptodev_get_auth_algo_string(enum rte_crypto_auth_algorithm algo_enum)
{
@@ -435,7 +435,7 @@ rte_cryptodev_get_auth_algo_string(enum rte_crypto_auth_algorithm algo_enum)
return alg_str;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_get_aead_algo_string, 23.03)
+RTE_EXPORT_SYMBOL(rte_cryptodev_get_aead_algo_string)
const char *
rte_cryptodev_get_aead_algo_string(enum rte_crypto_aead_algorithm algo_enum)
{
@@ -449,7 +449,7 @@ rte_cryptodev_get_aead_algo_string(enum rte_crypto_aead_algorithm algo_enum)
return alg_str;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_asym_get_xform_string, 23.03)
+RTE_EXPORT_SYMBOL(rte_cryptodev_asym_get_xform_string)
const char *
rte_cryptodev_asym_get_xform_string(enum rte_crypto_asym_xform_type xform_enum)
{
@@ -731,7 +731,7 @@ rte_cryptodev_asym_xform_capability_check_hash(
return ret;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_asym_xform_capability_check_opcap, 24.11)
+RTE_EXPORT_SYMBOL(rte_cryptodev_asym_xform_capability_check_opcap)
int
rte_cryptodev_asym_xform_capability_check_opcap(
const struct rte_cryptodev_asymmetric_xform_capability *capability,
diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
index 37a6a5e49b..b8c00fe576 100644
--- a/lib/cryptodev/rte_cryptodev.h
+++ b/lib/cryptodev/rte_cryptodev.h
@@ -372,9 +372,6 @@ rte_cryptodev_asym_xform_capability_check_hash(
enum rte_crypto_auth_algorithm hash);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Check if op capability is supported
*
* @param capability Description of the asymmetric crypto capability.
@@ -385,7 +382,6 @@ rte_cryptodev_asym_xform_capability_check_hash(
* - Return 1 if the op capability is supported
* - Return 0 if unsupported
*/
-__rte_experimental
int
rte_cryptodev_asym_xform_capability_check_opcap(
const struct rte_cryptodev_asymmetric_xform_capability *capability,
@@ -460,7 +456,6 @@ rte_cryptodev_asym_get_xform_enum(enum rte_crypto_asym_xform_type *xform_enum,
* - Return NULL if enum is not valid
* - Return algo_string corresponding to enum
*/
-__rte_experimental
const char *
rte_cryptodev_get_cipher_algo_string(enum rte_crypto_cipher_algorithm algo_enum);
@@ -473,7 +468,6 @@ rte_cryptodev_get_cipher_algo_string(enum rte_crypto_cipher_algorithm algo_enum)
* - Return NULL if enum is not valid
* - Return algo_string corresponding to enum
*/
-__rte_experimental
const char *
rte_cryptodev_get_auth_algo_string(enum rte_crypto_auth_algorithm algo_enum);
@@ -486,7 +480,6 @@ rte_cryptodev_get_auth_algo_string(enum rte_crypto_auth_algorithm algo_enum);
* - Return NULL if enum is not valid
* - Return algo_string corresponding to enum
*/
-__rte_experimental
const char *
rte_cryptodev_get_aead_algo_string(enum rte_crypto_aead_algorithm algo_enum);
@@ -499,7 +492,6 @@ rte_cryptodev_get_aead_algo_string(enum rte_crypto_aead_algorithm algo_enum);
* - Return NULL, if enum is not valid.
* - Return xform string, for valid enum.
*/
-__rte_experimental
const char *
rte_cryptodev_asym_get_xform_string(enum rte_crypto_asym_xform_type xform_enum);
@@ -1690,7 +1682,6 @@ rte_cryptodev_raw_enqueue_burst(struct rte_crypto_raw_dp_ctx *ctx,
* until rte_cryptodev_raw_enqueue_done() is called.
* - negative integer: failure.
*/
-__rte_experimental
static __rte_always_inline int
rte_cryptodev_raw_enqueue(struct rte_crypto_raw_dp_ctx *ctx,
struct rte_crypto_vec *data_vec, uint16_t n_data_vecs,
@@ -1790,7 +1781,6 @@ rte_cryptodev_raw_dequeue_burst(struct rte_crypto_raw_dp_ctx *ctx,
* - The user data pointer retrieved from device queue or NULL if no
* operation is ready for dequeue.
*/
-__rte_experimental
static __rte_always_inline void *
rte_cryptodev_raw_dequeue(struct rte_crypto_raw_dp_ctx *ctx,
int *dequeue_status, enum rte_crypto_op_status *op_status)
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 19/20] pdcp: promote API to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (17 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 18/20] cryptodev: promote algorithm helpers " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-07 21:39 ` [PATCH 20/20] mempool: promote memory range and alignment " Stephen Hemminger
19 siblings, 0 replies; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Anoob Joseph, Volodymyr Fialko
The PDCP library was added in 23.07 and none of its functions have
changed since. The whole library was experimental, including the inline
packet pre and post process helpers, so there is nothing left to keep
experimental once the symbols are promoted.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 4 ++++
lib/pdcp/rte_pdcp.c | 10 ++++-----
lib/pdcp/rte_pdcp.h | 29 --------------------------
lib/pdcp/rte_pdcp_group.h | 6 ------
4 files changed, 9 insertions(+), 40 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 6055c1edee..1fb9251dbf 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -360,6 +360,10 @@ API Changes
The ``rte_node_*`` control path functions date from 23.07 to 25.07 and
are used by the graph application and the l3fwd-graph example.
+* pdcp: Promoted the whole library API from experimental to stable.
+ The ``rte_pdcp_*`` functions are unchanged since the library was added
+ in 23.07.
+
* pipeline: Promoted the SWX API from experimental to stable:
the ``rte_swx_pipeline_*``, ``rte_swx_ctl_*`` and ``rte_swx_ipsec_*``
functions in pipeline, the ``rte_swx_table_*`` symbols in table and
diff --git a/lib/pdcp/rte_pdcp.c b/lib/pdcp/rte_pdcp.c
index d21df8ab43..4bdb5c9adb 100644
--- a/lib/pdcp/rte_pdcp.c
+++ b/lib/pdcp/rte_pdcp.c
@@ -98,7 +98,7 @@ pdcp_dl_establish(struct rte_pdcp_entity *entity, const struct rte_pdcp_entity_c
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pdcp_entity_establish, 23.07)
+RTE_EXPORT_SYMBOL(rte_pdcp_entity_establish)
struct rte_pdcp_entity *
rte_pdcp_entity_establish(const struct rte_pdcp_entity_conf *conf)
{
@@ -199,7 +199,7 @@ pdcp_dl_release(struct rte_pdcp_entity *entity, struct rte_mbuf *out_mb[])
return nb_out;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pdcp_entity_release, 23.07)
+RTE_EXPORT_SYMBOL(rte_pdcp_entity_release)
int
rte_pdcp_entity_release(struct rte_pdcp_entity *pdcp_entity, struct rte_mbuf *out_mb[])
{
@@ -222,7 +222,7 @@ rte_pdcp_entity_release(struct rte_pdcp_entity *pdcp_entity, struct rte_mbuf *ou
return nb_out;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pdcp_entity_suspend, 23.07)
+RTE_EXPORT_SYMBOL(rte_pdcp_entity_suspend)
int
rte_pdcp_entity_suspend(struct rte_pdcp_entity *pdcp_entity,
struct rte_mbuf *out_mb[])
@@ -250,7 +250,7 @@ rte_pdcp_entity_suspend(struct rte_pdcp_entity *pdcp_entity,
return nb_out;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pdcp_control_pdu_create, 23.07)
+RTE_EXPORT_SYMBOL(rte_pdcp_control_pdu_create)
struct rte_mbuf *
rte_pdcp_control_pdu_create(struct rte_pdcp_entity *pdcp_entity,
enum rte_pdcp_ctrl_pdu_type type)
@@ -291,7 +291,7 @@ rte_pdcp_control_pdu_create(struct rte_pdcp_entity *pdcp_entity,
return m;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_pdcp_t_reordering_expiry_handle, 23.07)
+RTE_EXPORT_SYMBOL(rte_pdcp_t_reordering_expiry_handle)
uint16_t
rte_pdcp_t_reordering_expiry_handle(const struct rte_pdcp_entity *entity, struct rte_mbuf *out_mb[])
{
diff --git a/lib/pdcp/rte_pdcp.h b/lib/pdcp/rte_pdcp.h
index 15fcbf9607..b8aad9f525 100644
--- a/lib/pdcp/rte_pdcp.h
+++ b/lib/pdcp/rte_pdcp.h
@@ -13,7 +13,6 @@
* A framework for PDCP protocol processing.
*/
-#include <rte_compat.h>
#include <rte_common.h>
#include <rte_mempool.h>
#include <rte_pdcp_hdr.h>
@@ -161,9 +160,6 @@ struct rte_pdcp_entity_conf {
/* >8 End of structure rte_pdcp_entity_conf. */
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* 5.1.1 PDCP entity establishment
*
* Establish PDCP entity based on provided input configuration.
@@ -174,14 +170,10 @@ struct rte_pdcp_entity_conf {
* - Valid handle if success
* - NULL in case of failure. rte_errno will be set to error code.
*/
-__rte_experimental
struct rte_pdcp_entity *
rte_pdcp_entity_establish(const struct rte_pdcp_entity_conf *conf);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* 5.1.3 PDCP entity release
*
* Release PDCP entity.
@@ -204,15 +196,11 @@ rte_pdcp_entity_establish(const struct rte_pdcp_entity_conf *conf);
* - >0: Success and the number of packets returned in out_mb
* - <0: Error code in case of failures
*/
-__rte_experimental
int
rte_pdcp_entity_release(struct rte_pdcp_entity *pdcp_entity,
struct rte_mbuf *out_mb[]);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* 5.1.4 PDCP entity suspend
*
* Suspend PDCP entity.
@@ -233,15 +221,11 @@ rte_pdcp_entity_release(struct rte_pdcp_entity *pdcp_entity,
* - >0: Success and the number of packets returned in out_mb.
* - <0: Error code in case of failures.
*/
-__rte_experimental
int
rte_pdcp_entity_suspend(struct rte_pdcp_entity *pdcp_entity,
struct rte_mbuf *out_mb[]);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Create control PDU packet of the `type` specified. The control PDU packet
* would be allocated from *rte_pdcp_entity_conf.ctrl_pdu_pool* by lib PDCP.
*
@@ -253,15 +237,11 @@ rte_pdcp_entity_suspend(struct rte_pdcp_entity *pdcp_entity,
* - Control PDU generated, in case of success.
* - NULL in case of failure. rte_errno will be set to error code.
*/
-__rte_experimental
struct rte_mbuf *
rte_pdcp_control_pdu_create(struct rte_pdcp_entity *pdcp_entity,
enum rte_pdcp_ctrl_pdu_type type);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* For input mbufs and given PDCP entity pre-process the mbufs and prepare
* crypto ops that can be enqueued to the cryptodev associated with given
* session. Only error packets would be moved returned in the input buffer,
@@ -284,7 +264,6 @@ rte_pdcp_control_pdu_create(struct rte_pdcp_entity *pdcp_entity,
* @return
* Count of crypto_ops prepared.
*/
-__rte_experimental
static inline uint16_t
rte_pdcp_pkt_pre_process(const struct rte_pdcp_entity *entity,
struct rte_mbuf *mb[], struct rte_crypto_op *cop[],
@@ -294,9 +273,6 @@ rte_pdcp_pkt_pre_process(const struct rte_pdcp_entity *entity,
}
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* For input mbufs and given PDCP entity, perform PDCP post-processing of the mbufs.
*
* Input mbufs are the ones retrieved from rte_crypto_ops dequeued from cryptodev
@@ -325,7 +301,6 @@ rte_pdcp_pkt_pre_process(const struct rte_pdcp_entity *entity,
* @return
* Count of packets returned in *out_mb* buffer.
*/
-__rte_experimental
static inline uint16_t
rte_pdcp_pkt_post_process(const struct rte_pdcp_entity *entity,
struct rte_mbuf *in_mb[],
@@ -336,9 +311,6 @@ rte_pdcp_pkt_post_process(const struct rte_pdcp_entity *entity,
}
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
* 5.2.2.2 Actions when a t-Reordering expires
*
* When t-Reordering timer expires, PDCP is required to slide the reception
@@ -358,7 +330,6 @@ rte_pdcp_pkt_post_process(const struct rte_pdcp_entity *entity,
* @return
* Number of packets returned in *out_mb* buffer.
*/
-__rte_experimental
uint16_t
rte_pdcp_t_reordering_expiry_handle(const struct rte_pdcp_entity *entity,
struct rte_mbuf *out_mb[]);
diff --git a/lib/pdcp/rte_pdcp_group.h b/lib/pdcp/rte_pdcp_group.h
index f6a94ff587..cbc2111bdf 100644
--- a/lib/pdcp/rte_pdcp_group.h
+++ b/lib/pdcp/rte_pdcp_group.h
@@ -37,9 +37,6 @@ struct rte_pdcp_group {
};
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Take crypto-op as an input and extract pointer to related PDCP entity.
* @param cop
* The address of an input *rte_crypto_op* structure.
@@ -56,9 +53,6 @@ rte_pdcp_en_from_cop(const struct rte_crypto_op *cop)
}
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Take as input completed crypto ops, extract related mbufs and group them by
* *rte_pdcp_entity* they belong to. Mbuf for which the crypto operation has
* failed would be flagged using *RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED* flag
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [PATCH 20/20] mempool: promote memory range and alignment to stable
2026-10-07 21:39 [PATCH 00/20] promote long standing experimental API to stable Stephen Hemminger
` (18 preceding siblings ...)
2026-10-07 21:39 ` [PATCH 19/20] pdcp: promote API " Stephen Hemminger
@ 2026-10-07 21:39 ` Stephen Hemminger
2026-10-08 7:19 ` Morten Brørup
19 siblings, 1 reply; 30+ messages in thread
From: Stephen Hemminger @ 2026-10-07 21:39 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Andrew Rybchenko, Morten Brørup
rte_mempool_get_mem_range() and rte_mempool_get_obj_alignment() were
added in 24.07 and have not changed since. The bulk of the mempool API
is already stable.
The trace points and rte_mempool_stats_reset() from 26.07 are left
experimental.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
doc/guides/rel_notes/release_26_11.rst | 3 +++
lib/mempool/rte_mempool.c | 4 ++--
lib/mempool/rte_mempool.h | 8 --------
3 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
index 1fb9251dbf..48ecf23b00 100644
--- a/doc/guides/rel_notes/release_26_11.rst
+++ b/doc/guides/rel_notes/release_26_11.rst
@@ -356,6 +356,9 @@ API Changes
* hash: Promoted ``rte_hash_rcu_qsbr_dq_reclaim`` and ``rte_thash_gen_key``
from experimental to stable.
+* mempool: Promoted ``rte_mempool_get_mem_range`` and
+ ``rte_mempool_get_obj_alignment`` from experimental to stable.
+
* node: Promoted the whole library API from experimental to stable.
The ``rte_node_*`` control path functions date from 23.07 to 25.07 and
are used by the graph application and the l3fwd-graph example.
diff --git a/lib/mempool/rte_mempool.c b/lib/mempool/rte_mempool.c
index 817e2b8dc1..39a652527b 100644
--- a/lib/mempool/rte_mempool.c
+++ b/lib/mempool/rte_mempool.c
@@ -1444,7 +1444,7 @@ void rte_mempool_walk(void (*func)(struct rte_mempool *, void *),
rte_mcfg_mempool_read_unlock();
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_mempool_get_mem_range, 24.07)
+RTE_EXPORT_SYMBOL(rte_mempool_get_mem_range)
int rte_mempool_get_mem_range(const struct rte_mempool *mp,
struct rte_mempool_mem_range_info *mem_range)
{
@@ -1479,7 +1479,7 @@ int rte_mempool_get_mem_range(const struct rte_mempool *mp,
return 0;
}
-RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_mempool_get_obj_alignment, 24.07)
+RTE_EXPORT_SYMBOL(rte_mempool_get_obj_alignment)
size_t rte_mempool_get_obj_alignment(const struct rte_mempool *mp)
{
if (mp == NULL)
diff --git a/lib/mempool/rte_mempool.h b/lib/mempool/rte_mempool.h
index 40c3f26087..239d20935c 100644
--- a/lib/mempool/rte_mempool.h
+++ b/lib/mempool/rte_mempool.h
@@ -1966,9 +1966,6 @@ struct rte_mempool_mem_range_info {
};
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Get information about the memory range used to store objects in the mempool.
*
* @param[in] mp
@@ -1980,15 +1977,11 @@ struct rte_mempool_mem_range_info {
* @return
* 0 on success, -EINVAL if mempool is not valid or mem_range is NULL.
*/
-__rte_experimental
int
rte_mempool_get_mem_range(const struct rte_mempool *mp,
struct rte_mempool_mem_range_info *mem_range);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice.
- *
* Return alignment of objects stored in the mempool.
*
* @param[in] mp
@@ -1996,7 +1989,6 @@ rte_mempool_get_mem_range(const struct rte_mempool *mp,
* @return
* Object alignment if mp is valid. 0 if mp is NULL.
*/
-__rte_experimental
size_t
rte_mempool_get_obj_alignment(const struct rte_mempool *mp);
--
2.53.0
^ permalink raw reply related [flat|nested] 30+ messages in thread
* RE: [PATCH 20/20] mempool: promote memory range and alignment to stable
2026-10-07 21:39 ` [PATCH 20/20] mempool: promote memory range and alignment " Stephen Hemminger
@ 2026-10-08 7:19 ` Morten Brørup
0 siblings, 0 replies; 30+ messages in thread
From: Morten Brørup @ 2026-10-08 7:19 UTC (permalink / raw)
To: Stephen Hemminger, dev; +Cc: Andrew Rybchenko
> From: Stephen Hemminger [mailto:stephen@networkplumber.org]
> Sent: Wednesday, 7 October 2026 23.40
>
> rte_mempool_get_mem_range() and rte_mempool_get_obj_alignment() were
> added in 24.07 and have not changed since. The bulk of the mempool API
> is already stable.
>
> The trace points and rte_mempool_stats_reset() from 26.07 are left
> experimental.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
Acked-by: Morten Brørup <mb@smartsharesystems.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 01/20] eal: add missing export for rte_basename
2026-10-07 21:39 ` [PATCH 01/20] eal: add missing export for rte_basename Stephen Hemminger
@ 2026-10-08 9:56 ` Bruce Richardson
0 siblings, 0 replies; 30+ messages in thread
From: Bruce Richardson @ 2026-10-08 9:56 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev, stable, Dmitry Kozlyuk
On Wed, Oct 07, 2026 at 02:39:31PM -0700, Stephen Hemminger wrote:
> The export for rte_basename was missed on the Windows version.
> If it is a public API it needs to be on all OS's supported.
>
> Fixes: b8a75ece45fe ("eal: add basename function for common path manipulation")
> Cc: stable@dpdk.org
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> lib/eal/windows/rte_basename.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/lib/eal/windows/rte_basename.c b/lib/eal/windows/rte_basename.c
> index f4dfc08a0a..ede913e6c1 100644
> --- a/lib/eal/windows/rte_basename.c
> +++ b/lib/eal/windows/rte_basename.c
> @@ -4,8 +4,10 @@
>
> #include <string.h>
> #include <stdlib.h>
> +#include <eal_export.h>
> #include <rte_string_fns.h>
>
> +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_basename, 25.11)
> size_t
> rte_basename(const char *path, char *buf, size_t buflen)
> {
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 02/20] eal: promote rte_basename to stable
2026-10-07 21:39 ` [PATCH 02/20] eal: promote rte_basename to stable Stephen Hemminger
@ 2026-10-08 9:56 ` Bruce Richardson
0 siblings, 0 replies; 30+ messages in thread
From: Bruce Richardson @ 2026-10-08 9:56 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev, Dmitry Kozlyuk
On Wed, Oct 07, 2026 at 02:39:32PM -0700, Stephen Hemminger wrote:
> rte_basename() was added in 25.11 as a portable replacement for
> basename(), whose behaviour differs between the POSIX and GNU versions.
> The prototype has not changed.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 03/20] eal: promote explicit zero and sensitive free to stable
2026-10-07 21:39 ` [PATCH 03/20] eal: promote explicit zero and sensitive free " Stephen Hemminger
@ 2026-10-08 10:01 ` Bruce Richardson
0 siblings, 0 replies; 30+ messages in thread
From: Bruce Richardson @ 2026-10-08 10:01 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev, Anatoly Burakov
On Wed, Oct 07, 2026 at 02:39:33PM -0700, Stephen Hemminger wrote:
> rte_memzero_explicit() and rte_free_sensitive() were added in 25.07 and
> have not changed since. They are used by the QAT crypto driver for
> asymmetric and symmetric session keys and by the ixgbe IPsec code, which
> are exactly the sensitive data paths they exist for.
>
> An API for clearing keys is of little use to applications while it is
> marked as subject to change, so promote it.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 04/20] eal: promote rte_size_to_str to stable
2026-10-07 21:39 ` [PATCH 04/20] eal: promote rte_size_to_str " Stephen Hemminger
@ 2026-10-08 10:01 ` Bruce Richardson
0 siblings, 0 replies; 30+ messages in thread
From: Bruce Richardson @ 2026-10-08 10:01 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev
On Wed, Oct 07, 2026 at 02:39:34PM -0700, Stephen Hemminger wrote:
> rte_size_to_str() was added in 25.07 and has not changed. Its
> counterpart rte_str_to_size() is already stable.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> lib/eal/common/eal_common_string_fns.c | 2 +-
> lib/eal/include/rte_common.h | 4 ----
> 2 files changed, 1 insertion(+), 5 deletions(-)
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 05/20] eal: promote lcore variables API to stable
2026-10-07 21:39 ` [PATCH 05/20] eal: promote lcore variables API " Stephen Hemminger
@ 2026-10-08 10:04 ` Bruce Richardson
0 siblings, 0 replies; 30+ messages in thread
From: Bruce Richardson @ 2026-10-08 10:04 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev, Mattias Rönnblom
On Wed, Oct 07, 2026 at 02:39:35PM -0700, Stephen Hemminger wrote:
> rte_lcore_var_alloc() was added in 24.11 and has not changed. The
> RTE_LCORE_VAR_* macros that form the public interface were never marked
> experimental, so the header carried a file level warning while the
> macros applications actually use looked stable.
>
> The API is used by rte_random, rte_service, the x86 power intrinsics and
> the power PMD management code. Promote the allocator and drop the file
> level warning.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
See comment inline below though.
> doc/guides/rel_notes/release_26_11.rst | 4 ++++
> lib/eal/common/eal_common_lcore_var.c | 2 +-
> lib/eal/include/rte_lcore_var.h | 3 ---
> 3 files changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
> index 934efaaf93..62e7df5728 100644
> --- a/doc/guides/rel_notes/release_26_11.rst
> +++ b/doc/guides/rel_notes/release_26_11.rst
> @@ -240,6 +240,10 @@ API Changes
> are now declared with an alignment of 1 on all architectures.
> The compiler may generate narrower loads and stores than before.
>
> +* eal: Promoted ``rte_memzero_explicit``, ``rte_free_sensitive``,
> + ``rte_basename``, ``rte_size_to_str`` and the lcore variables API
> + from experimental to stable.
> +
> * ethdev: Updated VMDq related API.
>
This would be better done as a bulleted list so it can be easily added to
by patches. Patch 2 of this set should start by adding to release note:
* Promoted the following APIs to stable:
- ``rte_basename`` in EAL
with the later patches adding a new bullet each time.
> * At port configuration time, the number of VMDq pools advertised by a driver
> diff --git a/lib/eal/common/eal_common_lcore_var.c b/lib/eal/common/eal_common_lcore_var.c
> index 8a7920ed0f..a2af0e19d8 100644
> --- a/lib/eal/common/eal_common_lcore_var.c
> +++ b/lib/eal/common/eal_common_lcore_var.c
> @@ -76,7 +76,7 @@ lcore_var_alloc(size_t size, size_t align)
> return handle;
> }
>
> -RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_lcore_var_alloc, 24.11)
> +RTE_EXPORT_SYMBOL(rte_lcore_var_alloc)
> void *
> rte_lcore_var_alloc(size_t size, size_t align)
> {
> diff --git a/lib/eal/include/rte_lcore_var.h b/lib/eal/include/rte_lcore_var.h
> index 48b022e84e..2737ae947b 100644
> --- a/lib/eal/include/rte_lcore_var.h
> +++ b/lib/eal/include/rte_lcore_var.h
> @@ -15,8 +15,6 @@
> *
> * Please refer to the lcore variables' programmer's guide
> * for an overview of this API and its implementation.
> - *
> - * EXPERIMENTAL: this API may change, or be removed, without prior notice.
> */
>
> #include <stddef.h>
> @@ -199,7 +197,6 @@ rte_lcore_var_lcore(unsigned int lcore_id, void *handle)
> * The variable's handle, stored in a void pointer value.
> * The value is always non-NULL.
> */
> -__rte_experimental
> void *
> rte_lcore_var_alloc(size_t size, size_t align)
> __rte_alloc_align(2);
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 06/20] cmdline: promote bool token ops to stable
2026-10-07 21:39 ` [PATCH 06/20] cmdline: promote bool token ops " Stephen Hemminger
@ 2026-10-08 10:05 ` Bruce Richardson
0 siblings, 0 replies; 30+ messages in thread
From: Bruce Richardson @ 2026-10-08 10:05 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev
On Wed, Oct 07, 2026 at 02:39:36PM -0700, Stephen Hemminger wrote:
> The cmdline_token_bool_ops structure was added in 25.03 and has not
> changed. It was the only experimental symbol left in the cmdline
> library, where the other 69 exports are already stable.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> doc/guides/rel_notes/release_26_11.rst | 2 ++
> lib/cmdline/cmdline_parse_bool.c | 2 +-
> 2 files changed, 3 insertions(+), 1 deletion(-)
>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Though see previous comment about release note entries. This might be
better just as a bullet under a main stabilization heading.
> diff --git a/doc/guides/rel_notes/release_26_11.rst b/doc/guides/rel_notes/release_26_11.rst
> index 62e7df5728..3ad6ba2d81 100644
> --- a/doc/guides/rel_notes/release_26_11.rst
> +++ b/doc/guides/rel_notes/release_26_11.rst
> @@ -221,6 +221,8 @@ API Changes
> Also, make sure to start the actual text at the margin.
> =======================================================
>
> +* cmdline: Promoted ``cmdline_token_bool_ops`` from experimental to stable.
> +
> * eal: Improved pointer arithmetic macros.
>
> * ``RTE_PTR_ADD``, ``RTE_PTR_SUB``, ``RTE_PTR_ALIGN``, ``RTE_PTR_ALIGN_CEIL``,
> diff --git a/lib/cmdline/cmdline_parse_bool.c b/lib/cmdline/cmdline_parse_bool.c
> index d5d5499531..ef41d2bc17 100644
> --- a/lib/cmdline/cmdline_parse_bool.c
> +++ b/lib/cmdline/cmdline_parse_bool.c
> @@ -18,7 +18,7 @@ cmdline_get_help_bool(cmdline_parse_token_hdr_t *tk, char *dstbuf,
> unsigned int size);
>
>
> -RTE_EXPORT_EXPERIMENTAL_SYMBOL(cmdline_token_bool_ops, 25.03)
> +RTE_EXPORT_SYMBOL(cmdline_token_bool_ops)
> struct cmdline_token_ops cmdline_token_bool_ops = {
> .parse = cmdline_parse_bool,
> .complete_get_nb = NULL,
> --
> 2.53.0
>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 15/20] argparse: promote API to stable
2026-10-07 21:39 ` [PATCH 15/20] argparse: " Stephen Hemminger
@ 2026-10-08 10:15 ` Bruce Richardson
0 siblings, 0 replies; 30+ messages in thread
From: Bruce Richardson @ 2026-10-08 10:15 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev, Chengwen Feng
On Wed, Oct 07, 2026 at 02:39:45PM -0700, Stephen Hemminger wrote:
> The rte_argparse_parse() and rte_argparse_parse_type() functions were
> added in 24.03 and rte_argparse_print_help() in 25.11. No prototype has
> changed and they are used by the EAL option parsing as well as several
> applications and examples, so the interface is settled.
>
> This promotes the whole library, so the header no longer needs
> rte_compat.h.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> doc/guides/rel_notes/release_26_11.rst | 2 ++
> lib/argparse/rte_argparse.c | 6 +++---
> lib/argparse/rte_argparse.h | 13 -------------
> 3 files changed, 5 insertions(+), 16 deletions(-)
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [PATCH 17/20] hash: promote RCU reclaim and thash key generation to stable
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
0 siblings, 0 replies; 30+ messages in thread
From: Bruce Richardson @ 2026-10-08 10:16 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: dev, Yipeng Wang, Sameh Gobriel, Vladimir Medvedkin
On Wed, Oct 07, 2026 at 02:39:47PM -0700, Stephen Hemminger wrote:
> rte_hash_rcu_qsbr_dq_reclaim() was added in 24.07 and
> rte_thash_gen_key() in 24.11. Neither prototype has changed and the
> rest of both APIs is already stable.
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> doc/guides/rel_notes/release_26_11.rst | 3 +++
> lib/hash/rte_cuckoo_hash.c | 2 +-
> lib/hash/rte_hash.h | 1 -
> lib/hash/rte_thash.c | 2 +-
> lib/hash/rte_thash.h | 4 ----
> 5 files changed, 5 insertions(+), 7 deletions(-)
>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2026-10-08 10:16 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH 13/20] ring: promote soring " Stephen Hemminger
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-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
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.