From: Hiroshi Shimamoto <h-shimam...@ct.jp.nec.com> Because DPDK has its own compare and set function to optimize to dedicated processor type, use that rte_atomic32_cmpset() instead of cmpxchg macro which is specially introduced for MEMNIC.
Signed-off-by: Hiroshi Shimamoto <h-shimamoto at ct.jp.nec.com> --- common/memnic.h | 12 ------------ pmd/pmd_memnic.c | 10 ++++++---- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/common/memnic.h b/common/memnic.h index 2187ac1..84e941c 100644 --- a/common/memnic.h +++ b/common/memnic.h @@ -120,18 +120,6 @@ struct memnic_area { /* for userspace */ #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) -static inline uint32_t cmpxchg(uint32_t *dst, uint32_t old, uint32_t new) -{ - volatile uint32_t *ptr = (volatile uint32_t *)dst; - uint32_t ret; - - asm volatile("lock; cmpxchgl %2, %1" - : "=a" (ret), "+m" (*ptr) - : "r" (new), "0" (old) - : "memory"); - - return ret; -} #endif /* __KERNEL__ */ #endif /* MEMNIC_H */ diff --git a/pmd/pmd_memnic.c b/pmd/pmd_memnic.c index 4a1c1e4..4abdf26 100644 --- a/pmd/pmd_memnic.c +++ b/pmd/pmd_memnic.c @@ -314,7 +314,7 @@ static uint16_t memnic_xmit_pkts(void *tx_queue, struct memnic_data *data = &adapter->nic->down; struct memnic_packet *p; uint16_t nr; - int idx, old; + int idx; struct rte_eth_stats *st = &adapter->stats[rte_lcore_id()]; uint64_t pkts, bytes, errs; @@ -335,10 +335,12 @@ static uint16_t memnic_xmit_pkts(void *tx_queue, retry: idx = ACCESS_ONCE(adapter->down_idx); p = &data->packets[idx]; - old = cmpxchg(&p->status, MEMNIC_PKT_ST_FREE, MEMNIC_PKT_ST_USED); - if (old != MEMNIC_PKT_ST_FREE) { - if (old == MEMNIC_PKT_ST_FILLED && + if (unlikely(rte_atomic32_cmpset(&p->status, + MEMNIC_PKT_ST_FREE, MEMNIC_PKT_ST_USED) == 0)) { + /* cmpxchg failed */ + if (p->status == MEMNIC_PKT_ST_FILLED && idx == ACCESS_ONCE(adapter->down_idx)) { + /* what we're seeing is FILLED means queue full */ errs++; break; } -- 1.8.4