119 lines
4.6 KiB
Diff
119 lines
4.6 KiB
Diff
From: Arthur Kiyanovski <akiyano@amazon.com>
|
|
Date: Mon, 16 Sep 2019 14:31:26 +0300
|
|
Subject: [PATCH] net: ena: add intr_moder_rx_interval to struct ena_com_dev
|
|
and use it
|
|
Origin: https://git.kernel.org/linus/15619e722b16aaa40f942b93631aa92581a7b393
|
|
Bug-Debian: https://bugs.debian.org/941291
|
|
|
|
Add intr_moder_rx_interval to struct ena_com_dev and use it as the
|
|
location where the interrupt moderation rx interval is saved, instead
|
|
of the interrupt moderation table.
|
|
|
|
This is done as a first step before removing the old interrupt moderation
|
|
code.
|
|
|
|
Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/ethernet/amazon/ena/ena_com.c | 20 ++++----------------
|
|
drivers/net/ethernet/amazon/ena/ena_com.h | 8 +++++++-
|
|
drivers/net/ethernet/amazon/ena/ena_netdev.c | 3 ++-
|
|
3 files changed, 13 insertions(+), 18 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
|
|
@@ -1297,9 +1297,6 @@ static int ena_com_init_interrupt_modera
|
|
static void ena_com_update_intr_delay_resolution(struct ena_com_dev *ena_dev,
|
|
u16 intr_delay_resolution)
|
|
{
|
|
- struct ena_intr_moder_entry *intr_moder_tbl = ena_dev->intr_moder_tbl;
|
|
- unsigned int i;
|
|
-
|
|
if (!intr_delay_resolution) {
|
|
pr_err("Illegal intr_delay_resolution provided. Going to use default 1 usec resolution\n");
|
|
intr_delay_resolution = 1;
|
|
@@ -1307,8 +1304,7 @@ static void ena_com_update_intr_delay_re
|
|
ena_dev->intr_delay_resolution = intr_delay_resolution;
|
|
|
|
/* update Rx */
|
|
- for (i = 0; i < ENA_INTR_MAX_NUM_OF_LEVELS; i++)
|
|
- intr_moder_tbl[i].intr_moder_interval /= intr_delay_resolution;
|
|
+ ena_dev->intr_moder_rx_interval /= intr_delay_resolution;
|
|
|
|
/* update Tx */
|
|
ena_dev->intr_moder_tx_interval /= intr_delay_resolution;
|
|
@@ -2798,11 +2794,8 @@ int ena_com_update_nonadaptive_moderatio
|
|
return -EFAULT;
|
|
}
|
|
|
|
- /* We use LOWEST entry of moderation table for storing
|
|
- * nonadaptive interrupt coalescing values
|
|
- */
|
|
- ena_dev->intr_moder_tbl[ENA_INTR_MODER_LOWEST].intr_moder_interval =
|
|
- rx_coalesce_usecs / ena_dev->intr_delay_resolution;
|
|
+ ena_dev->intr_moder_rx_interval = rx_coalesce_usecs /
|
|
+ ena_dev->intr_delay_resolution;
|
|
|
|
return 0;
|
|
}
|
|
@@ -2907,12 +2900,7 @@ unsigned int ena_com_get_nonadaptive_mod
|
|
|
|
unsigned int ena_com_get_nonadaptive_moderation_interval_rx(struct ena_com_dev *ena_dev)
|
|
{
|
|
- struct ena_intr_moder_entry *intr_moder_tbl = ena_dev->intr_moder_tbl;
|
|
-
|
|
- if (intr_moder_tbl)
|
|
- return intr_moder_tbl[ENA_INTR_MODER_LOWEST].intr_moder_interval;
|
|
-
|
|
- return 0;
|
|
+ return ena_dev->intr_moder_rx_interval;
|
|
}
|
|
|
|
void ena_com_init_intr_moderation_entry(struct ena_com_dev *ena_dev,
|
|
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
|
|
@@ -93,7 +93,7 @@
|
|
#define ENA_INTR_HIGHEST_BYTES (192 * 1024)
|
|
|
|
#define ENA_INTR_INITIAL_TX_INTERVAL_USECS 196
|
|
-#define ENA_INTR_INITIAL_RX_INTERVAL_USECS 4
|
|
+#define ENA_INTR_INITIAL_RX_INTERVAL_USECS 0
|
|
#define ENA_INTR_DELAY_OLD_VALUE_WEIGHT 6
|
|
#define ENA_INTR_DELAY_NEW_VALUE_WEIGHT 4
|
|
#define ENA_INTR_MODER_LEVEL_STRIDE 2
|
|
@@ -376,7 +376,13 @@ struct ena_com_dev {
|
|
struct ena_host_attribute host_attr;
|
|
bool adaptive_coalescing;
|
|
u16 intr_delay_resolution;
|
|
+
|
|
+ /* interrupt moderation intervals are in usec divided by
|
|
+ * intr_delay_resolution, which is supplied by the device.
|
|
+ */
|
|
u32 intr_moder_tx_interval;
|
|
+ u32 intr_moder_rx_interval;
|
|
+
|
|
struct ena_intr_moder_entry *intr_moder_tbl;
|
|
|
|
struct ena_com_llq_info llq_info;
|
|
Index: linux/drivers/net/ethernet/amazon/ena/ena_netdev.c
|
|
===================================================================
|
|
--- linux.orig/drivers/net/ethernet/amazon/ena/ena_netdev.c
|
|
+++ linux/drivers/net/ethernet/amazon/ena/ena_netdev.c
|
|
@@ -3487,10 +3487,11 @@ static int ena_probe(struct pci_dev *pde
|
|
calc_queue_ctx.get_feat_ctx = &get_feat_ctx;
|
|
calc_queue_ctx.pdev = pdev;
|
|
|
|
- /* initial Tx interrupt delay, Assumes 1 usec granularity.
|
|
+ /* Initial Tx and RX interrupt delay. Assumes 1 usec granularity.
|
|
* Updated during device initialization with the real granularity
|
|
*/
|
|
ena_dev->intr_moder_tx_interval = ENA_INTR_INITIAL_TX_INTERVAL_USECS;
|
|
+ ena_dev->intr_moder_rx_interval = ENA_INTR_INITIAL_RX_INTERVAL_USECS;
|
|
io_queue_num = ena_calc_io_queue_num(pdev, ena_dev, &get_feat_ctx);
|
|
rc = ena_calc_queue_size(&calc_queue_ctx);
|
|
if (rc || io_queue_num <= 0) {
|