diff options
Diffstat (limited to '')
-rw-r--r-- | debian/patches/features/all/ena/net-ena-allow-automatic-fallback-to-polling-mode.patch | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/debian/patches/features/all/ena/net-ena-allow-automatic-fallback-to-polling-mode.patch b/debian/patches/features/all/ena/net-ena-allow-automatic-fallback-to-polling-mode.patch new file mode 100644 index 000000000..dab6166e1 --- /dev/null +++ b/debian/patches/features/all/ena/net-ena-allow-automatic-fallback-to-polling-mode.patch @@ -0,0 +1,103 @@ +From: Sameeh Jubran <sameehj@amazon.com> +Date: Mon, 3 Jun 2019 17:43:25 +0300 +Subject: [PATCH] net: ena: allow automatic fallback to polling mode +Origin: https://git.kernel.org/linus/a4e262cde3cda4491ce666e7c5270954c4d926b9 +Bug-Debian: https://bugs.debian.org/941291 + +Enable fallback to polling mode for Admin queue +when identified a command response arrival +without an accompanying MSI-X interrupt + +Signed-off-by: Igor Chauskin <igorch@amazon.com> +Signed-off-by: Sameeh Jubran <sameehj@amazon.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + drivers/net/ethernet/amazon/ena/ena_com.c | 34 +++++++++++++++++------ + drivers/net/ethernet/amazon/ena/ena_com.h | 14 ++++++++++ + 2 files changed, 39 insertions(+), 9 deletions(-) + +Index: linux/drivers/net/ethernet/amazon/ena/ena_com.c +=================================================================== +--- linux.orig/drivers/net/ethernet/amazon/ena/ena_com.c ++++ linux/drivers/net/ethernet/amazon/ena/ena_com.c +@@ -762,16 +762,26 @@ static int ena_com_wait_and_process_admi + admin_queue->stats.no_completion++; + spin_unlock_irqrestore(&admin_queue->q_lock, flags); + +- if (comp_ctx->status == ENA_CMD_COMPLETED) +- pr_err("The ena device have completion but the driver didn't receive any MSI-X interrupt (cmd %d)\n", +- comp_ctx->cmd_opcode); +- else +- pr_err("The ena device doesn't send any completion for the admin cmd %d status %d\n", ++ if (comp_ctx->status == ENA_CMD_COMPLETED) { ++ pr_err("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"); ++ /* Check if fallback to polling is enabled */ ++ if (admin_queue->auto_polling) ++ admin_queue->polling = true; ++ } else { ++ pr_err("The ena device doesn't send a completion for the admin cmd %d status %d\n", + comp_ctx->cmd_opcode, comp_ctx->status); +- +- admin_queue->running_state = false; +- ret = -ETIME; +- goto err; ++ } ++ /* Check if shifted to polling mode. ++ * This will happen if there is a completion without an interrupt ++ * and autopolling mode is enabled. Continuing normal execution in such case ++ */ ++ if (!admin_queue->polling) { ++ admin_queue->running_state = false; ++ ret = -ETIME; ++ goto err; ++ } + } + + ret = ena_com_comp_status_to_errno(comp_ctx->comp_status); +@@ -1650,6 +1660,12 @@ void ena_com_set_admin_polling_mode(stru + ena_dev->admin_queue.polling = polling; + } + ++void ena_com_set_admin_auto_polling_mode(struct ena_com_dev *ena_dev, ++ bool polling) ++{ ++ ena_dev->admin_queue.auto_polling = polling; ++} ++ + int ena_com_mmio_reg_read_request_init(struct ena_com_dev *ena_dev) + { + struct ena_com_mmio_read *mmio_read = &ena_dev->mmio_read; +Index: linux/drivers/net/ethernet/amazon/ena/ena_com.h +=================================================================== +--- linux.orig/drivers/net/ethernet/amazon/ena/ena_com.h ++++ linux/drivers/net/ethernet/amazon/ena/ena_com.h +@@ -283,6 +283,9 @@ struct ena_com_admin_queue { + /* Indicate if the admin queue should poll for completion */ + bool polling; + ++ /* Define if fallback to polling mode should occur */ ++ bool auto_polling; ++ + u16 curr_cmd_id; + + /* Indicate that the ena was initialized and can +@@ -538,6 +541,17 @@ void ena_com_set_admin_polling_mode(stru + */ + bool ena_com_get_ena_admin_polling_mode(struct ena_com_dev *ena_dev); + ++/* ena_com_set_admin_auto_polling_mode - Enable autoswitch to polling mode ++ * @ena_dev: ENA communication layer struct ++ * @polling: Enable/Disable polling mode ++ * ++ * Set the autopolling mode. ++ * If autopolling is on: ++ * In case of missing interrupt when data is available switch to polling. ++ */ ++void ena_com_set_admin_auto_polling_mode(struct ena_com_dev *ena_dev, ++ bool polling); ++ + /* ena_com_admin_q_comp_intr_handler - admin queue interrupt handler + * @ena_dev: ENA communication layer struct + * |