[PATCH v4 17/31] net/ena/base: missing admin interrupt reset reason
shaibran at amazon.com
shaibran at amazon.com
Tue Mar 12 19:07:02 CET 2024
From: Shai Brandes <shaibran at amazon.com>
There can be cases when we trigger reset if an admin interrupt
is missing.
In order to identify this use-case specifically,
this commit adds a new reset reason.
Signed-off-by: Shai Brandes <shaibran at amazon.com>
Reviewed-by: Amit Bernstein <amitbern at amazon.com>
---
drivers/net/ena/base/ena_com.c | 2 ++
drivers/net/ena/base/ena_com.h | 12 ++++++++++++
drivers/net/ena/base/ena_defs/ena_regs_defs.h | 1 +
3 files changed, 15 insertions(+)
diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c
index d2de5e172d..8e9c112715 100644
--- a/drivers/net/ena/base/ena_com.c
+++ b/drivers/net/ena/base/ena_com.c
@@ -803,6 +803,7 @@ static int ena_com_wait_and_process_admin_cq_interrupts(struct ena_comp_ctx *com
ENA_SPINLOCK_UNLOCK(admin_queue->q_lock, flags);
if (comp_ctx->status == ENA_CMD_COMPLETED) {
+ admin_queue->is_missing_admin_interrupt = true;
ena_trc_err(admin_queue->ena_dev,
"The ena device sent a completion but the driver didn't receive a MSI-X interrupt (cmd %d), autopolling mode is %s\n",
comp_ctx->cmd_opcode, admin_queue->auto_polling ? "ON" : "OFF");
@@ -2138,6 +2139,7 @@ int ena_com_admin_init(struct ena_com_dev *ena_dev,
admin_queue->ena_dev = ena_dev;
admin_queue->running_state = true;
+ admin_queue->is_missing_admin_interrupt = false;
return 0;
error:
diff --git a/drivers/net/ena/base/ena_com.h b/drivers/net/ena/base/ena_com.h
index c62016cc06..c999cd2381 100644
--- a/drivers/net/ena/base/ena_com.h
+++ b/drivers/net/ena/base/ena_com.h
@@ -237,6 +237,8 @@ struct ena_com_admin_queue {
*/
bool running_state;
+ bool is_missing_admin_interrupt;
+
/* Count the number of outstanding admin commands */
ena_atomic32_t outstanding_cmds;
@@ -1089,6 +1091,16 @@ int ena_com_config_dev_mode(struct ena_com_dev *ena_dev,
struct ena_admin_feature_llq_desc *llq_features,
struct ena_llq_configurations *llq_default_config);
+/* ena_com_get_missing_admin_interrupt - Return if there is a missing admin interrupt
+ * @ena_dev: ENA communication layer struct
+ *
+ * @return - true if there is a missing admin interrupt or false otherwise
+ */
+static inline bool ena_com_get_missing_admin_interrupt(struct ena_com_dev *ena_dev)
+{
+ return ena_dev->admin_queue.is_missing_admin_interrupt;
+}
+
/* ena_com_io_sq_to_ena_dev - Extract ena_com_dev using contained field io_sq.
* @io_sq: IO submit queue struct
*
diff --git a/drivers/net/ena/base/ena_defs/ena_regs_defs.h b/drivers/net/ena/base/ena_defs/ena_regs_defs.h
index a94025dc77..db6a97d675 100644
--- a/drivers/net/ena/base/ena_defs/ena_regs_defs.h
+++ b/drivers/net/ena/base/ena_defs/ena_regs_defs.h
@@ -24,6 +24,7 @@ enum ena_regs_reset_reason_types {
ENA_REGS_RESET_SUSPECTED_POLL_STARVATION = 15,
ENA_REGS_RESET_RX_DESCRIPTOR_MALFORMED = 16,
ENA_REGS_RESET_TX_DESCRIPTOR_MALFORMED = 17,
+ ENA_REGS_RESET_MISSING_ADMIN_INTERRUPT = 18,
ENA_REGS_RESET_LAST,
};
--
2.17.1
More information about the dev
mailing list