From: Ashwin Sekhar T K Date: Tue, 30 Nov 2021 05:45:27 +0000 (+0530) Subject: common/cnxk: use CAS with release semantics for batch alloc X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=09cad550d608af67d6268f91ef2ca68e21398e31;p=dpdk.git common/cnxk: use CAS with release semantics for batch alloc Before issuing the batch alloc, we clear the first word of cache lines so that NPA can update the status. Make sure that this line clear is flushed before the batch alloc is issued. Signed-off-by: Ashwin Sekhar T K Acked-by: Jerin Jacob --- diff --git a/drivers/common/cnxk/roc_io.h b/drivers/common/cnxk/roc_io.h index fe5f7f46d0..4f15503c29 100644 --- a/drivers/common/cnxk/roc_io.h +++ b/drivers/common/cnxk/roc_io.h @@ -78,6 +78,18 @@ roc_atomic64_cas(uint64_t compare, uint64_t swap, int64_t *ptr) return compare; } +static __plt_always_inline uint64_t +roc_atomic64_casl(uint64_t compare, uint64_t swap, int64_t *ptr) +{ + asm volatile(PLT_CPU_FEATURE_PREAMBLE + "casl %[compare], %[swap], [%[ptr]]\n" + : [compare] "+r"(compare) + : [swap] "r"(swap), [ptr] "r"(ptr) + : "memory"); + + return compare; +} + static __plt_always_inline uint64_t roc_atomic64_add_nosync(int64_t incr, int64_t *ptr) { diff --git a/drivers/common/cnxk/roc_io_generic.h b/drivers/common/cnxk/roc_io_generic.h index ceaa3a38d8..5f90835c09 100644 --- a/drivers/common/cnxk/roc_io_generic.h +++ b/drivers/common/cnxk/roc_io_generic.h @@ -41,6 +41,15 @@ roc_atomic64_cas(uint64_t compare, uint64_t swap, int64_t *ptr) return compare; } +static __plt_always_inline uint64_t +roc_atomic64_casl(uint64_t compare, uint64_t swap, int64_t *ptr) +{ + PLT_SET_USED(swap); + PLT_SET_USED(ptr); + + return compare; +} + static inline uint64_t roc_atomic64_add_nosync(int64_t incr, int64_t *ptr) { diff --git a/drivers/common/cnxk/roc_npa.h b/drivers/common/cnxk/roc_npa.h index 46350fdb48..19b9a9352c 100644 --- a/drivers/common/cnxk/roc_npa.h +++ b/drivers/common/cnxk/roc_npa.h @@ -218,7 +218,7 @@ roc_npa_aura_batch_alloc_issue(uint64_t aura_handle, uint64_t *buf, cmp.compare_s.dis_wait = dis_wait; cmp.compare_s.count = num; - res = roc_atomic64_cas(cmp.u, (uint64_t)buf, addr); + res = roc_atomic64_casl(cmp.u, (uint64_t)buf, addr); if (res != ALLOC_RESULT_ACCEPTED && res != ALLOC_RESULT_NOCORE) return -1;