From: Sameeh Jubran 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 Signed-off-by: Sameeh Jubran Signed-off-by: David S. Miller --- 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) */