[dpdk-dev] [PATCH] net/ena: Fix admin cq polling for 32-bit apps
David Harton
dharton at cisco.com
Wed May 29 23:01:39 CEST 2019
Recent modifications to admin command queue polling logic
did not support 32-bit applications. Updated the driver to
work for 32 or 64 bit applications as well as avoiding
roll-over possibility.
Fixes: 3adcba9a89 ("net/ena: update HAL to the newer version")
Signed-off-by: David Harton <dharton at cisco.com>
---
drivers/net/ena/base/ena_com.c | 10 +++++++---
drivers/net/ena/base/ena_plat_dpdk.h | 6 +-----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c
index b688067f7..b96adde3c 100644
--- a/drivers/net/ena/base/ena_com.c
+++ b/drivers/net/ena/base/ena_com.c
@@ -547,10 +547,13 @@ static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c
struct ena_com_admin_queue *admin_queue)
{
unsigned long flags = 0;
- unsigned long timeout;
+ u32 timeout_ms;
int ret;
- timeout = ENA_GET_SYSTEM_TIMEOUT(admin_queue->completion_timeout);
+ /* Calculate ms granularity timeout from us completion_timeout
+ * making sure we retry once if we have at least 1ms
+ */
+ timeout_ms = (admin_queue->completion_timeout / 1000) + (ENA_POLL_MS - 1);
while (1) {
ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
@@ -560,7 +563,7 @@ static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c
if (comp_ctx->status != ENA_CMD_SUBMITTED)
break;
- if (ENA_TIME_EXPIRE(timeout)) {
+ if (timeout_ms < ENA_POLL_MS) {
ena_trc_err("Wait for completion (polling) timeout\n");
/* ENA didn't have any completion */
ENA_SPINLOCK_LOCK(admin_queue->q_lock, flags);
@@ -573,6 +576,7 @@ static int ena_com_wait_and_process_admin_cq_polling(struct ena_comp_ctx *comp_c
}
ENA_MSLEEP(ENA_POLL_MS);
+ timeout_ms -= ENA_POLL_MS;
}
if (unlikely(comp_ctx->status == ENA_CMD_ABORTED)) {
diff --git a/drivers/net/ena/base/ena_plat_dpdk.h b/drivers/net/ena/base/ena_plat_dpdk.h
index 902d91efb..0cb837e4f 100644
--- a/drivers/net/ena/base/ena_plat_dpdk.h
+++ b/drivers/net/ena/base/ena_plat_dpdk.h
@@ -178,7 +178,7 @@ do { \
do { \
struct timespec wait; \
struct timeval now; \
- unsigned long timeout_us; \
+ uint64_t timeout_us; \
gettimeofday(&now, NULL); \
wait.tv_sec = now.tv_sec + timeout / 1000000UL; \
timeout_us = timeout % 1000000UL; \
@@ -196,10 +196,6 @@ do { \
#define ena_wait_event_t ena_wait_queue_t
#define ENA_MIGHT_SLEEP()
-#define ENA_TIME_EXPIRE(timeout) (timeout < rte_get_timer_cycles())
-#define ENA_GET_SYSTEM_TIMEOUT(timeout_us) \
- (timeout_us * rte_get_timer_hz() / 1000000 + rte_get_timer_cycles())
-
/*
* Each rte_memzone should have unique name.
* To satisfy it, count number of allocations and add it to name.
--
2.19.1
More information about the dev
mailing list