[PATCH v8 14/25] net/netvsc: replace rte_atomic32 with stdatomic
WARM3d
REVIEWED: 3 (3M)
From: Stephen Hemminger <stephen@networkplumber.org>
Date: 2026-09-17 20:12:46
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Revision v8 of 3 in this series; 1 review trailer.
Revisions (3)
- v7 [diff vs current]
- v8 current
- v9 [diff vs current]
Change the rndis transaction id and buffer usage to use stdatomic functions. It also removes rte_smp_wmb() and relies on the release ordering of compare-exchange. Signed-off-by: Stephen Hemminger <stephen@networkplumber.org> Reviewed-by: Long Li <longli@microsoft.com> --- 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..4e13d7c38f 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) + 1; } 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