| From aefe930b8a1c7d68408cac2f8aaa58a18e99e175 Mon Sep 17 00:00:00 2001 |
| From: Arthur Kiyanovski <akiyano@amazon.com> |
| Date: Tue, 11 Feb 2020 15:17:47 +0000 |
| Subject: [PATCH] net: ena: fix incorrectly saving queue numbers when setting |
| RSS indirection table |
| |
| commit 92569fd27f5cb0ccbdf7c7d70044b690e89a0277 upstream. |
| |
| The indirection table has the indices of the Rx queues. When we store it |
| during set indirection operation, we convert the indices to our internal |
| representation of the indices. |
| |
| Our internal representation of the indices is: even indices for Tx and |
| uneven indices for Rx, where every Tx/Rx pair are in a consecutive order |
| starting from 0. For example if the driver has 3 queues (3 for Tx and 3 |
| for Rx) then the indices are as follows: |
| 0 1 2 3 4 5 |
| Tx Rx Tx Rx Tx Rx |
| |
| The BUG: |
| The issue is that when we satisfy a get request for the indirection |
| table, we don't convert the indices back to the original representation. |
| |
| The FIX: |
| Simply apply the inverse function for the indices of the indirection |
| table after we set it. |
| |
| Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)") |
| Signed-off-by: Sameeh Jubran <sameehj@amazon.com> |
| Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/ethernet/amazon/ena/ena_ethtool.c |
| index cef47c1ed789..f9dd9aea6d98 100644 |
| --- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c |
| +++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c |
| @@ -651,6 +651,28 @@ static u32 ena_get_rxfh_key_size(struct net_device *netdev) |
| return ENA_HASH_KEY_SIZE; |
| } |
| |
| +static int ena_indirection_table_get(struct ena_adapter *adapter, u32 *indir) |
| +{ |
| + struct ena_com_dev *ena_dev = adapter->ena_dev; |
| + int i, rc; |
| + |
| + if (!indir) |
| + return 0; |
| + |
| + rc = ena_com_indirect_table_get(ena_dev, indir); |
| + if (rc) |
| + return rc; |
| + |
| + /* Our internal representation of the indices is: even indices |
| + * for Tx and uneven indices for Rx. We need to convert the Rx |
| + * indices to be consecutive |
| + */ |
| + for (i = 0; i < ENA_RX_RSS_TABLE_SIZE; i++) |
| + indir[i] = ENA_IO_RXQ_IDX_TO_COMBINED_IDX(indir[i]); |
| + |
| + return rc; |
| +} |
| + |
| static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, |
| u8 *hfunc) |
| { |
| @@ -659,7 +681,7 @@ static int ena_get_rxfh(struct net_device *netdev, u32 *indir, u8 *key, |
| u8 func; |
| int rc; |
| |
| - rc = ena_com_indirect_table_get(adapter->ena_dev, indir); |
| + rc = ena_indirection_table_get(adapter, indir); |
| if (rc) |
| return rc; |
| |
| diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h b/drivers/net/ethernet/amazon/ena/ena_netdev.h |
| index 63870072cbbd..77630bcfb723 100644 |
| --- a/drivers/net/ethernet/amazon/ena/ena_netdev.h |
| +++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h |
| @@ -125,6 +125,8 @@ |
| |
| #define ENA_IO_TXQ_IDX(q) (2 * (q)) |
| #define ENA_IO_RXQ_IDX(q) (2 * (q) + 1) |
| +#define ENA_IO_TXQ_IDX_TO_COMBINED_IDX(q) ((q) / 2) |
| +#define ENA_IO_RXQ_IDX_TO_COMBINED_IDX(q) (((q) - 1) / 2) |
| |
| #define ENA_MGMNT_IRQ_IDX 0 |
| #define ENA_IO_IRQ_FIRST_IDX 1 |
| -- |
| 2.7.4 |
| |