From: Arthur Kiyanovski 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 Signed-off-by: David S. Miller --- 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) {