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

