Skip to content

Commit eece4d2

Browse files
Sameeh Jubrandavem330
authored andcommitted
net: ena: add ethtool function for changing io queue sizes
Implement the set_ringparam() function of the ethtool interface to enable the changing of io queue sizes. Signed-off-by: Arthur Kiyanovski <[email protected]> Signed-off-by: Sameeh Jubran <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 13ca32a commit eece4d2

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

drivers/net/ethernet/amazon/ena/ena_ethtool.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,27 @@ static void ena_get_ringparam(struct net_device *netdev,
493493
ring->rx_pending = adapter->rx_ring[0].ring_size;
494494
}
495495

496+
static int ena_set_ringparam(struct net_device *netdev,
497+
struct ethtool_ringparam *ring)
498+
{
499+
struct ena_adapter *adapter = netdev_priv(netdev);
500+
u32 new_tx_size, new_rx_size;
501+
502+
new_tx_size = ring->tx_pending < ENA_MIN_RING_SIZE ?
503+
ENA_MIN_RING_SIZE : ring->tx_pending;
504+
new_tx_size = rounddown_pow_of_two(new_tx_size);
505+
506+
new_rx_size = ring->rx_pending < ENA_MIN_RING_SIZE ?
507+
ENA_MIN_RING_SIZE : ring->rx_pending;
508+
new_rx_size = rounddown_pow_of_two(new_rx_size);
509+
510+
if (new_tx_size == adapter->requested_tx_ring_size &&
511+
new_rx_size == adapter->requested_rx_ring_size)
512+
return 0;
513+
514+
return ena_update_queue_sizes(adapter, new_tx_size, new_rx_size);
515+
}
516+
496517
static u32 ena_flow_hash_to_flow_type(u16 hash_fields)
497518
{
498519
u32 data = 0;
@@ -858,6 +879,7 @@ static const struct ethtool_ops ena_ethtool_ops = {
858879
.get_coalesce = ena_get_coalesce,
859880
.set_coalesce = ena_set_coalesce,
860881
.get_ringparam = ena_get_ringparam,
882+
.set_ringparam = ena_set_ringparam,
861883
.get_sset_count = ena_get_sset_count,
862884
.get_strings = ena_get_strings,
863885
.get_ethtool_stats = ena_get_ethtool_stats,

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,6 +2031,20 @@ static int ena_close(struct net_device *netdev)
20312031
return 0;
20322032
}
20332033

2034+
int ena_update_queue_sizes(struct ena_adapter *adapter,
2035+
u32 new_tx_size,
2036+
u32 new_rx_size)
2037+
{
2038+
bool dev_up;
2039+
2040+
dev_up = test_bit(ENA_FLAG_DEV_UP, &adapter->flags);
2041+
ena_close(adapter->netdev);
2042+
adapter->requested_tx_ring_size = new_tx_size;
2043+
adapter->requested_rx_ring_size = new_rx_size;
2044+
ena_init_io_rings(adapter);
2045+
return dev_up ? ena_up(adapter) : 0;
2046+
}
2047+
20342048
static void ena_tx_csum(struct ena_com_tx_ctx *ena_tx_ctx, struct sk_buff *skb)
20352049
{
20362050
u32 mss = skb_shinfo(skb)->gso_size;

drivers/net/ethernet/amazon/ena/ena_netdev.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@
8181
#define ENA_DEFAULT_RING_SIZE (1024)
8282
#define ENA_MIN_RING_SIZE (256)
8383

84-
8584
#define ENA_TX_WAKEUP_THRESH (MAX_SKB_FRAGS + 2)
8685
#define ENA_DEFAULT_RX_COPYBREAK (256 - NET_IP_ALIGN)
8786

@@ -389,6 +388,10 @@ void ena_dump_stats_to_dmesg(struct ena_adapter *adapter);
389388

390389
void ena_dump_stats_to_buf(struct ena_adapter *adapter, u8 *buf);
391390

391+
int ena_update_queue_sizes(struct ena_adapter *adapter,
392+
u32 new_tx_size,
393+
u32 new_rx_size);
394+
392395
int ena_get_sset_count(struct net_device *netdev, int sset);
393396

394397
#endif /* !(ENA_H) */

0 commit comments

Comments
 (0)