> 
> Change the rndis transaction id and buffer usage to use stdatomic functions.
> 
> Signed-off-by: Stephen Hemminger <[email protected]>

Reviewed-by: Long Li <[email protected]>


> ---
>  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

Reply via email to