107 lines
3.8 KiB
Diff
107 lines
3.8 KiB
Diff
From: Sameeh Jubran <sameehj@amazon.com>
|
|
Date: Tue, 11 Jun 2019 14:58:09 +0300
|
|
Subject: [PATCH] net: ena: add ethtool function for changing io queue sizes
|
|
Origin: https://git.kernel.org/linus/eece4d2ab9d214e3b12f5ac1ed189a05793b28a5
|
|
Bug-Debian: https://bugs.debian.org/941291
|
|
|
|
Implement the set_ringparam() function of the ethtool interface
|
|
to enable the changing of io queue sizes.
|
|
|
|
Signed-off-by: Arthur Kiyanovski <akiyano@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_ethtool.c | 22 +++++++++++++++++++
|
|
drivers/net/ethernet/amazon/ena/ena_netdev.c | 14 ++++++++++++
|
|
drivers/net/ethernet/amazon/ena/ena_netdev.h | 5 ++++-
|
|
3 files changed, 40 insertions(+), 1 deletion(-)
|
|
|
|
Index: linux/drivers/net/ethernet/amazon/ena/ena_ethtool.c
|
|
===================================================================
|
|
--- linux.orig/drivers/net/ethernet/amazon/ena/ena_ethtool.c
|
|
+++ linux/drivers/net/ethernet/amazon/ena/ena_ethtool.c
|
|
@@ -454,6 +454,27 @@ static void ena_get_ringparam(struct net
|
|
ring->rx_pending = adapter->rx_ring[0].ring_size;
|
|
}
|
|
|
|
+static int ena_set_ringparam(struct net_device *netdev,
|
|
+ struct ethtool_ringparam *ring)
|
|
+{
|
|
+ struct ena_adapter *adapter = netdev_priv(netdev);
|
|
+ u32 new_tx_size, new_rx_size;
|
|
+
|
|
+ new_tx_size = ring->tx_pending < ENA_MIN_RING_SIZE ?
|
|
+ ENA_MIN_RING_SIZE : ring->tx_pending;
|
|
+ new_tx_size = rounddown_pow_of_two(new_tx_size);
|
|
+
|
|
+ new_rx_size = ring->rx_pending < ENA_MIN_RING_SIZE ?
|
|
+ ENA_MIN_RING_SIZE : ring->rx_pending;
|
|
+ new_rx_size = rounddown_pow_of_two(new_rx_size);
|
|
+
|
|
+ if (new_tx_size == adapter->requested_tx_ring_size &&
|
|
+ new_rx_size == adapter->requested_rx_ring_size)
|
|
+ return 0;
|
|
+
|
|
+ return ena_update_queue_sizes(adapter, new_tx_size, new_rx_size);
|
|
+}
|
|
+
|
|
static u32 ena_flow_hash_to_flow_type(u16 hash_fields)
|
|
{
|
|
u32 data = 0;
|
|
@@ -805,6 +826,7 @@ static const struct ethtool_ops ena_etht
|
|
.get_coalesce = ena_get_coalesce,
|
|
.set_coalesce = ena_set_coalesce,
|
|
.get_ringparam = ena_get_ringparam,
|
|
+ .set_ringparam = ena_set_ringparam,
|
|
.get_sset_count = ena_get_sset_count,
|
|
.get_strings = ena_get_strings,
|
|
.get_ethtool_stats = ena_get_ethtool_stats,
|
|
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
|
|
@@ -2028,6 +2028,20 @@ static int ena_close(struct net_device *
|
|
return 0;
|
|
}
|
|
|
|
+int ena_update_queue_sizes(struct ena_adapter *adapter,
|
|
+ u32 new_tx_size,
|
|
+ u32 new_rx_size)
|
|
+{
|
|
+ bool dev_up;
|
|
+
|
|
+ dev_up = test_bit(ENA_FLAG_DEV_UP, &adapter->flags);
|
|
+ ena_close(adapter->netdev);
|
|
+ adapter->requested_tx_ring_size = new_tx_size;
|
|
+ adapter->requested_rx_ring_size = new_rx_size;
|
|
+ ena_init_io_rings(adapter);
|
|
+ return dev_up ? ena_up(adapter) : 0;
|
|
+}
|
|
+
|
|
static void ena_tx_csum(struct ena_com_tx_ctx *ena_tx_ctx, struct sk_buff *skb)
|
|
{
|
|
u32 mss = skb_shinfo(skb)->gso_size;
|
|
Index: linux/drivers/net/ethernet/amazon/ena/ena_netdev.h
|
|
===================================================================
|
|
--- linux.orig/drivers/net/ethernet/amazon/ena/ena_netdev.h
|
|
+++ linux/drivers/net/ethernet/amazon/ena/ena_netdev.h
|
|
@@ -81,7 +81,6 @@
|
|
#define ENA_DEFAULT_RING_SIZE (1024)
|
|
#define ENA_MIN_RING_SIZE (256)
|
|
|
|
-
|
|
#define ENA_TX_WAKEUP_THRESH (MAX_SKB_FRAGS + 2)
|
|
#define ENA_DEFAULT_RX_COPYBREAK (256 - NET_IP_ALIGN)
|
|
|
|
@@ -386,6 +385,10 @@ void ena_dump_stats_to_dmesg(struct ena_
|
|
|
|
void ena_dump_stats_to_buf(struct ena_adapter *adapter, u8 *buf);
|
|
|
|
+int ena_update_queue_sizes(struct ena_adapter *adapter,
|
|
+ u32 new_tx_size,
|
|
+ u32 new_rx_size);
|
|
+
|
|
int ena_get_sset_count(struct net_device *netdev, int sset);
|
|
|
|
#endif /* !(ENA_H) */
|