* [PATCH v5 20/24] net/txgbe: replace rte_atomic32 with stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Jiawen Wu, Zaiyu Wang
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The swfw_busy flag guarding the AML SW-FW mailbox is a one-bit lock,
so convert it to RTE_ATOMIC(bool) and replace the legacy
test-and-set / clear pair with explicit acquire-release:
rte_atomic32_test_and_set ->
rte_atomic_exchange_explicit(.., true, acquire)
rte_atomic32_clear ->
rte_atomic_store_explicit(.., false, release)
Acquire on the take pairs with release on the drop, so accesses
inside the critical section are synchronized between successive
holders. Default zero-initialization of struct txgbe_hw still
gives swfw_busy = false, so no init site needs updating.
Note:
The previous rte_atomic32_test_and_set return value was
inverted relative to what this code expected; this patch
incidentally corrects that. A standalone Fixes: patch is
queued in net-next.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/txgbe/base/txgbe_mng.c | 4 ++--
drivers/net/txgbe/base/txgbe_type.h | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/txgbe/base/txgbe_mng.c b/drivers/net/txgbe/base/txgbe_mng.c
index a1974820b6..c58e1d6589 100644
--- a/drivers/net/txgbe/base/txgbe_mng.c
+++ b/drivers/net/txgbe/base/txgbe_mng.c
@@ -185,7 +185,7 @@ txgbe_host_interface_command_aml(struct txgbe_hw *hw, u32 *buffer,
}
/* try to get lock */
- while (rte_atomic32_test_and_set(&hw->swfw_busy)) {
+ while (rte_atomic_exchange_explicit(&hw->swfw_busy, true, rte_memory_order_acquire)) {
timeout--;
if (!timeout)
return TXGBE_ERR_TIMEOUT;
@@ -266,7 +266,7 @@ txgbe_host_interface_command_aml(struct txgbe_hw *hw, u32 *buffer,
/* index++, index replace txgbe_hic_hdr.checksum */
hw->swfw_index = resp->index == TXGBE_HIC_HDR_INDEX_MAX ?
0 : resp->index + 1;
- rte_atomic32_clear(&hw->swfw_busy);
+ rte_atomic_store_explicit(&hw->swfw_busy, false, rte_memory_order_release);
return err;
}
diff --git a/drivers/net/txgbe/base/txgbe_type.h b/drivers/net/txgbe/base/txgbe_type.h
index ede780321f..d3c82d51a4 100644
--- a/drivers/net/txgbe/base/txgbe_type.h
+++ b/drivers/net/txgbe/base/txgbe_type.h
@@ -880,7 +880,7 @@ struct txgbe_hw {
rte_spinlock_t phy_lock;
/*amlite: new SW-FW mbox */
u8 swfw_index;
- rte_atomic32_t swfw_busy;
+ RTE_ATOMIC(bool) swfw_busy;
u32 fec_mode;
u32 cur_fec_link;
};
--
2.53.0
^ permalink raw reply related
* [PATCH v5 19/24] net/hinic: replace rte_atomic32 with stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Xiaoyun Wang
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
Convert dma_pool::inuse and hinic_os_dep::dma_alloc_cnt to
RTE_ATOMIC(uint32_t) and replace rte_atomic32_*() with the
rte_atomic_*_explicit() equivalents. The matching local variable
and log format change from int/%d to uint32_t/%u.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/hinic/base/hinic_compat.h | 2 +-
drivers/net/hinic/base/hinic_pmd_hwdev.c | 24 ++++++++++++++----------
drivers/net/hinic/base/hinic_pmd_hwdev.h | 4 ++--
3 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/drivers/net/hinic/base/hinic_compat.h b/drivers/net/hinic/base/hinic_compat.h
index 707a3b92b9..c53b88b96d 100644
--- a/drivers/net/hinic/base/hinic_compat.h
+++ b/drivers/net/hinic/base/hinic_compat.h
@@ -15,7 +15,7 @@
#include <rte_memzone.h>
#include <rte_memcpy.h>
#include <rte_malloc.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_spinlock.h>
#include <rte_cycles.h>
#include <rte_log.h>
diff --git a/drivers/net/hinic/base/hinic_pmd_hwdev.c b/drivers/net/hinic/base/hinic_pmd_hwdev.c
index 818698dcb3..9a1b126632 100644
--- a/drivers/net/hinic/base/hinic_pmd_hwdev.c
+++ b/drivers/net/hinic/base/hinic_pmd_hwdev.c
@@ -116,7 +116,8 @@ static void *hinic_dma_mem_zalloc(struct hinic_hwdev *hwdev, size_t size,
dma_addr_t *dma_handle, unsigned int align,
unsigned int socket_id)
{
- int rc, alloc_cnt;
+ int rc;
+ uint32_t alloc_cnt;
const struct rte_memzone *mz;
char z_name[RTE_MEMZONE_NAMESIZE];
hash_sig_t sig;
@@ -125,8 +126,9 @@ static void *hinic_dma_mem_zalloc(struct hinic_hwdev *hwdev, size_t size,
if (dma_handle == NULL || 0 == size)
return NULL;
- alloc_cnt = rte_atomic32_add_return(&hwdev->os_dep.dma_alloc_cnt, 1);
- snprintf(z_name, sizeof(z_name), "%s_%d",
+ alloc_cnt = rte_atomic_fetch_add_explicit(&hwdev->os_dep.dma_alloc_cnt,
+ 1, rte_memory_order_relaxed);
+ snprintf(z_name, sizeof(z_name), "%s_%u",
hwdev->pcidev_hdl->name, alloc_cnt);
mz = rte_memzone_reserve_aligned(z_name, size, socket_id,
@@ -282,7 +284,6 @@ struct dma_pool *dma_pool_create(const char *name, void *dev,
if (!pool)
return NULL;
- rte_atomic32_set(&pool->inuse, 0);
pool->elem_size = size;
pool->align = align;
pool->boundary = boundary;
@@ -294,12 +295,15 @@ struct dma_pool *dma_pool_create(const char *name, void *dev,
void dma_pool_destroy(struct dma_pool *pool)
{
+ uint32_t inuse;
+
if (!pool)
return;
- if (rte_atomic32_read(&pool->inuse) != 0) {
- PMD_DRV_LOG(ERR, "Leak memory, dma_pool: %s, inuse_count: %d",
- pool->name, rte_atomic32_read(&pool->inuse));
+ inuse = rte_atomic_load_explicit(&pool->inuse, rte_memory_order_relaxed);
+ if (inuse != 0) {
+ PMD_DRV_LOG(ERR, "Leak memory, dma_pool: %s, inuse_count: %u",
+ pool->name, inuse);
}
rte_free(pool);
@@ -312,14 +316,14 @@ void *dma_pool_alloc(struct pci_pool *pool, dma_addr_t *dma_addr)
buf = hinic_dma_mem_zalloc(pool->hwdev, pool->elem_size, dma_addr,
(u32)pool->align, SOCKET_ID_ANY);
if (buf)
- rte_atomic32_inc(&pool->inuse);
+ rte_atomic_fetch_add_explicit(&pool->inuse, 1, rte_memory_order_relaxed);
return buf;
}
void dma_pool_free(struct pci_pool *pool, void *vaddr, dma_addr_t dma)
{
- rte_atomic32_dec(&pool->inuse);
+ rte_atomic_fetch_sub_explicit(&pool->inuse, 1, rte_memory_order_relaxed);
hinic_dma_mem_free(pool->hwdev, pool->elem_size, vaddr, dma);
}
@@ -329,7 +333,7 @@ int hinic_osdep_init(struct hinic_hwdev *hwdev)
struct rte_hash_parameters dh_params = { 0 };
struct rte_hash *paddr_hash = NULL;
- rte_atomic32_set(&hwdev->os_dep.dma_alloc_cnt, 0);
+ hwdev->os_dep.dma_alloc_cnt = 0;
rte_spinlock_init(&hwdev->os_dep.dma_hash_lock);
dh_params.name = hwdev->pcidev_hdl->name;
diff --git a/drivers/net/hinic/base/hinic_pmd_hwdev.h b/drivers/net/hinic/base/hinic_pmd_hwdev.h
index d6896b3f13..ad30ddd72e 100644
--- a/drivers/net/hinic/base/hinic_pmd_hwdev.h
+++ b/drivers/net/hinic/base/hinic_pmd_hwdev.h
@@ -18,7 +18,7 @@
/* dma pool */
struct dma_pool {
- rte_atomic32_t inuse;
+ RTE_ATOMIC(uint32_t) inuse;
size_t elem_size;
size_t align;
size_t boundary;
@@ -402,7 +402,7 @@ struct hinic_hilink_link_info {
/* dma os dependency implementation */
struct hinic_os_dep {
/* kernel dma alloc api */
- rte_atomic32_t dma_alloc_cnt;
+ RTE_ATOMIC(uint32_t) dma_alloc_cnt;
rte_spinlock_t dma_hash_lock;
struct rte_hash *dma_addr_hash;
};
--
2.53.0
^ permalink raw reply related
* [PATCH v5 18/24] drivers/event: replace rte_atomic32 in selftests
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Hemant Agrawal, Sachin Saxena, Jerin Jacob
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
Last callers in these selftests of the rte_atomicNN_*() family,
which is being deprecated.
Convert total_events from rte_atomic32_t to RTE_ATOMIC(uint32_t)
for the stack-local instance and __rte_atomic uint32_t * for the
pointer in test_core_param. Switch reads and updates to
rte_atomic_*_explicit().
Reads in the busy-loop checks and progress logs use relaxed: the
counter is purely a "drained yet?" signal and no data is published
through it. The fetch_sub on the dequeue path uses release in
octeontx (preserving the publish-after-mbuf-free ordering already
implied by the seq_cst sub it replaces) and relaxed in dpaa2.
The stack-local atomic_total_events is initialized by direct
assignment instead of rte_atomic32_set(), since it is written
before any worker is launched.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/event/dpaa2/dpaa2_eventdev_selftest.c | 26 ++++----
drivers/event/octeontx/ssovf_evdev_selftest.c | 61 ++++++++++---------
2 files changed, 47 insertions(+), 40 deletions(-)
diff --git a/drivers/event/dpaa2/dpaa2_eventdev_selftest.c b/drivers/event/dpaa2/dpaa2_eventdev_selftest.c
index 9d4938efe6..2c688bd194 100644
--- a/drivers/event/dpaa2/dpaa2_eventdev_selftest.c
+++ b/drivers/event/dpaa2/dpaa2_eventdev_selftest.c
@@ -2,7 +2,7 @@
* Copyright 2018-2019 NXP
*/
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_common.h>
#include <rte_cycles.h>
#include <rte_debug.h>
@@ -49,7 +49,7 @@ struct event_attr {
};
struct test_core_param {
- rte_atomic32_t *total_events;
+ __rte_atomic uint32_t *total_events;
uint64_t dequeue_tmo_ticks;
uint8_t port;
uint8_t sched_type;
@@ -444,10 +444,10 @@ worker_multi_port_fn(void *arg)
struct rte_event ev;
uint16_t valid_event;
uint8_t port = param->port;
- rte_atomic32_t *total_events = param->total_events;
+ __rte_atomic uint32_t *total_events = param->total_events;
int ret;
- while (rte_atomic32_read(total_events) > 0) {
+ while (rte_atomic_load_explicit(total_events, rte_memory_order_relaxed) > 0) {
valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1, 0);
if (!valid_event)
continue;
@@ -455,13 +455,15 @@ worker_multi_port_fn(void *arg)
ret = validate_event(&ev);
RTE_TEST_ASSERT_SUCCESS(ret, "Failed to validate event");
rte_pktmbuf_free(ev.mbuf);
- rte_atomic32_sub(total_events, 1);
+
+ rte_atomic_fetch_sub_explicit(total_events, 1,
+ rte_memory_order_relaxed);
}
return 0;
}
static int
-wait_workers_to_join(int lcore, const rte_atomic32_t *count)
+wait_workers_to_join(int lcore, const __rte_atomic uint32_t *count)
{
uint64_t cycles, print_cycles;
@@ -472,15 +474,15 @@ wait_workers_to_join(int lcore, const rte_atomic32_t *count)
uint64_t new_cycles = rte_get_timer_cycles();
if (new_cycles - print_cycles > rte_get_timer_hz()) {
- dpaa2_evdev_dbg("\r%s: events %d", __func__,
- rte_atomic32_read(count));
+ dpaa2_evdev_dbg("\r%s: events %u", __func__,
+ rte_atomic_load_explicit(count, rte_memory_order_relaxed));
print_cycles = new_cycles;
}
if (new_cycles - cycles > rte_get_timer_hz() * 10) {
dpaa2_evdev_info(
- "%s: No schedules for seconds, deadlock (%d)",
+ "%s: No schedules for seconds, deadlock (%u)",
__func__,
- rte_atomic32_read(count));
+ rte_atomic_load_explicit(count, rte_memory_order_relaxed));
rte_event_dev_dump(evdev, stdout);
cycles = new_cycles;
return -1;
@@ -500,13 +502,13 @@ launch_workers_and_wait(int (*main_worker)(void *),
int w_lcore;
int ret;
struct test_core_param *param;
- rte_atomic32_t atomic_total_events;
+ RTE_ATOMIC(uint32_t) atomic_total_events;
uint64_t dequeue_tmo_ticks;
if (!nb_workers)
return 0;
- rte_atomic32_set(&atomic_total_events, total_events);
+ atomic_total_events = total_events;
RTE_BUILD_BUG_ON(NUM_PACKETS < MAX_EVENTS);
param = malloc(sizeof(struct test_core_param) * nb_workers);
diff --git a/drivers/event/octeontx/ssovf_evdev_selftest.c b/drivers/event/octeontx/ssovf_evdev_selftest.c
index b54ae126d2..5eeed2b2ce 100644
--- a/drivers/event/octeontx/ssovf_evdev_selftest.c
+++ b/drivers/event/octeontx/ssovf_evdev_selftest.c
@@ -4,7 +4,7 @@
#include <stdlib.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_common.h>
#include <rte_cycles.h>
#include <rte_debug.h>
@@ -84,7 +84,7 @@ seqn_list_check(int limit)
}
struct test_core_param {
- rte_atomic32_t *total_events;
+ __rte_atomic uint32_t *total_events;
uint64_t dequeue_tmo_ticks;
uint8_t port;
uint8_t sched_type;
@@ -558,10 +558,10 @@ worker_multi_port_fn(void *arg)
struct rte_event ev;
uint16_t valid_event;
uint8_t port = param->port;
- rte_atomic32_t *total_events = param->total_events;
+ __rte_atomic uint32_t *total_events = param->total_events;
int ret;
- while (rte_atomic32_read(total_events) > 0) {
+ while (rte_atomic_load_explicit(total_events, rte_memory_order_relaxed) > 0) {
valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1, 0);
if (!valid_event)
continue;
@@ -569,13 +569,14 @@ worker_multi_port_fn(void *arg)
ret = validate_event(&ev);
RTE_TEST_ASSERT_SUCCESS(ret, "Failed to validate event");
rte_pktmbuf_free(ev.mbuf);
- rte_atomic32_sub(total_events, 1);
+
+ rte_atomic_fetch_sub_explicit(total_events, 1, rte_memory_order_release);
}
return 0;
}
static inline int
-wait_workers_to_join(int lcore, const rte_atomic32_t *count)
+wait_workers_to_join(int lcore, const __rte_atomic uint32_t *count)
{
uint64_t cycles, print_cycles;
RTE_SET_USED(count);
@@ -583,17 +584,16 @@ wait_workers_to_join(int lcore, const rte_atomic32_t *count)
print_cycles = cycles = rte_get_timer_cycles();
while (rte_eal_get_lcore_state(lcore) != WAIT) {
uint64_t new_cycles = rte_get_timer_cycles();
+ uint32_t cur_count = rte_atomic_load_explicit(count, rte_memory_order_relaxed);
if (new_cycles - print_cycles > rte_get_timer_hz()) {
- ssovf_log_dbg("\r%s: events %d", __func__,
- rte_atomic32_read(count));
+ ssovf_log_dbg("\r%s: events %u", __func__, cur_count);
print_cycles = new_cycles;
}
if (new_cycles - cycles > rte_get_timer_hz() * 10) {
ssovf_log_dbg(
- "%s: No schedules for seconds, deadlock (%d)",
- __func__,
- rte_atomic32_read(count));
+ "%s: No schedules for seconds, deadlock (%u)",
+ __func__, cur_count);
rte_event_dev_dump(evdev, stdout);
cycles = new_cycles;
return -1;
@@ -613,13 +613,13 @@ launch_workers_and_wait(int (*main_worker)(void *),
int w_lcore;
int ret;
struct test_core_param *param;
- rte_atomic32_t atomic_total_events;
+ RTE_ATOMIC(uint32_t) atomic_total_events;
uint64_t dequeue_tmo_ticks;
if (!nb_workers)
return 0;
- rte_atomic32_set(&atomic_total_events, total_events);
+ atomic_total_events = total_events;
seqn_list_init();
param = malloc(sizeof(struct test_core_param) * nb_workers);
@@ -889,10 +889,10 @@ worker_flow_based_pipeline(void *arg)
uint16_t valid_event;
uint8_t port = param->port;
uint8_t new_sched_type = param->sched_type;
- rte_atomic32_t *total_events = param->total_events;
+ __rte_atomic uint32_t *total_events = param->total_events;
uint64_t dequeue_tmo_ticks = param->dequeue_tmo_ticks;
- while (rte_atomic32_read(total_events) > 0) {
+ while (rte_atomic_load_explicit(total_events, rte_memory_order_relaxed) > 0) {
valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1,
dequeue_tmo_ticks);
if (!valid_event)
@@ -910,7 +910,8 @@ worker_flow_based_pipeline(void *arg)
} else if (ev.sub_event_type == 1) { /* Events from stage 1*/
if (seqn_list_update(*rte_event_pmd_selftest_seqn(ev.mbuf)) == 0) {
rte_pktmbuf_free(ev.mbuf);
- rte_atomic32_sub(total_events, 1);
+ rte_atomic_fetch_sub_explicit(total_events, 1,
+ rte_memory_order_release);
} else {
ssovf_log_dbg("Failed to update seqn_list");
return -1;
@@ -1044,10 +1045,10 @@ worker_group_based_pipeline(void *arg)
uint16_t valid_event;
uint8_t port = param->port;
uint8_t new_sched_type = param->sched_type;
- rte_atomic32_t *total_events = param->total_events;
+ __rte_atomic uint32_t *total_events = param->total_events;
uint64_t dequeue_tmo_ticks = param->dequeue_tmo_ticks;
- while (rte_atomic32_read(total_events) > 0) {
+ while (rte_atomic_load_explicit(total_events, rte_memory_order_relaxed) > 0) {
valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1,
dequeue_tmo_ticks);
if (!valid_event)
@@ -1065,7 +1066,8 @@ worker_group_based_pipeline(void *arg)
} else if (ev.queue_id == 1) { /* Events from stage 1(group 1)*/
if (seqn_list_update(*rte_event_pmd_selftest_seqn(ev.mbuf)) == 0) {
rte_pktmbuf_free(ev.mbuf);
- rte_atomic32_sub(total_events, 1);
+ rte_atomic_fetch_sub_explicit(total_events, 1,
+ rte_memory_order_release);
} else {
ssovf_log_dbg("Failed to update seqn_list");
return -1;
@@ -1203,16 +1205,17 @@ worker_flow_based_pipeline_max_stages_rand_sched_type(void *arg)
struct rte_event ev;
uint16_t valid_event;
uint8_t port = param->port;
- rte_atomic32_t *total_events = param->total_events;
+ __rte_atomic uint32_t *total_events = param->total_events;
- while (rte_atomic32_read(total_events) > 0) {
+ while (rte_atomic_load_explicit(total_events, rte_memory_order_relaxed) > 0) {
valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1, 0);
if (!valid_event)
continue;
if (ev.sub_event_type == 255) { /* last stage */
rte_pktmbuf_free(ev.mbuf);
- rte_atomic32_sub(total_events, 1);
+ rte_atomic_fetch_sub_explicit(total_events, 1,
+ rte_memory_order_release);
} else {
ev.event_type = RTE_EVENT_TYPE_CPU;
ev.sub_event_type++;
@@ -1278,16 +1281,17 @@ worker_queue_based_pipeline_max_stages_rand_sched_type(void *arg)
RTE_EVENT_DEV_ATTR_QUEUE_COUNT,
&queue_count), "Queue count get failed");
uint8_t nr_queues = queue_count;
- rte_atomic32_t *total_events = param->total_events;
+ __rte_atomic uint32_t *total_events = param->total_events;
- while (rte_atomic32_read(total_events) > 0) {
+ while (rte_atomic_load_explicit(total_events, rte_memory_order_relaxed) > 0) {
valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1, 0);
if (!valid_event)
continue;
if (ev.queue_id == nr_queues - 1) { /* last stage */
rte_pktmbuf_free(ev.mbuf);
- rte_atomic32_sub(total_events, 1);
+ rte_atomic_fetch_sub_explicit(total_events, 1,
+ rte_memory_order_release);
} else {
ev.event_type = RTE_EVENT_TYPE_CPU;
ev.queue_id++;
@@ -1320,16 +1324,17 @@ worker_mixed_pipeline_max_stages_rand_sched_type(void *arg)
RTE_EVENT_DEV_ATTR_QUEUE_COUNT,
&queue_count), "Queue count get failed");
uint8_t nr_queues = queue_count;
- rte_atomic32_t *total_events = param->total_events;
+ __rte_atomic uint32_t *total_events = param->total_events;
- while (rte_atomic32_read(total_events) > 0) {
+ while (rte_atomic_load_explicit(total_events, rte_memory_order_relaxed) > 0) {
valid_event = rte_event_dequeue_burst(evdev, port, &ev, 1, 0);
if (!valid_event)
continue;
if (ev.queue_id == nr_queues - 1) { /* Last stage */
rte_pktmbuf_free(ev.mbuf);
- rte_atomic32_sub(total_events, 1);
+ rte_atomic_fetch_sub_explicit(total_events, 1,
+ rte_memory_order_release);
} else {
ev.event_type = RTE_EVENT_TYPE_CPU;
ev.queue_id++;
--
2.53.0
^ permalink raw reply related
* [PATCH v5 17/24] bus/fslmc: replace rte_atomic32 with stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Hemant Agrawal, Sachin Saxena
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The atomic wrappers here are easily converted to stdatomic.
Drop any unused macros.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/bus/fslmc/qbman/include/compat.h | 21 ++++++++-------------
1 file changed, 8 insertions(+), 13 deletions(-)
diff --git a/drivers/bus/fslmc/qbman/include/compat.h b/drivers/bus/fslmc/qbman/include/compat.h
index 5a57bd8ed1..9c87f0b639 100644
--- a/drivers/bus/fslmc/qbman/include/compat.h
+++ b/drivers/bus/fslmc/qbman/include/compat.h
@@ -81,18 +81,13 @@ do { \
#define dma_wmb() rte_io_wmb()
-#define atomic_t rte_atomic32_t
-#define atomic_read(v) rte_atomic32_read(v)
-#define atomic_set(v, i) rte_atomic32_set(v, i)
-
-#define atomic_inc(v) rte_atomic32_add(v, 1)
-#define atomic_dec(v) rte_atomic32_sub(v, 1)
-
-#define atomic_inc_and_test(v) rte_atomic32_inc_and_test(v)
-#define atomic_dec_and_test(v) rte_atomic32_dec_and_test(v)
-
-#define atomic_inc_return(v) rte_atomic32_add_return(v, 1)
-#define atomic_dec_return(v) rte_atomic32_sub_return(v, 1)
-#define atomic_sub_and_test(i, v) (rte_atomic32_sub_return(v, i) == 0)
+typedef RTE_ATOMIC(uint32_t) atomic_t;
+
+#define atomic_read(v) rte_atomic_load_explicit((v), rte_memory_order_relaxed)
+#define atomic_set(v, i) rte_atomic_store_explicit((v), (i), rte_memory_order_relaxed)
+#define atomic_inc(v) ((void)rte_atomic_fetch_add_explicit((v), 1, rte_memory_order_seq_cst))
+#define atomic_dec(v) ((void)rte_atomic_fetch_sub_explicit((v), 1, rte_memory_order_seq_cst))
+#define atomic_inc_and_test(v) (rte_atomic_fetch_add_explicit((v), 1, rte_memory_order_seq_cst) == -1)
+#define atomic_dec_and_test(v) (rte_atomic_fetch_sub_explicit((v), 1, rte_memory_order_seq_cst) == 1)
#endif /* HEADER_COMPAT_H */
--
2.53.0
^ permalink raw reply related
* [PATCH v5 16/24] net/bnx2x: convert from rte_atomic32 to stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Julien Aube
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
Replace the legacy rte_atomic32_* API on sc->scan_fp with the
equivalent rte_atomic_*_explicit C11 helpers, ahead of the
deprecation of rte_atomicNN_t and its associated wrappers.
All accesses use rte_memory_order_seq_cst, matching the semantics
of the legacy API. No functional change.
The scan_fp field is a notification flag between the slow-path
command poster (bnx2x_sp_post) and the fastpath task that reaps
ramrod completions (bnx2x_handle_fp_tq), also cleared from
ecore_state_wait on success, panic, and timeout.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/bnx2x/bnx2x.c | 6 +++---
drivers/net/bnx2x/bnx2x.h | 2 +-
drivers/net/bnx2x/ecore_sp.c | 6 +++---
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index 8790c858d5..027a0a50d5 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -1098,7 +1098,7 @@ bnx2x_sp_post(struct bnx2x_softc *sc, int command, int cid, uint32_t data_hi,
* Ask bnx2x_intr_intr() to process RAMROD
* completion whenever it gets scheduled.
*/
- rte_atomic32_set(&sc->scan_fp, 1);
+ rte_atomic_store_explicit(&sc->scan_fp, 1, rte_memory_order_seq_cst);
bnx2x_sp_prod_update(sc);
return 0;
@@ -4575,7 +4575,7 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp)
/* update the fastpath index */
bnx2x_update_fp_sb_idx(fp);
- if (rte_atomic32_read(&sc->scan_fp) == 1) {
+ if (rte_atomic_load_explicit(&sc->scan_fp, rte_memory_order_seq_cst)) {
if (bnx2x_has_rx_work(fp)) {
more_rx = bnx2x_rxeof(sc, fp);
}
@@ -4586,7 +4586,7 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp)
return;
}
/* We have completed slow path completion, clear the flag */
- rte_atomic32_set(&sc->scan_fp, 0);
+ rte_atomic_store_explicit(&sc->scan_fp, 0, rte_memory_order_seq_cst);
}
bnx2x_ack_sb(sc, fp->igu_sb_id, USTORM_ID,
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
index 35206b4758..c5de4b71aa 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -1043,7 +1043,7 @@ struct bnx2x_softc {
#define PERIODIC_STOP 0
#define PERIODIC_GO 1
volatile unsigned long periodic_flags;
- rte_atomic32_t scan_fp;
+ RTE_ATOMIC(uint32_t) scan_fp;
struct bnx2x_fastpath fp[MAX_RSS_CHAINS];
struct bnx2x_sp_objs sp_objs[MAX_RSS_CHAINS];
diff --git a/drivers/net/bnx2x/ecore_sp.c b/drivers/net/bnx2x/ecore_sp.c
index c6c3857778..33a40dea6e 100644
--- a/drivers/net/bnx2x/ecore_sp.c
+++ b/drivers/net/bnx2x/ecore_sp.c
@@ -299,21 +299,21 @@ static int ecore_state_wait(struct bnx2x_softc *sc, int state,
#ifdef ECORE_STOP_ON_ERROR
ECORE_MSG(sc, "exit (cnt %d)", 5000 - cnt);
#endif
- rte_atomic32_set(&sc->scan_fp, 0);
+ rte_atomic_store_explicit(&sc->scan_fp, 0, rte_memory_order_seq_cst);
return ECORE_SUCCESS;
}
ECORE_WAIT(sc, delay_us);
if (sc->panic) {
- rte_atomic32_set(&sc->scan_fp, 0);
+ rte_atomic_store_explicit(&sc->scan_fp, 0, rte_memory_order_seq_cst);
return ECORE_IO;
}
}
/* timeout! */
PMD_DRV_LOG(ERR, sc, "timeout waiting for state %d", state);
- rte_atomic32_set(&sc->scan_fp, 0);
+ rte_atomic_store_explicit(&sc->scan_fp, 0, rte_memory_order_seq_cst);
#ifdef ECORE_STOP_ON_ERROR
ecore_panic();
#endif
--
2.53.0
^ permalink raw reply related
* [PATCH v5 15/24] common/dpaax: use stdatomic instead of rte_atomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Hemant Agrawal, Sachin Saxena
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The driver debug code uses local atomic wrappers;
convert them to DPDK rte_atomic wrappers for C11 stdatomic.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/common/dpaax/compat.h | 21 ++++++++-------------
1 file changed, 8 insertions(+), 13 deletions(-)
diff --git a/drivers/common/dpaax/compat.h b/drivers/common/dpaax/compat.h
index d0635255da..793616e095 100644
--- a/drivers/common/dpaax/compat.h
+++ b/drivers/common/dpaax/compat.h
@@ -365,19 +365,14 @@ static inline unsigned long get_zeroed_page(gfp_t __foo __rte_unused)
#define spin_lock_irqsave(x, f) spin_lock_irq(x)
#define spin_unlock_irqrestore(x, f) spin_unlock_irq(x)
-#define atomic_t rte_atomic32_t
-#define atomic_read(v) rte_atomic32_read(v)
-#define atomic_set(v, i) rte_atomic32_set(v, i)
-
-#define atomic_inc(v) rte_atomic32_add(v, 1)
-#define atomic_dec(v) rte_atomic32_sub(v, 1)
-
-#define atomic_inc_and_test(v) rte_atomic32_inc_and_test(v)
-#define atomic_dec_and_test(v) rte_atomic32_dec_and_test(v)
-
-#define atomic_inc_return(v) rte_atomic32_add_return(v, 1)
-#define atomic_dec_return(v) rte_atomic32_sub_return(v, 1)
-#define atomic_sub_and_test(i, v) (rte_atomic32_sub_return(v, i) == 0)
+typedef RTE_ATOMIC(uint32_t) atomic_t;
+
+#define atomic_read(v) rte_atomic_load_explicit((v), rte_memory_order_relaxed)
+#define atomic_set(v, i) rte_atomic_store_explicit((v), (i), rte_memory_order_relaxed)
+#define atomic_inc(v) ((void)rte_atomic_fetch_add_explicit((v), 1, rte_memory_order_seq_cst))
+#define atomic_dec(v) ((void)rte_atomic_fetch_sub_explicit((v), 1, rte_memory_order_seq_cst))
+#define atomic_inc_and_test(v) (rte_atomic_fetch_add_explicit((v), 1, rte_memory_order_seq_cst) == -1)
+#define atomic_dec_and_test(v) (rte_atomic_fetch_sub_explicit((v), 1, rte_memory_order_seq_cst) == 1)
/* Interface name len*/
#define IF_NAME_MAX_LEN 16
--
2.53.0
^ permalink raw reply related
* [PATCH v5 14/24] bus/vmbus: convert from rte_atomic to stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Long Li, Wei Hu
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
Replace deprecated rte_atomic32 operations in the vmbus ring buffer
producer with stdatomic equivalents, and replace the smp_wmb + CAS-spin
publish with rte_wait_until_equal_32 + release-store.
The two-cursor design is preserved: tbr->windex is the driver-private
reservation cursor that lets producers reserve slots concurrently
without a lock; vbr->windex is the host-visible commit cursor, updated
in reservation order so the host never observes windex pointing past
unwritten data. This is the lockless analogue of the spinlock-around-
single-cursor pattern used by the Linux (drivers/hv/ring_buffer.c
hv_ringbuffer_write) and FreeBSD (sys/dev/hyperv/vmbus/vmbus_br.c
vmbus_txbr_write) implementations of the same host contract.
The memory ordering mirrors __rte_ring_headtail_move_head and
__rte_ring_update_tail in lib/ring/rte_ring_c11_pvt.h: relaxed wait
for the previous producer's commit, release-store to publish. The
rte_smp_wmb before the publish is folded into the release ordering
on the store itself.
The host-shared vbr->windex remains volatile uint32_t in the packed
bufring struct; the atomic qualifier is added via cast at the access
site. The (uintptr_t) launder on the store-side cast suppresses a
spurious misaligned-atomic warning from the packed-struct attribute
(windex is 4-byte aligned in practice, at offset 0 of a page-aligned
struct).
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/bus/vmbus/private.h | 2 +-
drivers/bus/vmbus/vmbus_bufring.c | 39 +++++++++++++++++--------------
2 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/drivers/bus/vmbus/private.h b/drivers/bus/vmbus/private.h
index 6efac86b77..6b7782724f 100644
--- a/drivers/bus/vmbus/private.h
+++ b/drivers/bus/vmbus/private.h
@@ -25,7 +25,7 @@ extern int vmbus_logtype_bus;
struct vmbus_br {
struct vmbus_bufring *vbr;
uint32_t dsize;
- uint32_t windex; /* next available location */
+ RTE_ATOMIC(uint32_t) windex; /* next available location */
};
#define UIO_NAME_MAX 64
diff --git a/drivers/bus/vmbus/vmbus_bufring.c b/drivers/bus/vmbus/vmbus_bufring.c
index fcb97287dc..624fe8b6c5 100644
--- a/drivers/bus/vmbus/vmbus_bufring.c
+++ b/drivers/bus/vmbus/vmbus_bufring.c
@@ -15,7 +15,7 @@
#include <rte_tailq.h>
#include <rte_log.h>
#include <rte_malloc.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_memory.h>
#include <rte_pause.h>
#include <rte_bus_vmbus.h>
@@ -114,6 +114,7 @@ vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen,
uint32_t ring_size = tbr->dsize;
uint32_t old_windex, next_windex, windex, total;
uint64_t save_windex;
+ bool success;
int i;
total = 0;
@@ -121,17 +122,13 @@ vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen,
total += iov[i].iov_len;
total += sizeof(save_windex);
+ /* Get current free location */
+ old_windex = rte_atomic_load_explicit(&tbr->windex,
+ rte_memory_order_relaxed);
+
/* Reserve space in ring */
do {
- uint32_t avail;
-
- /* Get current free location */
- old_windex = tbr->windex;
-
- /* Prevent compiler reordering this with calculation */
- rte_compiler_barrier();
-
- avail = vmbus_br_availwrite(tbr, old_windex);
+ uint32_t avail = vmbus_br_availwrite(tbr, old_windex);
/* If not enough space in ring, then tell caller. */
if (avail <= total)
@@ -139,8 +136,13 @@ vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen,
next_windex = vmbus_br_idxinc(old_windex, total, ring_size);
- /* Atomic update of next write_index for other threads */
- } while (!rte_atomic32_cmpset(&tbr->windex, old_windex, next_windex));
+ /* Atomic update of next write_index for other threads
+ * Can use weak since easy to recompute and retry.
+ */
+ success = rte_atomic_compare_exchange_weak_explicit(
+ &tbr->windex, &old_windex, next_windex,
+ rte_memory_order_acquire, rte_memory_order_relaxed);
+ } while (unlikely(!success));
/* Space from old..new is now reserved */
windex = old_windex;
@@ -157,12 +159,15 @@ vmbus_txbr_write(struct vmbus_br *tbr, const struct iovec iov[], int iovlen,
/* The region reserved should match region used */
RTE_ASSERT(windex == next_windex);
- /* Ensure that data is available before updating host index */
- rte_smp_wmb();
+ /* Wait for previous producer to publish their windex update */
+ rte_wait_until_equal_32(&vbr->windex, old_windex, rte_memory_order_relaxed);
- /* Checkin for our reservation. wait for our turn to update host */
- while (!rte_atomic32_cmpset(&vbr->windex, old_windex, next_windex))
- rte_pause();
+ /* Publish our windex update; prior data writes ordered via release.
+ * windex is 4-byte aligned in practice (struct is page-aligned, windex
+ * at offset 0); cast launders the packed-struct alignment-1 attribute.
+ */
+ rte_atomic_store_explicit((volatile __rte_atomic uint32_t *)(uintptr_t)&vbr->windex,
+ next_windex, rte_memory_order_release);
/* If host had read all data before this, then need to signal */
*need_sig |= vmbus_txbr_need_signal(vbr, old_windex);
--
2.53.0
^ permalink raw reply related
* [PATCH v5 13/24] event/sw: convert from rte_atomic32 to stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
Use stdatomic to keep track of inflights.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/event/sw/sw_evdev.c | 8 +++++---
drivers/event/sw/sw_evdev.h | 4 ++--
drivers/event/sw/sw_evdev_worker.c | 16 +++++++++++-----
3 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c
index 3ad82e94ac..a2f760a98d 100644
--- a/drivers/event/sw/sw_evdev.c
+++ b/drivers/event/sw/sw_evdev.c
@@ -153,7 +153,9 @@ sw_port_setup(struct rte_eventdev *dev, uint8_t port_id,
* the sum to no leak credits
*/
int possible_inflights = p->inflight_credits + p->inflights;
- rte_atomic32_sub(&sw->inflights, possible_inflights);
+ rte_atomic_fetch_sub_explicit(&sw->inflights,
+ possible_inflights,
+ rte_memory_order_release);
}
*p = (struct sw_port){0}; /* zero entire structure */
@@ -512,7 +514,7 @@ sw_dev_configure(const struct rte_eventdev *dev)
sw->qid_count = conf->nb_event_queues;
sw->port_count = conf->nb_event_ports;
sw->nb_events_limit = conf->nb_events_limit;
- rte_atomic32_set(&sw->inflights, 0);
+ sw->inflights = 0;
/* Number of chunks sized for worst-case spread of events across IQs */
num_chunks = ((SW_INFLIGHT_EVENTS_TOTAL/SW_EVS_PER_Q_CHUNK)+1) +
@@ -633,7 +635,7 @@ sw_dump(struct rte_eventdev *dev, FILE *f)
fprintf(f, "\tsched cq/qid call: %"PRIu64"\n", sw->sched_cq_qid_called);
fprintf(f, "\tsched no IQ enq: %"PRIu64"\n", sw->sched_no_iq_enqueues);
fprintf(f, "\tsched no CQ enq: %"PRIu64"\n", sw->sched_no_cq_enqueues);
- uint32_t inflights = rte_atomic32_read(&sw->inflights);
+ uint32_t inflights = rte_atomic_load_explicit(&sw->inflights, rte_memory_order_relaxed);
uint32_t credits = sw->nb_events_limit - inflights;
fprintf(f, "\tinflight %d, credits: %d\n", inflights, credits);
diff --git a/drivers/event/sw/sw_evdev.h b/drivers/event/sw/sw_evdev.h
index c159be21be..5e49b08030 100644
--- a/drivers/event/sw/sw_evdev.h
+++ b/drivers/event/sw/sw_evdev.h
@@ -8,7 +8,7 @@
#include "sw_evdev_log.h"
#include <rte_eventdev.h>
#include <eventdev_pmd_vdev.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#define SW_DEFAULT_CREDIT_QUANTA 32
#define SW_DEFAULT_SCHED_QUANTA 128
@@ -233,7 +233,7 @@ struct sw_evdev {
/* Contains all ports - load balanced and directed */
alignas(RTE_CACHE_LINE_SIZE) struct sw_port ports[SW_PORTS_MAX];
- alignas(RTE_CACHE_LINE_SIZE) rte_atomic32_t inflights;
+ alignas(RTE_CACHE_LINE_SIZE) RTE_ATOMIC(uint32_t) inflights;
/*
* max events in this instance. Cached here for performance.
diff --git a/drivers/event/sw/sw_evdev_worker.c b/drivers/event/sw/sw_evdev_worker.c
index 4215726513..0755def367 100644
--- a/drivers/event/sw/sw_evdev_worker.c
+++ b/drivers/event/sw/sw_evdev_worker.c
@@ -56,7 +56,7 @@ sw_event_enqueue_burst(void *port, const struct rte_event ev[], uint16_t num)
uint8_t new_ops[PORT_ENQUEUE_MAX_BURST_SIZE];
struct sw_port *p = port;
struct sw_evdev *sw = (void *)p->sw;
- uint32_t sw_inflights = rte_atomic32_read(&sw->inflights);
+ uint32_t sw_inflights = rte_atomic_load_explicit(&sw->inflights, rte_memory_order_relaxed);
uint32_t credit_update_quanta = sw->credit_update_quanta;
int new = 0;
@@ -74,8 +74,10 @@ sw_event_enqueue_burst(void *port, const struct rte_event ev[], uint16_t num)
if (sw_inflights + credit_update_quanta > sw->nb_events_limit)
return 0;
- rte_atomic32_add(&sw->inflights, credit_update_quanta);
- p->inflight_credits += (credit_update_quanta);
+ rte_atomic_fetch_add_explicit(&sw->inflights,
+ credit_update_quanta,
+ rte_memory_order_acquire);
+ p->inflight_credits += credit_update_quanta;
/* If there are fewer inflight credits than new events, limit
* the number of enqueued events.
@@ -124,7 +126,9 @@ sw_event_enqueue_burst(void *port, const struct rte_event ev[], uint16_t num)
/* Replenish credits if enough releases are performed */
if (p->inflight_credits >= credit_update_quanta * 2) {
- rte_atomic32_sub(&sw->inflights, credit_update_quanta);
+ rte_atomic_fetch_sub_explicit(&sw->inflights,
+ credit_update_quanta,
+ rte_memory_order_release);
p->inflight_credits -= credit_update_quanta;
}
@@ -150,7 +154,9 @@ sw_event_dequeue_burst(void *port, struct rte_event *ev, uint16_t num,
/* Replenish credits if enough releases are performed */
if (p->inflight_credits >= credit_update_quanta * 2) {
- rte_atomic32_sub(&sw->inflights, credit_update_quanta);
+ rte_atomic_fetch_sub_explicit(&sw->inflights,
+ credit_update_quanta,
+ rte_memory_order_release);
p->inflight_credits -= credit_update_quanta;
}
}
--
2.53.0
^ permalink raw reply related
* [PATCH v5 12/24] net/netvsc: replace rte_atomic32 with stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Long Li, Wei Hu
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
Change the rndis transaction id and buffer usage to use
stdatomic functions.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/netvsc/hn_rndis.c | 28 +++++++++++++++++++---------
drivers/net/netvsc/hn_rxtx.c | 12 +++++++-----
drivers/net/netvsc/hn_var.h | 6 +++---
3 files changed, 29 insertions(+), 17 deletions(-)
diff --git a/drivers/net/netvsc/hn_rndis.c b/drivers/net/netvsc/hn_rndis.c
index 7c54eebcef..4b1d3d5539 100644
--- a/drivers/net/netvsc/hn_rndis.c
+++ b/drivers/net/netvsc/hn_rndis.c
@@ -17,7 +17,7 @@
#include <rte_string_fns.h>
#include <rte_memzone.h>
#include <rte_malloc.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_alarm.h>
#include <rte_branch_prediction.h>
#include <rte_ether.h>
@@ -59,7 +59,8 @@ hn_rndis_rid(struct hn_data *hv)
uint32_t rid;
do {
- rid = rte_atomic32_add_return(&hv->rndis_req_id, 1);
+ rid = rte_atomic_fetch_add_explicit(&hv->rndis_req_id, 1,
+ rte_memory_order_seq_cst);
} while (rid == 0);
return rid;
@@ -357,12 +358,14 @@ void hn_rndis_receive_response(struct hn_data *hv,
memcpy(hv->rndis_resp, data, len);
/* make sure response copied before update */
- rte_smp_wmb();
-
- if (rte_atomic32_cmpset(&hv->rndis_pending, hdr->rid, 0) == 0) {
+ uint32_t expected = hdr->rid;
+ if (!rte_atomic_compare_exchange_strong_explicit(&hv->rndis_pending,
+ &expected, 0,
+ rte_memory_order_release,
+ rte_memory_order_relaxed)) {
PMD_DRV_LOG(NOTICE,
"received id %#x pending id %#x",
- hdr->rid, (uint32_t)hv->rndis_pending);
+ hdr->rid, expected);
}
}
@@ -388,8 +391,11 @@ static int hn_rndis_exec1(struct hn_data *hv,
return -EINVAL;
}
+ uint32_t expected = 0;
if (comp != NULL &&
- rte_atomic32_cmpset(&hv->rndis_pending, 0, rid) == 0) {
+ !rte_atomic_compare_exchange_strong_explicit(
+ &hv->rndis_pending, &expected, rid,
+ rte_memory_order_acquire, rte_memory_order_relaxed)) {
PMD_DRV_LOG(ERR,
"Request already pending");
return -EBUSY;
@@ -405,7 +411,8 @@ static int hn_rndis_exec1(struct hn_data *hv,
time_t start = time(NULL);
/* Poll primary channel until response received */
- while (hv->rndis_pending == rid) {
+ while (rte_atomic_load_explicit(&hv->rndis_pending,
+ rte_memory_order_acquire) == rid) {
if (hv->closed)
return -ENETDOWN;
@@ -413,7 +420,10 @@ static int hn_rndis_exec1(struct hn_data *hv,
PMD_DRV_LOG(ERR,
"RNDIS response timed out");
- rte_atomic32_cmpset(&hv->rndis_pending, rid, 0);
+ expected = rid;
+ rte_atomic_compare_exchange_strong_explicit(
+ &hv->rndis_pending, &expected, 0,
+ rte_memory_order_release, rte_memory_order_relaxed);
return -ETIMEDOUT;
}
diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c
index 0d770d1b25..6f536610f2 100644
--- a/drivers/net/netvsc/hn_rxtx.c
+++ b/drivers/net/netvsc/hn_rxtx.c
@@ -17,7 +17,7 @@
#include <rte_string_fns.h>
#include <rte_memzone.h>
#include <rte_malloc.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_bitmap.h>
#include <rte_branch_prediction.h>
#include <rte_ether.h>
@@ -558,7 +558,8 @@ static void hn_rx_buf_free_cb(void *buf __rte_unused, void *opaque)
struct hn_rx_queue *rxq = rxb->rxq;
struct hn_data *hv = rxq->hv;
- rte_atomic32_dec(&rxq->rxbuf_outstanding);
+ rte_atomic_fetch_sub_explicit(&rxq->rxbuf_outstanding, 1,
+ rte_memory_order_release);
hn_nvs_ack_rxbuf(hv, rxb->chan, rxb->xactid);
}
@@ -602,8 +603,8 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,
* some space available in receive area for later packets.
*/
if (hv->rx_extmbuf_enable && dlen > hv->rx_copybreak &&
- (uint32_t)rte_atomic32_read(&rxq->rxbuf_outstanding) <
- hv->rxbuf_section_cnt / 2) {
+ rte_atomic_load_explicit(&rxq->rxbuf_outstanding,
+ rte_memory_order_relaxed) < hv->rxbuf_section_cnt / 2) {
struct rte_mbuf_ext_shared_info *shinfo;
const void *rxbuf;
rte_iova_t iova;
@@ -619,7 +620,8 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb,
/* shinfo is already set to 1 by the caller */
if (rte_mbuf_ext_refcnt_update(shinfo, 1) == 2)
- rte_atomic32_inc(&rxq->rxbuf_outstanding);
+ rte_atomic_fetch_add_explicit(&rxq->rxbuf_outstanding, 1,
+ rte_memory_order_acquire);
rte_pktmbuf_attach_extbuf(m, data, iova,
dlen + headroom, shinfo);
diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h
index 574b909c82..d7124a7df9 100644
--- a/drivers/net/netvsc/hn_var.h
+++ b/drivers/net/netvsc/hn_var.h
@@ -85,7 +85,7 @@ struct hn_rx_queue {
void *event_buf;
struct hn_rx_bufinfo *rxbuf_info;
- rte_atomic32_t rxbuf_outstanding;
+ RTE_ATOMIC(uint32_t) rxbuf_outstanding;
};
@@ -167,8 +167,8 @@ struct hn_data {
uint32_t rndis_agg_pkts;
uint32_t rndis_agg_align;
- volatile uint32_t rndis_pending;
- rte_atomic32_t rndis_req_id;
+ RTE_ATOMIC(uint32_t) rndis_pending;
+ RTE_ATOMIC(uint32_t) rndis_req_id;
uint8_t rndis_resp[256];
uint32_t rss_hash;
--
2.53.0
^ permalink raw reply related
* [PATCH v5 11/24] drivers: replace rte_atomic16 with stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Hemant Agrawal, Sachin Saxena
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The rte_atomicNN functions and types are deprecated.
The in_use and reference counts flag can be converted to stdatomic.
Also drop the unneeded NULL check in the loop body: TAILQ_FOREACH
terminates when the iterator becomes NULL, so var is guaranteed
non-NULL inside the loop.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c | 10 +++++++---
drivers/bus/fslmc/portal/dpaa2_hw_dpci.c | 10 +++++++---
drivers/bus/fslmc/portal/dpaa2_hw_dpio.c | 12 ++++++++----
drivers/bus/fslmc/portal/dpaa2_hw_pvt.h | 8 ++++----
drivers/event/dpaa2/dpaa2_hw_dpcon.c | 11 +++++++----
5 files changed, 33 insertions(+), 18 deletions(-)
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
index 925e83e97d..7b08593338 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c
@@ -84,7 +84,7 @@ dpaa2_create_dpbp_device(int vdev_fd __rte_unused,
}
dpbp_node->dpbp_id = dpbp_id;
- rte_atomic16_init(&dpbp_node->in_use);
+ dpbp_node->in_use = 0;
TAILQ_INSERT_TAIL(&dpbp_dev_list, dpbp_node, next);
@@ -103,7 +103,10 @@ struct dpaa2_dpbp_dev *dpaa2_alloc_dpbp_dev(void)
/* Get DPBP dev handle from list using index */
TAILQ_FOREACH(dpbp_dev, &dpbp_dev_list, next) {
- if (dpbp_dev && rte_atomic16_test_and_set(&dpbp_dev->in_use))
+ uint16_t expected = 0;
+ if (rte_atomic_compare_exchange_strong_explicit(
+ &dpbp_dev->in_use, &expected, 1,
+ rte_memory_order_acquire, rte_memory_order_relaxed))
break;
}
@@ -118,7 +121,8 @@ void dpaa2_free_dpbp_dev(struct dpaa2_dpbp_dev *dpbp)
/* Match DPBP handle and mark it free */
TAILQ_FOREACH(dpbp_dev, &dpbp_dev_list, next) {
if (dpbp_dev == dpbp) {
- rte_atomic16_dec(&dpbp_dev->in_use);
+ rte_atomic_store_explicit(&dpbp_dev->in_use, 0,
+ rte_memory_order_release);
return;
}
}
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
index b546da82f6..0e36fcdcd4 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpci.c
@@ -135,7 +135,7 @@ rte_dpaa2_create_dpci_device(int vdev_fd __rte_unused,
}
dpci_node->dpci_id = dpci_id;
- rte_atomic16_init(&dpci_node->in_use);
+ dpci_node->in_use = 0;
TAILQ_INSERT_TAIL(&dpci_dev_list, dpci_node, next);
@@ -159,7 +159,10 @@ struct dpaa2_dpci_dev *rte_dpaa2_alloc_dpci_dev(void)
/* Get DPCI dev handle from list using index */
TAILQ_FOREACH(dpci_dev, &dpci_dev_list, next) {
- if (dpci_dev && rte_atomic16_test_and_set(&dpci_dev->in_use))
+ uint16_t expected = 0;
+ if (rte_atomic_compare_exchange_strong_explicit(
+ &dpci_dev->in_use, &expected, 1,
+ rte_memory_order_acquire, rte_memory_order_relaxed))
break;
}
@@ -174,7 +177,8 @@ void rte_dpaa2_free_dpci_dev(struct dpaa2_dpci_dev *dpci)
/* Match DPCI handle and mark it free */
TAILQ_FOREACH(dpci_dev, &dpci_dev_list, next) {
if (dpci_dev == dpci) {
- rte_atomic16_dec(&dpci_dev->in_use);
+ rte_atomic_store_explicit(&dpci_dev->in_use, 0,
+ rte_memory_order_release);
return;
}
}
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
index 2a9e519668..06ddb366d8 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_dpio.c
@@ -293,7 +293,7 @@ static void dpaa2_put_qbman_swp(struct dpaa2_dpio_dev *dpio_dev)
#ifdef RTE_EVENT_DPAA2
dpaa2_dpio_intr_deinit(dpio_dev);
#endif
- rte_atomic16_clear(&dpio_dev->ref_count);
+ rte_atomic_store_explicit(&dpio_dev->ref_count, 0, rte_memory_order_release);
}
}
@@ -305,7 +305,10 @@ static struct dpaa2_dpio_dev *dpaa2_get_qbman_swp(void)
/* Get DPIO dev handle from list using index */
TAILQ_FOREACH(dpio_dev, &dpio_dev_list, next) {
- if (dpio_dev && rte_atomic16_test_and_set(&dpio_dev->ref_count))
+ uint16_t expected = 0;
+ if (rte_atomic_compare_exchange_strong_explicit(
+ &dpio_dev->ref_count, &expected, 1,
+ rte_memory_order_acquire, rte_memory_order_relaxed))
break;
}
if (!dpio_dev) {
@@ -326,7 +329,8 @@ static struct dpaa2_dpio_dev *dpaa2_get_qbman_swp(void)
ret = dpaa2_configure_stashing(dpio_dev, cpu_id);
if (ret) {
DPAA2_BUS_ERR("dpaa2_configure_stashing failed");
- rte_atomic16_clear(&dpio_dev->ref_count);
+ rte_atomic_store_explicit(&dpio_dev->ref_count, 0,
+ rte_memory_order_release);
return NULL;
}
}
@@ -441,7 +445,7 @@ dpaa2_create_dpio_device(int vdev_fd,
dpio_dev->dpio = NULL;
dpio_dev->hw_id = object_id;
- rte_atomic16_init(&dpio_dev->ref_count);
+
/* Using single portal for all devices */
dpio_dev->mc_portal = dpaa2_get_mcp_ptr(MC_PORTAL_INDEX);
diff --git a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
index e625a5c035..f2298b18e5 100644
--- a/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
+++ b/drivers/bus/fslmc/portal/dpaa2_hw_pvt.h
@@ -112,7 +112,7 @@ struct dpaa2_dpio_dev {
TAILQ_ENTRY(dpaa2_dpio_dev) next;
/**< Pointer to Next device instance */
uint16_t index; /**< Index of a instance in the list */
- rte_atomic16_t ref_count;
+ RTE_ATOMIC(uint16_t) ref_count;
/**< How many thread contexts are sharing this.*/
uint16_t eqresp_ci;
uint16_t eqresp_pi;
@@ -141,7 +141,7 @@ struct dpaa2_dpbp_dev {
/**< Pointer to Next device instance */
struct fsl_mc_io dpbp; /** handle to DPBP portal object */
uint16_t token;
- rte_atomic16_t in_use;
+ RTE_ATOMIC(uint16_t) in_use;
uint32_t dpbp_id; /*HW ID for DPBP object */
};
@@ -257,7 +257,7 @@ struct dpaa2_dpci_dev {
/**< Pointer to Next device instance */
struct fsl_mc_io dpci; /** handle to DPCI portal object */
uint16_t token;
- rte_atomic16_t in_use;
+ RTE_ATOMIC(uint16_t) in_use;
uint32_t dpci_id; /*HW ID for DPCI object */
struct dpaa2_queue rx_queue[DPAA2_DPCI_MAX_QUEUES];
struct dpaa2_queue tx_queue[DPAA2_DPCI_MAX_QUEUES];
@@ -267,7 +267,7 @@ struct dpaa2_dpcon_dev {
TAILQ_ENTRY(dpaa2_dpcon_dev) next;
struct fsl_mc_io dpcon;
uint16_t token;
- rte_atomic16_t in_use;
+ RTE_ATOMIC(uint16_t) in_use;
uint32_t dpcon_id;
uint16_t qbman_ch_id;
uint8_t num_priorities;
diff --git a/drivers/event/dpaa2/dpaa2_hw_dpcon.c b/drivers/event/dpaa2/dpaa2_hw_dpcon.c
index ea5b0d4b85..4d1d55eace 100644
--- a/drivers/event/dpaa2/dpaa2_hw_dpcon.c
+++ b/drivers/event/dpaa2/dpaa2_hw_dpcon.c
@@ -15,6 +15,7 @@
#include <rte_malloc.h>
#include <rte_memcpy.h>
#include <rte_string_fns.h>
+#include <rte_stdatomic.h>
#include <rte_cycles.h>
#include <rte_kvargs.h>
#include <dev_driver.h>
@@ -53,7 +54,7 @@ rte_dpaa2_create_dpcon_device(int dev_fd __rte_unused,
int ret, dpcon_id = obj->object_id;
/* Allocate DPAA2 dpcon handle */
- dpcon_node = rte_malloc(NULL, sizeof(struct dpaa2_dpcon_dev), 0);
+ dpcon_node = rte_zmalloc(NULL, sizeof(struct dpaa2_dpcon_dev), 0);
if (!dpcon_node) {
DPAA2_EVENTDEV_ERR(
"Memory allocation failed for dpcon device");
@@ -85,7 +86,6 @@ rte_dpaa2_create_dpcon_device(int dev_fd __rte_unused,
dpcon_node->qbman_ch_id = attr.qbman_ch_id;
dpcon_node->num_priorities = attr.num_priorities;
dpcon_node->dpcon_id = dpcon_id;
- rte_atomic16_init(&dpcon_node->in_use);
TAILQ_INSERT_TAIL(&dpcon_dev_list, dpcon_node, next);
@@ -98,7 +98,10 @@ struct dpaa2_dpcon_dev *rte_dpaa2_alloc_dpcon_dev(void)
/* Get DPCON dev handle from list using index */
TAILQ_FOREACH(dpcon_dev, &dpcon_dev_list, next) {
- if (dpcon_dev && rte_atomic16_test_and_set(&dpcon_dev->in_use))
+ uint16_t expected = 0;
+ if (rte_atomic_compare_exchange_strong_explicit(
+ &dpcon_dev->in_use, &expected, 1,
+ rte_memory_order_acquire, rte_memory_order_relaxed))
break;
}
@@ -112,7 +115,7 @@ void rte_dpaa2_free_dpcon_dev(struct dpaa2_dpcon_dev *dpcon)
/* Match DPCON handle and mark it free */
TAILQ_FOREACH(dpcon_dev, &dpcon_dev_list, next) {
if (dpcon_dev == dpcon) {
- rte_atomic16_dec(&dpcon_dev->in_use);
+ rte_atomic_store_explicit(&dpcon_dev->in_use, 0, rte_memory_order_release);
return;
}
}
--
2.53.0
^ permalink raw reply related
* [PATCH v5 10/24] bus/dpaa: replace rte_atomic16 with stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Hemant Agrawal, Sachin Saxena
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
This is simple inuse flag which can be done with stdatomic
exchange logic.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/bus/dpaa/base/qbman/qman.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/bus/dpaa/base/qbman/qman.c b/drivers/bus/dpaa/base/qbman/qman.c
index 5534e1846c..82a976141a 100644
--- a/drivers/bus/dpaa/base/qbman/qman.c
+++ b/drivers/bus/dpaa/base/qbman/qman.c
@@ -11,6 +11,7 @@
#include <rte_eventdev.h>
#include <rte_byteorder.h>
#include <rte_dpaa_logs.h>
+#include <rte_stdatomic.h>
#include <eal_export.h>
#include <dpaa_bits.h>
@@ -683,7 +684,7 @@ qman_init_portal(struct qman_portal *portal,
#define MAX_GLOBAL_PORTALS 8
static struct qman_portal global_portals[MAX_GLOBAL_PORTALS];
-static rte_atomic16_t global_portals_used[MAX_GLOBAL_PORTALS];
+static RTE_ATOMIC(bool) global_portals_used[MAX_GLOBAL_PORTALS];
struct qman_portal *
qman_alloc_global_portal(struct qm_portal_config *q_pcfg)
@@ -691,7 +692,8 @@ qman_alloc_global_portal(struct qm_portal_config *q_pcfg)
unsigned int i;
for (i = 0; i < MAX_GLOBAL_PORTALS; i++) {
- if (rte_atomic16_test_and_set(&global_portals_used[i])) {
+ if (!rte_atomic_exchange_explicit(&global_portals_used[i], true,
+ rte_memory_order_acquire)) {
global_portals[i].config = q_pcfg;
return &global_portals[i];
}
@@ -708,7 +710,8 @@ qman_free_global_portal(struct qman_portal *portal)
for (i = 0; i < MAX_GLOBAL_PORTALS; i++) {
if (&global_portals[i] == portal) {
- rte_atomic16_clear(&global_portals_used[i]);
+ rte_atomic_store_explicit(&global_portals_used[i], false,
+ rte_memory_order_release);
return 0;
}
}
--
2.53.0
^ permalink raw reply related
* [PATCH v5 09/24] crypto/ccp: replace use of rte_atomic64 with stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Sunil Uttarwar
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The rte_atomicNN functions are deprecated. Replace the free
count with stdatomic.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/crypto/ccp/ccp_crypto.c | 11 +++++++----
drivers/crypto/ccp/ccp_crypto.h | 2 +-
drivers/crypto/ccp/ccp_dev.c | 10 ++++++----
drivers/crypto/ccp/ccp_dev.h | 4 ++--
4 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/drivers/crypto/ccp/ccp_crypto.c b/drivers/crypto/ccp/ccp_crypto.c
index 5899d83bae..1800ad41c9 100644
--- a/drivers/crypto/ccp/ccp_crypto.c
+++ b/drivers/crypto/ccp/ccp_crypto.c
@@ -2683,7 +2683,8 @@ process_ops_to_enqueue(struct ccp_qp *qp,
b_info->cmd_q = cmd_q;
b_info->lsb_buf_phys = (phys_addr_t)rte_mem_virt2iova((void *)b_info->lsb_buf);
- rte_atomic64_sub(&b_info->cmd_q->free_slots, slots_req);
+ rte_atomic_fetch_sub_explicit(&b_info->cmd_q->free_slots, slots_req,
+ rte_memory_order_seq_cst);
b_info->head_offset = (uint32_t)(cmd_q->qbase_phys_addr + cmd_q->qidx *
Q_DESC_SIZE);
@@ -2729,8 +2730,9 @@ process_ops_to_enqueue(struct ccp_qp *qp,
result = -1;
}
if (unlikely(result < 0)) {
- rte_atomic64_add(&b_info->cmd_q->free_slots,
- (slots_req - b_info->desccnt));
+ rte_atomic_fetch_add_explicit(&b_info->cmd_q->free_slots,
+ slots_req - b_info->desccnt,
+ rte_memory_order_seq_cst);
break;
}
b_info->op[i] = op[i];
@@ -2914,7 +2916,8 @@ process_ops_to_dequeue(struct ccp_qp *qp,
success:
*total_nb_ops = b_info->total_nb_ops;
nb_ops = ccp_prepare_ops(qp, op, b_info, nb_ops);
- rte_atomic64_add(&b_info->cmd_q->free_slots, b_info->desccnt);
+ rte_atomic_fetch_add_explicit(&b_info->cmd_q->free_slots, b_info->desccnt,
+ rte_memory_order_seq_cst);
b_info->desccnt = 0;
if (b_info->opcnt > 0) {
qp->b_info = b_info;
diff --git a/drivers/crypto/ccp/ccp_crypto.h b/drivers/crypto/ccp/ccp_crypto.h
index d0b417ca29..5c61b1582d 100644
--- a/drivers/crypto/ccp/ccp_crypto.h
+++ b/drivers/crypto/ccp/ccp_crypto.h
@@ -10,7 +10,7 @@
#include <stdint.h>
#include <string.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_byteorder.h>
#include <rte_io.h>
#include <rte_pci.h>
diff --git a/drivers/crypto/ccp/ccp_dev.c b/drivers/crypto/ccp/ccp_dev.c
index 5088d8ded6..a75816cdfc 100644
--- a/drivers/crypto/ccp/ccp_dev.c
+++ b/drivers/crypto/ccp/ccp_dev.c
@@ -47,14 +47,15 @@ ccp_allot_queue(struct rte_cryptodev *cdev, int slot_req)
priv->last_dev = dev;
if (dev->qidx >= dev->cmd_q_count)
dev->qidx = 0;
- ret = rte_atomic64_read(&dev->cmd_q[dev->qidx].free_slots);
+ ret = rte_atomic_load_explicit(&dev->cmd_q[dev->qidx].free_slots, rte_memory_order_relaxed);
if (ret >= slot_req)
return &dev->cmd_q[dev->qidx];
for (i = 0; i < dev->cmd_q_count; i++) {
dev->qidx++;
if (dev->qidx >= dev->cmd_q_count)
dev->qidx = 0;
- ret = rte_atomic64_read(&dev->cmd_q[dev->qidx].free_slots);
+ ret = rte_atomic_load_explicit(&dev->cmd_q[dev->qidx].free_slots,
+ rte_memory_order_relaxed);
if (ret >= slot_req)
return &dev->cmd_q[dev->qidx];
}
@@ -583,8 +584,9 @@ ccp_add_device(struct ccp_device *dev)
CCP_LOG_ERR("queue doesn't have lsb regions");
cmd_q->lsb = -1;
- rte_atomic64_init(&cmd_q->free_slots);
- rte_atomic64_set(&cmd_q->free_slots, (COMMANDS_PER_QUEUE - 1));
+ rte_atomic_store_explicit(&cmd_q->free_slots,
+ COMMANDS_PER_QUEUE - 1,
+ rte_memory_order_seq_cst);
/* unused slot barrier b/w H&T */
}
diff --git a/drivers/crypto/ccp/ccp_dev.h b/drivers/crypto/ccp/ccp_dev.h
index cd63830759..8c408ac8d3 100644
--- a/drivers/crypto/ccp/ccp_dev.h
+++ b/drivers/crypto/ccp/ccp_dev.h
@@ -11,7 +11,7 @@
#include <string.h>
#include <bus_pci_driver.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_byteorder.h>
#include <rte_io.h>
#include <rte_pci.h>
@@ -182,7 +182,7 @@ struct __rte_cache_aligned ccp_queue {
struct ccp_device *dev;
char memz_name[RTE_MEMZONE_NAMESIZE];
- rte_atomic64_t free_slots;
+ RTE_ATOMIC(int64_t) free_slots;
/**< available free slots updated from enq/deq calls */
/* Queue identifier */
--
2.53.0
^ permalink raw reply related
* [PATCH v5 08/24] net/sfc: replace rte_atomic with stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Andrew Rybchenko
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The rte_atomicNN functions are deprecated and need to be replaced.
Use stdatomic for the restart required flag.
Use existing ethdev helper to set link status.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Reviewed-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
---
drivers/net/sfc/sfc.c | 9 +++++----
drivers/net/sfc/sfc.h | 4 ++--
drivers/net/sfc/sfc_port.c | 7 +------
drivers/net/sfc/sfc_stats.h | 2 +-
4 files changed, 9 insertions(+), 13 deletions(-)
diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 39cd8d519a..f13c5e2460 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -670,8 +670,8 @@ sfc_restart_if_required(void *arg)
struct sfc_adapter *sa = arg;
/* If restart is scheduled, clear the flag and do it */
- if (rte_atomic32_cmpset((volatile uint32_t *)&sa->restart_required,
- 1, 0)) {
+ if (rte_atomic_exchange_explicit(&sa->restart_required, false,
+ rte_memory_order_seq_cst)) {
sfc_adapter_lock(sa);
if (sa->state == SFC_ETHDEV_STARTED)
(void)sfc_restart(sa);
@@ -685,7 +685,8 @@ sfc_schedule_restart(struct sfc_adapter *sa)
int rc;
/* Schedule restart alarm if it is not scheduled yet */
- if (!rte_atomic32_test_and_set(&sa->restart_required))
+ if (rte_atomic_exchange_explicit(&sa->restart_required, true,
+ rte_memory_order_seq_cst))
return;
rc = rte_eal_alarm_set(1, sfc_restart_if_required, sa);
@@ -1292,7 +1293,7 @@ sfc_probe(struct sfc_adapter *sa)
SFC_ASSERT(sfc_adapter_is_locked(sa));
sa->socket_id = rte_socket_id();
- rte_atomic32_init(&sa->restart_required);
+ sa->restart_required = false;
sfc_log_init(sa, "get family");
rc = sfc_efx_family(pci_dev, &mem_ebrp, &sa->family);
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 629578549f..515e1e708d 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -17,7 +17,7 @@
#include <ethdev_driver.h>
#include <rte_kvargs.h>
#include <rte_spinlock.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include "efx.h"
@@ -239,7 +239,7 @@ struct sfc_adapter {
efx_family_t family;
efx_nic_t *nic;
rte_spinlock_t nic_lock;
- rte_atomic32_t restart_required;
+ RTE_ATOMIC(bool) restart_required;
struct sfc_efx_mcdi mcdi;
struct sfc_sriov sriov;
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index 33b53f7ac8..d84648d454 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -121,7 +121,6 @@ sfc_port_reset_mac_stats(struct sfc_adapter *sa)
static int
sfc_port_init_dev_link(struct sfc_adapter *sa)
{
- struct rte_eth_link *dev_link = &sa->eth_dev->data->dev_link;
int rc;
efx_link_mode_t link_mode;
struct rte_eth_link current_link;
@@ -132,11 +131,7 @@ sfc_port_init_dev_link(struct sfc_adapter *sa)
sfc_port_link_mode_to_info(link_mode, sa->port.phy_adv_cap,
¤t_link);
-
- EFX_STATIC_ASSERT(sizeof(*dev_link) == sizeof(rte_atomic64_t));
- rte_atomic64_set((rte_atomic64_t *)dev_link,
- *(uint64_t *)¤t_link);
-
+ rte_eth_linkstatus_set(sa->eth_dev, ¤t_link);
return 0;
}
diff --git a/drivers/net/sfc/sfc_stats.h b/drivers/net/sfc/sfc_stats.h
index 597e14dab3..eaa2afd3fe 100644
--- a/drivers/net/sfc/sfc_stats.h
+++ b/drivers/net/sfc/sfc_stats.h
@@ -12,7 +12,7 @@
#include <stdint.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include "sfc_tweak.h"
--
2.53.0
^ permalink raw reply related
* [PATCH v5 07/24] net/pfe: use ethdev linkstatus helpers
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Gagandeep Singh
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
Rather than open coding with deprecated rte_atomic64,
use the existing ethdev helpers to get and set link status.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/pfe/pfe_ethdev.c | 32 ++------------------------------
1 file changed, 2 insertions(+), 30 deletions(-)
diff --git a/drivers/net/pfe/pfe_ethdev.c b/drivers/net/pfe/pfe_ethdev.c
index 1efa17539e..1b183ab1f3 100644
--- a/drivers/net/pfe/pfe_ethdev.c
+++ b/drivers/net/pfe/pfe_ethdev.c
@@ -531,34 +531,6 @@ pfe_supported_ptypes_get(struct rte_eth_dev *dev, size_t *no_of_elements)
return NULL;
}
-static inline int
-pfe_eth_atomic_read_link_status(struct rte_eth_dev *dev,
- struct rte_eth_link *link)
-{
- struct rte_eth_link *dst = link;
- struct rte_eth_link *src = &dev->data->dev_link;
-
- if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
- *(uint64_t *)src) == 0)
- return -1;
-
- return 0;
-}
-
-static inline int
-pfe_eth_atomic_write_link_status(struct rte_eth_dev *dev,
- struct rte_eth_link *link)
-{
- struct rte_eth_link *dst = &dev->data->dev_link;
- struct rte_eth_link *src = link;
-
- if (rte_atomic64_cmpset((uint64_t *)dst, *(uint64_t *)dst,
- *(uint64_t *)src) == 0)
- return -1;
-
- return 0;
-}
-
static int
pfe_eth_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
{
@@ -570,7 +542,7 @@ pfe_eth_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
memset(&old, 0, sizeof(old));
memset(&link, 0, sizeof(struct rte_eth_link));
- pfe_eth_atomic_read_link_status(dev, &old);
+ rte_eth_linkstatus_get(dev, &old);
/* Read from PFE CDEV, status of link, if file was successfully
* opened.
@@ -601,7 +573,7 @@ pfe_eth_link_update(struct rte_eth_dev *dev, int wait_to_complete __rte_unused)
link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
link.link_autoneg = RTE_ETH_LINK_AUTONEG;
- pfe_eth_atomic_write_link_status(dev, &link);
+ rte_eth_linkstatus_set(dev, &link);
PFE_PMD_INFO("Port (%d) link is %s", dev->data->port_id,
link.link_status ? "up" : "down");
--
2.53.0
^ permalink raw reply related
* [PATCH v5 06/24] net/enic: do not use deprecated rte_atomic64
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev
Cc: Stephen Hemminger, John Daley, Hyong Youb Kim, Bruce Richardson,
Konstantin Ananyev
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The rte_atomic64 datatype and functions are deprecated.
This driver was only using it for error statistics where atomic
is not necessary. The DPDK PMD model is that statistics do
not have to be exact in face of contention.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/enic/enic.h | 6 +++---
drivers/net/enic/enic_compat.h | 1 -
drivers/net/enic/enic_main.c | 17 +++++++----------
drivers/net/enic/enic_rxtx.c | 14 ++++++--------
drivers/net/enic/enic_rxtx_vec_avx2.c | 4 ++--
5 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/drivers/net/enic/enic.h b/drivers/net/enic/enic.h
index 87f6b35fcd..0a8d4a29ca 100644
--- a/drivers/net/enic/enic.h
+++ b/drivers/net/enic/enic.h
@@ -59,9 +59,9 @@
#define ENICPMD_RXQ_INTR_OFFSET 1
struct enic_soft_stats {
- rte_atomic64_t rx_nombuf;
- rte_atomic64_t rx_packet_errors;
- rte_atomic64_t tx_oversized;
+ uint64_t rx_nombuf;
+ uint64_t rx_packet_errors;
+ uint64_t tx_oversized;
};
struct enic_memzone_entry {
diff --git a/drivers/net/enic/enic_compat.h b/drivers/net/enic/enic_compat.h
index 7cff6831b9..3ce4299e81 100644
--- a/drivers/net/enic/enic_compat.h
+++ b/drivers/net/enic/enic_compat.h
@@ -9,7 +9,6 @@
#include <stdio.h>
#include <unistd.h>
-#include <rte_atomic.h>
#include <rte_malloc.h>
#include <rte_log.h>
#include <rte_io.h>
diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
index 2696fa77d4..fb9a5754c9 100644
--- a/drivers/net/enic/enic_main.c
+++ b/drivers/net/enic/enic_main.c
@@ -83,17 +83,15 @@ static void enic_log_q_error(struct enic *enic)
static void enic_clear_soft_stats(struct enic *enic)
{
struct enic_soft_stats *soft_stats = &enic->soft_stats;
- rte_atomic64_clear(&soft_stats->rx_nombuf);
- rte_atomic64_clear(&soft_stats->rx_packet_errors);
- rte_atomic64_clear(&soft_stats->tx_oversized);
+
+ memset(soft_stats, 0, sizeof(*soft_stats));
}
static void enic_init_soft_stats(struct enic *enic)
{
struct enic_soft_stats *soft_stats = &enic->soft_stats;
- rte_atomic64_init(&soft_stats->rx_nombuf);
- rte_atomic64_init(&soft_stats->rx_packet_errors);
- rte_atomic64_init(&soft_stats->tx_oversized);
+
+ memset(soft_stats, 0, sizeof(*soft_stats));
enic_clear_soft_stats(enic);
}
@@ -132,7 +130,7 @@ int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats,
* counted in ibytes even though truncated packets are dropped
* which can make ibytes be slightly higher than it should be.
*/
- rx_packet_errors = rte_atomic64_read(&soft_stats->rx_packet_errors);
+ rx_packet_errors = soft_stats->rx_packet_errors;
rx_truncated = rx_packet_errors - stats->rx.rx_errors;
r_stats->ipackets = stats->rx.rx_frames_ok - rx_truncated;
@@ -142,12 +140,11 @@ int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats,
r_stats->obytes = stats->tx.tx_bytes_ok;
r_stats->ierrors = stats->rx.rx_errors + stats->rx.rx_drop;
- r_stats->oerrors = stats->tx.tx_errors
- + rte_atomic64_read(&soft_stats->tx_oversized);
+ r_stats->oerrors = stats->tx.tx_errors + soft_stats->tx_oversized;
r_stats->imissed = stats->rx.rx_no_bufs + rx_truncated;
- r_stats->rx_nombuf = rte_atomic64_read(&soft_stats->rx_nombuf);
+ r_stats->rx_nombuf = soft_stats->rx_nombuf;
return 0;
}
diff --git a/drivers/net/enic/enic_rxtx.c b/drivers/net/enic/enic_rxtx.c
index 549a153332..c87d947b93 100644
--- a/drivers/net/enic/enic_rxtx.c
+++ b/drivers/net/enic/enic_rxtx.c
@@ -112,7 +112,7 @@ enic_recv_pkts_common(void *rx_queue, struct rte_mbuf **rx_pkts,
/* allocate a new mbuf */
nmb = rte_mbuf_raw_alloc(rq->mp);
if (nmb == NULL) {
- rte_atomic64_inc(&enic->soft_stats.rx_nombuf);
+ ++enic->soft_stats.rx_nombuf;
break;
}
@@ -185,7 +185,7 @@ enic_recv_pkts_common(void *rx_queue, struct rte_mbuf **rx_pkts,
}
if (unlikely(packet_error)) {
rte_pktmbuf_free(first_seg);
- rte_atomic64_inc(&enic->soft_stats.rx_packet_errors);
+ ++enic->soft_stats.rx_packet_errors;
continue;
}
@@ -303,7 +303,7 @@ enic_noscatter_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
if (unlikely(cqd->bytes_written_flags &
CQ_ENET_RQ_DESC_FLAGS_TRUNCATED)) {
rte_pktmbuf_free(*rxmb++);
- rte_atomic64_inc(&enic->soft_stats.rx_packet_errors);
+ ++enic->soft_stats.rx_packet_errors;
cqd++;
continue;
}
@@ -505,14 +505,12 @@ uint16_t enic_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
uint8_t offload_mode;
uint16_t header_len;
uint64_t tso;
- rte_atomic64_t *tx_oversized;
enic_cleanup_wq(enic, wq);
wq_desc_avail = vnic_wq_desc_avail(wq);
head_idx = wq->head_idx;
desc_count = wq->ring.desc_count;
ol_flags_mask = RTE_MBUF_F_TX_VLAN | RTE_MBUF_F_TX_IP_CKSUM | RTE_MBUF_F_TX_L4_MASK;
- tx_oversized = &enic->soft_stats.tx_oversized;
nb_pkts = RTE_MIN(nb_pkts, ENIC_TX_XMIT_MAX);
@@ -527,7 +525,7 @@ uint16_t enic_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
/* drop packet if it's too big to send */
if (unlikely(!tso && pkt_len > ENIC_TX_MAX_PKT_SIZE)) {
rte_pktmbuf_free(tx_pkt);
- rte_atomic64_inc(tx_oversized);
+ ++enic->soft_stats.tx_oversized;
continue;
}
@@ -558,7 +556,7 @@ uint16_t enic_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
if (unlikely(header_len == 0 || ((tx_pkt->tso_segsz +
header_len) > ENIC_TX_MAX_PKT_SIZE))) {
rte_pktmbuf_free(tx_pkt);
- rte_atomic64_inc(tx_oversized);
+ ++enic->soft_stats.tx_oversized;
continue;
}
@@ -681,7 +679,7 @@ static void enqueue_simple_pkts(struct rte_mbuf **pkts,
*/
if (unlikely(p->pkt_len > ENIC_TX_MAX_PKT_SIZE)) {
desc->length = ENIC_TX_MAX_PKT_SIZE;
- rte_atomic64_inc(&enic->soft_stats.tx_oversized);
+ ++enic->soft_stats.tx_oversized;
}
desc++;
}
diff --git a/drivers/net/enic/enic_rxtx_vec_avx2.c b/drivers/net/enic/enic_rxtx_vec_avx2.c
index 600efff270..53589ab788 100644
--- a/drivers/net/enic/enic_rxtx_vec_avx2.c
+++ b/drivers/net/enic/enic_rxtx_vec_avx2.c
@@ -81,7 +81,7 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
if (unlikely(cqd->bytes_written_flags &
CQ_ENET_RQ_DESC_FLAGS_TRUNCATED)) {
rte_pktmbuf_free(*rxmb++);
- rte_atomic64_inc(&enic->soft_stats.rx_packet_errors);
+ ++enic->soft_stats.rx_packet_errors;
} else {
*rx++ = rx_one(cqd, *rxmb++, enic);
}
@@ -761,7 +761,7 @@ enic_noscatter_vec_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
if (unlikely(cqd->bytes_written_flags &
CQ_ENET_RQ_DESC_FLAGS_TRUNCATED)) {
rte_pktmbuf_free(*rxmb++);
- rte_atomic64_inc(&enic->soft_stats.rx_packet_errors);
+ ++enic->soft_stats.rx_packet_errors;
} else {
*rx++ = rx_one(cqd, *rxmb++, enic);
}
--
2.53.0
^ permalink raw reply related
* [PATCH v5 05/24] net/failsafe: convert to stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Gaetan Rivet
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The functions rte_atomic64 are deprecated, convert this
code to use stdatomic for reference count. Use the memory
order implied by naming P/V.
No need for initialization since refcnt is in space
allocated with rte_zmalloc().
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/failsafe/failsafe_ops.c | 12 +++++-----
drivers/net/failsafe/failsafe_private.h | 29 ++++++++++++++-----------
drivers/net/failsafe/failsafe_rxtx.c | 2 +-
3 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/drivers/net/failsafe/failsafe_ops.c b/drivers/net/failsafe/failsafe_ops.c
index ddc8808ebe..fcb0051777 100644
--- a/drivers/net/failsafe/failsafe_ops.c
+++ b/drivers/net/failsafe/failsafe_ops.c
@@ -11,7 +11,7 @@
#endif
#include <rte_debug.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <ethdev_driver.h>
#include <rte_malloc.h>
#include <rte_flow.h>
@@ -440,14 +440,13 @@ fs_rx_queue_setup(struct rte_eth_dev *dev,
}
rxq = rte_zmalloc(NULL,
sizeof(*rxq) +
- sizeof(rte_atomic64_t) * PRIV(dev)->subs_tail,
+ sizeof(uint64_t) * PRIV(dev)->subs_tail,
RTE_CACHE_LINE_SIZE);
if (rxq == NULL) {
fs_unlock(dev, 0);
return -ENOMEM;
}
- FOREACH_SUBDEV(sdev, i, dev)
- rte_atomic64_init(&rxq->refcnt[i]);
+
rxq->qid = rx_queue_id;
rxq->socket_id = socket_id;
rxq->info.mp = mb_pool;
@@ -617,14 +616,13 @@ fs_tx_queue_setup(struct rte_eth_dev *dev,
}
txq = rte_zmalloc("ethdev TX queue",
sizeof(*txq) +
- sizeof(rte_atomic64_t) * PRIV(dev)->subs_tail,
+ sizeof(uint64_t) * PRIV(dev)->subs_tail,
RTE_CACHE_LINE_SIZE);
if (txq == NULL) {
fs_unlock(dev, 0);
return -ENOMEM;
}
- FOREACH_SUBDEV(sdev, i, dev)
- rte_atomic64_init(&txq->refcnt[i]);
+
txq->qid = tx_queue_id;
txq->socket_id = socket_id;
txq->info.conf = *tx_conf;
diff --git a/drivers/net/failsafe/failsafe_private.h b/drivers/net/failsafe/failsafe_private.h
index babea6016e..89b06f9756 100644
--- a/drivers/net/failsafe/failsafe_private.h
+++ b/drivers/net/failsafe/failsafe_private.h
@@ -10,7 +10,7 @@
#include <sys/queue.h>
#include <pthread.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <dev_driver.h>
#include <ethdev_driver.h>
#include <rte_devargs.h>
@@ -75,7 +75,7 @@ struct rxq {
int event_fd;
unsigned int enable_events:1;
struct rte_eth_rxq_info info;
- rte_atomic64_t refcnt[];
+ RTE_ATOMIC(uint64_t) refcnt[];
};
struct txq {
@@ -83,7 +83,7 @@ struct txq {
uint16_t qid;
unsigned int socket_id;
struct rte_eth_txq_info info;
- rte_atomic64_t refcnt[];
+ RTE_ATOMIC(uint64_t) refcnt[];
};
struct rte_flow {
@@ -320,33 +320,36 @@ extern int failsafe_mac_from_arg;
*/
/**
- * a: (rte_atomic64_t)
+ * a: _Atomic uint64_t
*/
#define FS_ATOMIC_P(a) \
- rte_atomic64_set(&(a), 1)
+ rte_atomic_exchange_explicit(&(a), 1, rte_memory_order_acquire)
/**
- * a: (rte_atomic64_t)
+ * a: _Atomic uint64_t
*/
#define FS_ATOMIC_V(a) \
- rte_atomic64_set(&(a), 0)
+ rte_atomic_store_explicit(&(a), 0, rte_memory_order_release)
/**
* s: (struct sub_device *)
* i: uint16_t qid
*/
#define FS_ATOMIC_RX(s, i) \
- rte_atomic64_read( \
- &((struct rxq *) \
- (fs_dev(s)->data->rx_queues[i]))->refcnt[(s)->sid])
+ rte_atomic_load_explicit( \
+ &((struct rxq *) \
+ (fs_dev(s)->data->rx_queues[i]))->refcnt[(s)->sid], \
+ rte_memory_order_seq_cst)
+
/**
* s: (struct sub_device *)
* i: uint16_t qid
*/
#define FS_ATOMIC_TX(s, i) \
- rte_atomic64_read( \
- &((struct txq *) \
- (fs_dev(s)->data->tx_queues[i]))->refcnt[(s)->sid])
+ rte_atomic_load_explicit( \
+ &((struct txq *) \
+ (fs_dev(s)->data->tx_queues[i]))->refcnt[(s)->sid], \
+ rte_memory_order_seq_cst)
#ifdef RTE_EXEC_ENV_FREEBSD
#define FS_THREADID_TYPE void*
diff --git a/drivers/net/failsafe/failsafe_rxtx.c b/drivers/net/failsafe/failsafe_rxtx.c
index fe67293299..500483bda3 100644
--- a/drivers/net/failsafe/failsafe_rxtx.c
+++ b/drivers/net/failsafe/failsafe_rxtx.c
@@ -3,7 +3,7 @@
* Copyright 2017 Mellanox Technologies, Ltd
*/
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_debug.h>
#include <rte_mbuf.h>
#include <ethdev_driver.h>
--
2.53.0
^ permalink raw reply related
* [PATCH v5 04/24] net/ena: replace use of rte_atomicNN
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev
Cc: Stephen Hemminger, Shai Brandes, Evgeny Schemeilin, Ron Beider,
Amit Bernstein, Wajeeh Atrash
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
Convert the legacy rte_atomicNN operations to stdatomic.
* Remove variable ena_alloc_cnt is defined by not used.
It is a leftover from previous memzone naming scheme.
* Convert the legacy rte_atomic32_t and rte_atomic32_{inc,dec,set,read}
macros to C11 stdatomic equivalents.
Memory ordering is kept at seq_cst,
matching the implicit ordering of the legacy API.
* Do not use rte_atomic for statistics
The DPDK PMD model is that statistics do not have to be exact
in face of contention.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/ena/base/ena_plat_dpdk.h | 14 +++++++++-----
drivers/net/ena/ena_ethdev.c | 21 ++++++---------------
drivers/net/ena/ena_ethdev.h | 7 +++----
3 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/drivers/net/ena/base/ena_plat_dpdk.h b/drivers/net/ena/base/ena_plat_dpdk.h
index c84420de22..83b354d9da 100644
--- a/drivers/net/ena/base/ena_plat_dpdk.h
+++ b/drivers/net/ena/base/ena_plat_dpdk.h
@@ -40,7 +40,7 @@ typedef uint64_t dma_addr_t;
#endif
#define ENA_PRIu64 PRIu64
-#define ena_atomic32_t rte_atomic32_t
+typedef RTE_ATOMIC(int32_t) ena_atomic32_t;
#define ena_mem_handle_t const struct rte_memzone *
#define SZ_256 (256U)
@@ -267,10 +267,14 @@ ena_mem_alloc_coherent(struct rte_eth_dev_data *data, size_t size,
#define ENA_REG_READ32(bus, reg) \
__extension__ ({ (void)(bus); rte_read32_relaxed((reg)); })
-#define ATOMIC32_INC(i32_ptr) rte_atomic32_inc(i32_ptr)
-#define ATOMIC32_DEC(i32_ptr) rte_atomic32_dec(i32_ptr)
-#define ATOMIC32_SET(i32_ptr, val) rte_atomic32_set(i32_ptr, val)
-#define ATOMIC32_READ(i32_ptr) rte_atomic32_read(i32_ptr)
+#define ATOMIC32_INC(i32_ptr) \
+ rte_atomic_fetch_add_explicit((i32_ptr), 1, rte_memory_order_seq_cst)
+#define ATOMIC32_DEC(i32_ptr) \
+ rte_atomic_fetch_sub_explicit((i32_ptr), 1, rte_memory_order_seq_cst)
+#define ATOMIC32_SET(i32_ptr, val) \
+ rte_atomic_store_explicit((i32_ptr), (val), rte_memory_order_seq_cst)
+#define ATOMIC32_READ(i32_ptr) \
+ rte_atomic_load_explicit((i32_ptr), rte_memory_order_seq_cst)
#define msleep(x) rte_delay_us(x * 1000)
#define udelay(x) rte_delay_us(x)
diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c
index ad2ac6dbbf..e874f264b4 100644
--- a/drivers/net/ena/ena_ethdev.c
+++ b/drivers/net/ena/ena_ethdev.c
@@ -121,12 +121,6 @@ struct ena_stats {
*/
#define ENA_DEVARG_ENABLE_FRAG_BYPASS "enable_frag_bypass"
-/*
- * Each rte_memzone should have unique name.
- * To satisfy it, count number of allocation and add it to name.
- */
-rte_atomic64_t ena_alloc_cnt;
-
static const struct ena_stats ena_stats_global_strings[] = {
ENA_STAT_GLOBAL_ENTRY(wd_expired),
ENA_STAT_GLOBAL_ENTRY(dev_start),
@@ -1249,10 +1243,7 @@ static void ena_stats_restart(struct rte_eth_dev *dev)
{
struct ena_adapter *adapter = dev->data->dev_private;
- rte_atomic64_init(&adapter->drv_stats->ierrors);
- rte_atomic64_init(&adapter->drv_stats->oerrors);
- rte_atomic64_init(&adapter->drv_stats->rx_nombuf);
- adapter->drv_stats->rx_drops = 0;
+ memset(adapter->drv_stats, 0, sizeof(struct ena_driver_stats));
}
static int ena_stats_get(struct rte_eth_dev *dev,
@@ -1289,9 +1280,9 @@ static int ena_stats_get(struct rte_eth_dev *dev,
/* Driver related stats */
stats->imissed = adapter->drv_stats->rx_drops;
- stats->ierrors = rte_atomic64_read(&adapter->drv_stats->ierrors);
- stats->oerrors = rte_atomic64_read(&adapter->drv_stats->oerrors);
- stats->rx_nombuf = rte_atomic64_read(&adapter->drv_stats->rx_nombuf);
+ stats->ierrors = adapter->drv_stats->ierrors;
+ stats->oerrors = adapter->drv_stats->oerrors;
+ stats->rx_nombuf = adapter->drv_stats->rx_nombuf;
/* Queue statistics */
if (qstats) {
@@ -1887,7 +1878,7 @@ static int ena_populate_rx_queue(struct ena_ring *rxq, unsigned int count)
/* get resources for incoming packets */
rc = rte_pktmbuf_alloc_bulk(rxq->mb_pool, mbufs, count);
if (unlikely(rc < 0)) {
- rte_atomic64_inc(&rxq->adapter->drv_stats->rx_nombuf);
+ ++rxq->adapter->drv_stats->rx_nombuf;
++rxq->rx_stats.mbuf_alloc_fail;
PMD_RX_LOG_LINE(DEBUG, "There are not enough free buffers");
return 0;
@@ -3014,7 +3005,7 @@ static uint16_t eth_ena_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
if (unlikely(mbuf->ol_flags &
(RTE_MBUF_F_RX_IP_CKSUM_BAD | RTE_MBUF_F_RX_L4_CKSUM_BAD)))
- rte_atomic64_inc(&rx_ring->adapter->drv_stats->ierrors);
+ ++rx_ring->adapter->drv_stats->ierrors;
rx_pkts[completed] = mbuf;
rx_ring->rx_stats.bytes += mbuf->pkt_len;
diff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h
index 3a66d79384..b204b07767 100644
--- a/drivers/net/ena/ena_ethdev.h
+++ b/drivers/net/ena/ena_ethdev.h
@@ -6,7 +6,6 @@
#ifndef _ENA_ETHDEV_H_
#define _ENA_ETHDEV_H_
-#include <rte_atomic.h>
#include <rte_ether.h>
#include <ethdev_driver.h>
#include <ethdev_pci.h>
@@ -225,9 +224,9 @@ enum ena_adapter_state {
};
struct ena_driver_stats {
- rte_atomic64_t ierrors;
- rte_atomic64_t oerrors;
- rte_atomic64_t rx_nombuf;
+ u64 ierrors;
+ u64 oerrors;
+ u64 rx_nombuf;
u64 rx_drops;
};
--
2.53.0
^ permalink raw reply related
* [PATCH v5 03/24] net/nbl: remove unused rte_atomic16 field
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Dimon Zhao, Leon Yu, Sam Chen
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The tx_current_queue was defined as rte_atomic16_t which
is deprecated. Remove it since it was never used.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/nbl/nbl_hw/nbl_resource.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/net/nbl/nbl_hw/nbl_resource.h b/drivers/net/nbl/nbl_hw/nbl_resource.h
index bf5a9461f5..f2182ba6bc 100644
--- a/drivers/net/nbl/nbl_hw/nbl_resource.h
+++ b/drivers/net/nbl/nbl_hw/nbl_resource.h
@@ -225,7 +225,6 @@ struct nbl_res_info {
u16 base_qid;
u16 lcore_max;
u16 *pf_qid_to_lcore_id;
- rte_atomic16_t tx_current_queue;
};
struct nbl_resource_mgt {
--
2.53.0
^ permalink raw reply related
* [PATCH v5 02/24] net/bonding: use stdatomic
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Chas Williams, Min Hu (Connor)
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The old rte_atomic16 and rte_atomic64 functions are deprecated.
Replace with rte_stdatomic for managing warning and timer flags.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/bonding/eth_bond_8023ad_private.h | 6 ++--
drivers/net/bonding/rte_eth_bond_8023ad.c | 35 ++++++++-----------
2 files changed, 17 insertions(+), 24 deletions(-)
diff --git a/drivers/net/bonding/eth_bond_8023ad_private.h b/drivers/net/bonding/eth_bond_8023ad_private.h
index ab7d15f81a..dd3cf3ed26 100644
--- a/drivers/net/bonding/eth_bond_8023ad_private.h
+++ b/drivers/net/bonding/eth_bond_8023ad_private.h
@@ -9,7 +9,7 @@
#include <rte_ether.h>
#include <rte_byteorder.h>
-#include <rte_atomic.h>
+#include <rte_stdatomic.h>
#include <rte_flow.h>
#include "rte_eth_bond_8023ad.h"
@@ -140,10 +140,10 @@ struct port {
/** Timer which is also used as mutex. If is 0 (not running) RX marker
* packet might be responded. Otherwise shall be dropped. It is zeroed in
* mode 4 callback function after expire. */
- volatile uint64_t rx_marker_timer;
+ RTE_ATOMIC(uint64_t) rx_marker_timer;
uint64_t warning_timer;
- volatile uint16_t warnings_to_show;
+ RTE_ATOMIC(uint16_t) warnings_to_show;
/** Memory pool used to allocate slow queues */
struct rte_mempool *slow_pool;
diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c
index ba88f6d261..cc7e4af2b9 100644
--- a/drivers/net/bonding/rte_eth_bond_8023ad.c
+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c
@@ -171,27 +171,17 @@ timer_is_running(uint64_t *timer)
static void
set_warning_flags(struct port *port, uint16_t flags)
{
- int retval;
- uint16_t old;
- uint16_t new_flag = 0;
-
- do {
- old = port->warnings_to_show;
- new_flag = old | flags;
- retval = rte_atomic16_cmpset(&port->warnings_to_show, old, new_flag);
- } while (unlikely(retval == 0));
+ rte_atomic_fetch_or_explicit(&port->warnings_to_show, flags, rte_memory_order_relaxed);
}
static void
show_warnings(uint16_t member_id)
{
struct port *port = &bond_mode_8023ad_ports[member_id];
- uint8_t warnings;
-
- do {
- warnings = port->warnings_to_show;
- } while (rte_atomic16_cmpset(&port->warnings_to_show, warnings, 0) == 0);
+ uint16_t warnings;
+ warnings = rte_atomic_exchange_explicit(&port->warnings_to_show, 0,
+ rte_memory_order_relaxed);
if (!warnings)
return;
@@ -1337,7 +1327,6 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
struct port *port = &bond_mode_8023ad_ports[member_id];
struct marker_header *m_hdr;
uint64_t marker_timer, old_marker_timer;
- int retval;
uint8_t wrn, subtype;
/* If packet is a marker, we send response now by reusing given packet
* and update only source MAC, destination MAC is multicast so don't
@@ -1354,17 +1343,19 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
}
/* Setup marker timer. Do it in loop in case concurrent access. */
+ old_marker_timer = rte_atomic_load_explicit(&port->rx_marker_timer,
+ rte_memory_order_relaxed);
do {
- old_marker_timer = port->rx_marker_timer;
if (!timer_is_expired(&old_marker_timer)) {
wrn = WRN_RX_MARKER_TO_FAST;
goto free_out;
}
timer_set(&marker_timer, mode4->rx_marker_timeout);
- retval = rte_atomic64_cmpset(&port->rx_marker_timer,
- old_marker_timer, marker_timer);
- } while (unlikely(retval == 0));
+
+ } while (!rte_atomic_compare_exchange_weak_explicit(&port->rx_marker_timer,
+ &old_marker_timer, marker_timer,
+ rte_memory_order_seq_cst, rte_memory_order_relaxed));
m_hdr->marker.tlv_type_marker = MARKER_TLV_TYPE_RESP;
rte_eth_macaddr_get(member_id, &m_hdr->eth_hdr.src_addr);
@@ -1372,7 +1363,8 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
if (internals->mode4.dedicated_queues.enabled == 0) {
if (rte_ring_enqueue(port->tx_ring, pkt) != 0) {
/* reset timer */
- port->rx_marker_timer = 0;
+ rte_atomic_store_explicit(&port->rx_marker_timer, 0,
+ rte_memory_order_release);
wrn = WRN_TX_QUEUE_FULL;
goto free_out;
}
@@ -1386,7 +1378,8 @@ bond_mode_8023ad_handle_slow_pkt(struct bond_dev_private *internals,
&pkt, tx_count);
if (tx_count != 1) {
/* reset timer */
- port->rx_marker_timer = 0;
+ rte_atomic_store_explicit(&port->rx_marker_timer, 0,
+ rte_memory_order_release);
wrn = WRN_TX_QUEUE_FULL;
goto free_out;
}
--
2.53.0
^ permalink raw reply related
* [PATCH v5 01/24] bpf: use C11 atomics in BPF_ST_ATOMIC_REG
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, Marat Khalili, Konstantin Ananyev
In-Reply-To: <20260620023134.42877-1-stephen@networkplumber.org>
The BPF_ST_ATOMIC_REG macro generated code with deprecated
rte_atomicNN_add and rte_atomicNN_exchange.
Replace this with the equivalent rte_stdatomic definitions.
Use memory order seq_cst to preserve the previous behavior of
rte_atomicNN_add() / rte_atomicNN_exchange() and matches
the Linux kernel BPF interpreter for these opcodes.
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Reviewed-by: Marat Khalili <marat.khalili@huawei.com>
---
lib/bpf/bpf_exec.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/lib/bpf/bpf_exec.c b/lib/bpf/bpf_exec.c
index 18013753b1..ee6ec7516f 100644
--- a/lib/bpf/bpf_exec.c
+++ b/lib/bpf/bpf_exec.c
@@ -10,6 +10,7 @@
#include <rte_log.h>
#include <rte_debug.h>
#include <rte_byteorder.h>
+#include <rte_stdatomic.h>
#include "bpf_impl.h"
@@ -65,16 +66,16 @@
(type)(reg)[(ins)->src_reg])
#define BPF_ST_ATOMIC_REG(reg, ins, tp) do { \
+ RTE_ATOMIC(uint##tp##_t) *dst = (RTE_ATOMIC(uint##tp##_t) *) \
+ (uintptr_t)((reg)[(ins)->dst_reg] + (ins)->off); \
switch (ins->imm) { \
case BPF_ATOMIC_ADD: \
- rte_atomic##tp##_add((rte_atomic##tp##_t *) \
- (uintptr_t)((reg)[(ins)->dst_reg] + (ins)->off), \
- (reg)[(ins)->src_reg]); \
+ rte_atomic_fetch_add_explicit(dst, \
+ (reg)[(ins)->src_reg], rte_memory_order_seq_cst); \
break; \
case BPF_ATOMIC_XCHG: \
- (reg)[(ins)->src_reg] = rte_atomic##tp##_exchange((uint##tp##_t *) \
- (uintptr_t)((reg)[(ins)->dst_reg] + (ins)->off), \
- (reg)[(ins)->src_reg]); \
+ (reg)[(ins)->src_reg] = rte_atomic_exchange_explicit(dst, \
+ (reg)[(ins)->src_reg], rte_memory_order_seq_cst); \
break; \
default: \
/* this should be caught by validator and never reach here */ \
--
2.53.0
^ permalink raw reply related
* [PATCH v5 00/24] deprecate rte_atomic functions
From: Stephen Hemminger @ 2026-06-20 2:28 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger
In-Reply-To: <https://inbox.dpdk.org/dev/20260521042043.1590536-1-stephen@networkplumber.org>
The rte_atomicNN_* family was flagged for deprecation in 2021 by
commit 3ec965b6de12 ("doc: update atomic operation deprecation")
but enforcement never landed and in-tree usage continued to grow.
This series finishes converting every remaining in-tree caller to
the C11-style rte_atomic_*_explicit() / RTE_ATOMIC() API, then
marks the legacy functions __rte_deprecated so future in-tree and
out-of-tree uses are caught at compile time.
The goal of this series is to get driver writers to review and
test each change.
v5 - rebase now that ring changes are merged.
- drop the barrier (rte_smp_mb) patch not required.
Stephen Hemminger (24):
bpf: use C11 atomics in BPF_ST_ATOMIC_REG
net/bonding: use stdatomic
net/nbl: remove unused rte_atomic16 field
net/ena: replace use of rte_atomicNN
net/failsafe: convert to stdatomic
net/enic: do not use deprecated rte_atomic64
net/pfe: use ethdev linkstatus helpers
net/sfc: replace rte_atomic with stdatomic
crypto/ccp: replace use of rte_atomic64 with stdatomic
bus/dpaa: replace rte_atomic16 with stdatomic
drivers: replace rte_atomic16 with stdatomic
net/netvsc: replace rte_atomic32 with stdatomic
event/sw: convert from rte_atomic32 to stdatomic
bus/vmbus: convert from rte_atomic to stdatomic
common/dpaax: use stdatomic instead of rte_atomic
net/bnx2x: convert from rte_atomic32 to stdatomic
bus/fslmc: replace rte_atomic32 with stdatomic
drivers/event: replace rte_atomic32 in selftests
net/hinic: replace rte_atomic32 with stdatomic
net/txgbe: replace rte_atomic32 with stdatomic
net/vhost: use stdatomic instead of rte_atomic32
vdpa/ifc: replace rte_atomic32 with stdatomic
test/atomic: suppress deprecation warnings for legacy APIs
eal: deprecate rte_atomicNN functions
app/test/test_atomic.c | 12 +
devtools/checkpatches.sh | 8 -
doc/guides/rel_notes/deprecation.rst | 4 +-
doc/guides/rel_notes/release_26_07.rst | 5 +
drivers/bus/dpaa/base/qbman/qman.c | 9 +-
drivers/bus/fslmc/portal/dpaa2_hw_dpbp.c | 10 +-
drivers/bus/fslmc/portal/dpaa2_hw_dpci.c | 10 +-
drivers/bus/fslmc/portal/dpaa2_hw_dpio.c | 12 +-
drivers/bus/fslmc/portal/dpaa2_hw_pvt.h | 8 +-
drivers/bus/fslmc/qbman/include/compat.h | 21 +-
drivers/bus/vmbus/private.h | 2 +-
drivers/bus/vmbus/vmbus_bufring.c | 39 +--
drivers/common/dpaax/compat.h | 21 +-
drivers/crypto/ccp/ccp_crypto.c | 11 +-
drivers/crypto/ccp/ccp_crypto.h | 2 +-
drivers/crypto/ccp/ccp_dev.c | 10 +-
drivers/crypto/ccp/ccp_dev.h | 4 +-
drivers/event/dpaa2/dpaa2_eventdev_selftest.c | 26 +-
drivers/event/dpaa2/dpaa2_hw_dpcon.c | 11 +-
drivers/event/octeontx/ssovf_evdev_selftest.c | 61 +++--
drivers/event/sw/sw_evdev.c | 8 +-
drivers/event/sw/sw_evdev.h | 4 +-
drivers/event/sw/sw_evdev_worker.c | 16 +-
drivers/net/bnx2x/bnx2x.c | 6 +-
drivers/net/bnx2x/bnx2x.h | 2 +-
drivers/net/bnx2x/ecore_sp.c | 6 +-
drivers/net/bonding/eth_bond_8023ad_private.h | 6 +-
drivers/net/bonding/rte_eth_bond_8023ad.c | 35 +--
drivers/net/ena/base/ena_plat_dpdk.h | 14 +-
drivers/net/ena/ena_ethdev.c | 21 +-
drivers/net/ena/ena_ethdev.h | 7 +-
drivers/net/enic/enic.h | 6 +-
drivers/net/enic/enic_compat.h | 1 -
drivers/net/enic/enic_main.c | 17 +-
drivers/net/enic/enic_rxtx.c | 14 +-
drivers/net/enic/enic_rxtx_vec_avx2.c | 4 +-
drivers/net/failsafe/failsafe_ops.c | 12 +-
drivers/net/failsafe/failsafe_private.h | 29 ++-
drivers/net/failsafe/failsafe_rxtx.c | 2 +-
drivers/net/hinic/base/hinic_compat.h | 2 +-
drivers/net/hinic/base/hinic_pmd_hwdev.c | 24 +-
drivers/net/hinic/base/hinic_pmd_hwdev.h | 4 +-
drivers/net/nbl/nbl_hw/nbl_resource.h | 1 -
drivers/net/netvsc/hn_rndis.c | 28 +-
drivers/net/netvsc/hn_rxtx.c | 12 +-
drivers/net/netvsc/hn_var.h | 6 +-
drivers/net/pfe/pfe_ethdev.c | 32 +--
drivers/net/sfc/sfc.c | 9 +-
drivers/net/sfc/sfc.h | 4 +-
drivers/net/sfc/sfc_port.c | 7 +-
drivers/net/sfc/sfc_stats.h | 2 +-
drivers/net/txgbe/base/txgbe_mng.c | 4 +-
drivers/net/txgbe/base/txgbe_type.h | 2 +-
drivers/net/vhost/rte_eth_vhost.c | 103 +++++---
drivers/vdpa/ifc/ifcvf_vdpa.c | 37 +--
lib/bpf/bpf_exec.c | 13 +-
lib/eal/arm/include/rte_atomic_32.h | 4 -
lib/eal/arm/include/rte_atomic_64.h | 4 -
lib/eal/include/generic/rte_atomic.h | 243 +++++-------------
lib/eal/include/rte_common.h | 2 +
lib/eal/loongarch/include/rte_atomic.h | 4 -
lib/eal/ppc/include/rte_atomic.h | 173 -------------
lib/eal/riscv/include/rte_atomic.h | 4 -
lib/eal/x86/include/rte_atomic.h | 172 -------------
lib/eal/x86/include/rte_atomic_32.h | 188 --------------
lib/eal/x86/include/rte_atomic_64.h | 157 -----------
66 files changed, 472 insertions(+), 1265 deletions(-)
--
2.53.0
^ permalink raw reply
* RE: [EXTERNAL] [PATCH v2 06/10] bus/vmbus: allocate interrupt during probing
From: Long Li @ 2026-06-19 22:05 UTC (permalink / raw)
To: David Marchand, dev@dpdk.org
Cc: thomas@monjalon.net, stephen@networkplumber.org,
bruce.richardson@intel.com, fengchengwen@huawei.com,
hemant.agrawal@nxp.com, Wei Hu
In-Reply-To: <20260618152826.490569-7-david.marchand@redhat.com>
> Allocating the interrupt handle is a waste of memory if no device is probed
> later (like for example, if a allowlist is passed).
> Instead, allocate this handle at the time probe_device is called.
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Long Li <longli@microsoft.com>
> ---
> Changes since v1:
> - fixed/reordered interrupt handle allocation,
>
> ---
> drivers/bus/vmbus/linux/vmbus_bus.c | 6 ------
> drivers/bus/vmbus/vmbus_common.c | 18 ++++++++++++++++--
> 2 files changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/bus/vmbus/linux/vmbus_bus.c
> b/drivers/bus/vmbus/linux/vmbus_bus.c
> index 0af10f6a69..77d904ad6d 100644
> --- a/drivers/bus/vmbus/linux/vmbus_bus.c
> +++ b/drivers/bus/vmbus/linux/vmbus_bus.c
> @@ -345,12 +345,6 @@ vmbus_scan_one(const char *name)
> }
> }
>
> - /* Allocate interrupt handle instance */
> - dev->intr_handle =
> - rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
> - if (dev->intr_handle == NULL)
> - goto error;
> -
> /* device is valid, add in list (sorted) */
> VMBUS_LOG(DEBUG, "Adding vmbus device %s", name);
>
> diff --git a/drivers/bus/vmbus/vmbus_common.c
> b/drivers/bus/vmbus/vmbus_common.c
> index 74c1ddff69..bfb45e963c 100644
> --- a/drivers/bus/vmbus/vmbus_common.c
> +++ b/drivers/bus/vmbus/vmbus_common.c
> @@ -100,10 +100,16 @@ vmbus_probe_device(struct rte_driver *drv, struct
> rte_device *dev)
> return 1;
> }
>
> + /* allocate interrupt handle instance */
> + vmbus_dev->intr_handle =
> + rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_PRIVATE);
> + if (vmbus_dev->intr_handle == NULL)
> + return -ENOMEM;
> +
> /* map resources for device */
> ret = rte_vmbus_map_device(vmbus_dev);
> if (ret != 0)
> - return ret;
> + goto free_intr;
>
> if (vmbus_dev->device.numa_node < 0 && rte_socket_count() > 1)
> VMBUS_LOG(INFO, "Device %s is not NUMA-aware", guid); @@
> -112,7 +118,15 @@ vmbus_probe_device(struct rte_driver *drv, struct
> rte_device *dev)
> VMBUS_LOG(INFO, " probe driver: %s", vmbus_drv->driver.name);
> ret = vmbus_drv->probe(vmbus_drv, vmbus_dev);
> if (ret != 0)
> - rte_vmbus_unmap_device(vmbus_dev);
> + goto unmap;
> +
> + return 0;
> +
> +unmap:
> + rte_vmbus_unmap_device(vmbus_dev);
> +free_intr:
> + rte_intr_instance_free(vmbus_dev->intr_handle);
> + vmbus_dev->intr_handle = NULL;
>
> return ret;
> }
> --
> 2.53.0
^ permalink raw reply
* RE: [EXTERNAL] [PATCH v2 05/10] bus/vmbus: fix interrupt leak in cleanup
From: Long Li @ 2026-06-19 22:04 UTC (permalink / raw)
To: David Marchand, dev@dpdk.org
Cc: thomas@monjalon.net, stephen@networkplumber.org,
bruce.richardson@intel.com, fengchengwen@huawei.com,
hemant.agrawal@nxp.com, stable@dpdk.org, Wei Hu
In-Reply-To: <20260618152826.490569-6-david.marchand@redhat.com>
> When calling this bus cleanup, interrupt handle was not released.
>
> Fixes: 65780eada9d9 ("bus/vmbus: support cleanup")
> Cc: stable@dpdk.org
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
Reviewed-by: Long Li <longli@microsoft.com>
> ---
> drivers/bus/vmbus/vmbus_common.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/bus/vmbus/vmbus_common.c
> b/drivers/bus/vmbus/vmbus_common.c
> index 01573927ce..74c1ddff69 100644
> --- a/drivers/bus/vmbus/vmbus_common.c
> +++ b/drivers/bus/vmbus/vmbus_common.c
> @@ -150,6 +150,7 @@ rte_vmbus_cleanup(void)
> error = -1;
>
> rte_vmbus_unmap_device(dev);
> + rte_intr_instance_free(dev->intr_handle);
>
> dev->device.driver = NULL;
> rte_bus_remove_device(&rte_vmbus_bus, &dev->device);
> --
> 2.53.0
^ permalink raw reply
* Re: [PATCH 00/10] NXP ENETC driver related changes
From: Stephen Hemminger @ 2026-06-19 21:43 UTC (permalink / raw)
To: Gagandeep Singh; +Cc: dev, hemant.agrawal
In-Reply-To: <20260619184427.522518-1-g.singh@nxp.com>
On Sat, 20 Jun 2026 00:14:17 +0530
Gagandeep Singh <g.singh@nxp.com> wrote:
> ENETC driver related changes series
>
> Gagandeep Singh (8):
> net/enetc: fix TX BD structure
> net/enetc: fix TX BDs flag overwrite issue
> net/enetc: fix queue initialization
> net/enetc: support ESP packet type in packet parsing
> net/enetc: update random MAC generation code
> net/enetc: add option to disable VSI messaging
> net/enetc: add devargs to control VSI-PSI timeout and delay
> net/enetc4: add cacheable BD ring support with SW cache maintenance
>
> Vanshika Shukla (2):
> net/enetc: support scatter-gather
> net/enetc: set user configurable priority to TX rings
>
> drivers/net/enetc/base/enetc_hw.h | 13 +-
> drivers/net/enetc/enetc.h | 28 +-
> drivers/net/enetc/enetc4_ethdev.c | 123 +++++++--
> drivers/net/enetc/enetc4_vf.c | 159 ++++++++++--
> drivers/net/enetc/enetc_ethdev.c | 26 +-
> drivers/net/enetc/enetc_rxtx.c | 411 ++++++++++++++++++++++++++----
> 6 files changed, 649 insertions(+), 111 deletions(-)
>
The AI review shows some thing that need to be addressed before merging.
[PATCH 04/10] net/enetc: support ESP packet type
Info: enetc_supported_ptypes_get() adds RTE_PTYPE_TUNNEL_ESP and a
trailing RTE_PTYPE_UNKNOWN. *no_of_elements is RTE_DIM(ptypes), so the
0 entry is counted (not used as a sentinel). It is filtered out by the
mask test in rte_eth_dev_get_supported_ptypes(), so harmless, but the
RTE_PTYPE_UNKNOWN line is unnecessary and should be dropped.
[PATCH 06/10] net/enetc: support scatter-gather
Warning: scatter Rx reassembly state (first_seg/cur_seg) is held in
local variables and reset on every call. rx_frm_cnt only advances on
the F bit, so work_limit won't cut a frame, but the
"!(bd_status & LSTATUS_R)" break can exit mid-frame if HW has written
the leading segments of a multi-segment frame but not yet the segment
carrying F. On the next call first_seg is NULL again, next_to_clean has
already advanced past the consumed leading segments, and those mbufs
are leaked while the tail segments are mis-assembled as a new frame.
Persist the partial chain across bursts in the ring (e.g.
rx_ring->pkt_first_seg / pkt_last_seg) instead of locals. (Same pattern
is reproduced in enetc_clean_rx_ring_cacheable in patch 10.)
Warning: enetc4 now advertises RTE_ETH_RX_OFFLOAD_SCATTER and
RTE_ETH_TX_OFFLOAD_MULTI_SEGS (VF) but doc/guides/nics/features/
enetc4.ini is not updated (Scattered Rx / Multi segment rows).
Info: the VF dev_info now advertises L3/L4 RX checksum offload, but
enetc_dev_rx_parse() unconditionally sets
RTE_MBUF_F_RX_IP_CKSUM_GOOD | RTE_MBUF_F_RX_L4_CKSUM_GOOD and never
reports *_BAD. With the offload now advertised, an application relying
on it will never see a bad-checksum indication.
Info: dccivac(data + (data_len - 1)) / dcbf(data + (seg_len - 1))
underflow to data-1 when the segment length is 0 (uint16_t promotes to
int). The preceding loop already covers the final cache line, so the
extra op is redundant as well as unsafe for len==0.
[PATCH 07/10] net/enetc: add option to disable VSI messaging
Warning: new devarg "enetc4_vsi_disable" is registered but not
documented in doc/guides/nics/enetc.rst.
[PATCH 08/10] net/enetc: add devargs to control VSI-PSI timeout/delay
Warning: new devargs "enetc4_vsi_timeout" / "enetc4_vsi_delay" are not
documented in doc/guides/nics/enetc.rst.
[PATCH 09/10] net/enetc: set user configurable priority to TX rings
Error: hw->txq_prior is allocated in parse_txq_prior() with
rte_zmalloc() but never freed. It leaks on dev_close / re-probe. Free
it in the close/uninit path (and note it is re-allocated every time the
handler runs, so a repeated key would leak the prior allocation too).
Warning: txq_prior is control-path, CPU-only data; rte_zmalloc()
consumes hugepage memory unnecessarily. Use calloc()/malloc().
Warning: the parsed value is OR'd straight into TBMR:
tx_en |= priv->hw.txq_prior[tx_ring->index];
with no mask. ENETC_TBMR_EN is BIT(31) and there is no TBMR priority
mask defined. A user value with high bits set can corrupt unrelated
TBMR control bits. Mask the input to the valid TBMR priority field.
Info: strdup(value) return is not checked; on failure
strtok(input_str, "|") is called with a NULL first argument, which
resumes from strtok's stale internal state rather than erroring.
Warning: new devarg "enetc4_txq_prior" not documented in
doc/guides/nics/enetc.rst.
[PATCH 10/10] net/enetc4: add cacheable BD ring support with SW cache
Warning: enetc4_dev_hw_init() switches rx_pkt_burst/tx_pkt_burst to the
cache-maintenance variants unconditionally for every enetc4 device
(PF and VF). The commit message scopes this to non-cache-coherent
parts (i.MX95), but the code applies it everywhere, adding dcbf/dccivac
cost on cache-coherent platforms that previously used the _nc fast
path. Gate it on a devarg or coherency/platform check.
Warning: the RX payload invalidation uses dccivac (dc civac =
clean+invalidate). The comment justifies clean-then-invalidate for the
BD ring (refill dcbf leaves BD lines clean), but payload buffers are
not cleaned before being handed to HW. If a payload cache line is dirty
(stale CPU data from a prior use of the mbuf), the clean phase writes
it back over the HW-DMA'd data in DDR before invalidating -> silent RX
corruption on a non-coherent part. Please confirm payload lines can
never be dirty here, or use invalidate-only.
Info: struct enetc_bdr gains "uint64_t bd_base_p" but it is never
referenced anywhere. Remove the dead field.
Info: the 64-bit BD fast copy
__uint128_t *dst128 = (__uint128_t *)&rxbd_temp;
*dst128 = *(const __uint128_t *)rxbd;
takes the address of an 8-byte-aligned stack union (rxbd_temp) as
__uint128_t*. That is an under-aligned 128-bit access (UB); aarch64
tolerates it via ldp/stp but it is fragile. Force 16-byte alignment on
rxbd_temp or copy as two u64.
General (series-wide)
Warning: no release notes. The series adds user-visible features
(scatter-gather, cacheable BD ring support, four new devargs) with no
entry in doc/guides/rel_notes/. New driver capabilities and devargs
need release-note coverage.
^ permalink raw reply
* Re: [PATCH v4 00/23] et/sxe2: added Linkdata sxe2 ethernet driver
From: Stephen Hemminger @ 2026-06-19 20:58 UTC (permalink / raw)
To: liujie5; +Cc: dev
In-Reply-To: <20260619080156.1539964-1-liujie5@linkdatatechnology.com>
On Fri, 19 Jun 2026 16:01:56 +0800
liujie5@linkdatatechnology.com wrote:
> From: Jie Liu <liujie5@linkdatatechnology.com>
>
> This patch set implements core functionality for the SXE2 PMD,
> including basic driver framework, data path setup, and advanced
> offload features (VLAN, RSS,TM, PTP etc.).
Looking over the driver overall, I noticed you are adding cflags for -g.
This is not necessary, meson supports this via -Dbuildtype=debug or -Dbuildtype=debugoptimized
Remove this in meson.build
cflags += ['-g']
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox