[EXTERNAL] [PATCH v5 12/24] net/netvsc: replace rte_atomic32 with stdatomic
Long Li
longli at microsoft.com
Mon Jun 22 22:43:29 CEST 2026
>
> Change the rndis transaction id and buffer usage to use stdatomic functions.
>
> Signed-off-by: Stephen Hemminger <stephen at networkplumber.org>
Reviewed-by: Long Li <longli at 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..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
More information about the dev
mailing list