[v2,1/2] mempool/cnxk: fix indefinite wait in batch alloc
Checks
Commit Message
Avoid waiting indefinitely when counting batch allocated
pointers by adding a wait timeout.
Fixes: 50d08d3934ec ("common/cnxk: fix batch alloc completion poll logic")
Signed-off-by: Ashwin Sekhar T K <asekhar@marvell.com>
---
drivers/common/cnxk/roc_npa.h | 15 +++++++++------
drivers/mempool/cnxk/cn10k_mempool_ops.c | 3 ++-
2 files changed, 11 insertions(+), 7 deletions(-)
@@ -241,19 +241,23 @@ roc_npa_aura_batch_alloc_issue(uint64_t aura_handle, uint64_t *buf,
}
static inline void
-roc_npa_batch_alloc_wait(uint64_t *cache_line)
+roc_npa_batch_alloc_wait(uint64_t *cache_line, unsigned int wait_us)
{
+ const uint64_t ticks = (uint64_t)wait_us * plt_tsc_hz() / (uint64_t)1E6;
+ const uint64_t start = plt_tsc_cycles();
+
/* Batch alloc status code is updated in bits [5:6] of the first word
* of the 128 byte cache line.
*/
while (((__atomic_load_n(cache_line, __ATOMIC_RELAXED) >> 5) & 0x3) ==
ALLOC_CCODE_INVAL)
- ;
+ if (wait_us && (plt_tsc_cycles() - start) >= ticks)
+ break;
}
static inline unsigned int
roc_npa_aura_batch_alloc_count(uint64_t *aligned_buf, unsigned int num,
- unsigned int do_wait)
+ unsigned int wait_us)
{
unsigned int count, i;
@@ -267,8 +271,7 @@ roc_npa_aura_batch_alloc_count(uint64_t *aligned_buf, unsigned int num,
status = (struct npa_batch_alloc_status_s *)&aligned_buf[i];
- if (do_wait)
- roc_npa_batch_alloc_wait(&aligned_buf[i]);
+ roc_npa_batch_alloc_wait(&aligned_buf[i], wait_us);
count += status->count;
}
@@ -293,7 +296,7 @@ roc_npa_aura_batch_alloc_extract(uint64_t *buf, uint64_t *aligned_buf,
status = (struct npa_batch_alloc_status_s *)&aligned_buf[i];
- roc_npa_batch_alloc_wait(&aligned_buf[i]);
+ roc_npa_batch_alloc_wait(&aligned_buf[i], 0);
line_count = status->count;
@@ -9,6 +9,7 @@
#define BATCH_ALLOC_SZ ROC_CN10K_NPA_BATCH_ALLOC_MAX_PTRS
#define BATCH_OP_DATA_TABLE_MZ_NAME "batch_op_data_table_mz"
+#define BATCH_ALLOC_WAIT_US 5
enum batch_op_status {
BATCH_ALLOC_OP_NOT_ISSUED = 0,
@@ -178,7 +179,7 @@ cn10k_mempool_get_count(const struct rte_mempool *mp)
if (mem->status == BATCH_ALLOC_OP_ISSUED)
count += roc_npa_aura_batch_alloc_count(
- mem->objs, BATCH_ALLOC_SZ, 1);
+ mem->objs, BATCH_ALLOC_SZ, BATCH_ALLOC_WAIT_US);
if (mem->status == BATCH_ALLOC_OP_DONE)
count += mem->sz;