]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net: ena: Fix rx_copybreak value update
authorDavid Arinzon <darinzon@amazon.com>
Thu, 29 Dec 2022 07:30:09 +0000 (07:30 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2023 11:02:18 +0000 (12:02 +0100)
[ Upstream commit c7062aaee099f2f43d6f07a71744b44b94b94b34 ]

Make the upper bound on rx_copybreak tighter, by
making sure it is smaller than the minimum of mtu and
ENA_PAGE_SIZE. With the current upper bound of mtu,
rx_copybreak can be larger than a page. Such large
rx_copybreak will not bring any performance benefit to
the user and therefore makes no sense.

In addition, the value update was only reflected in
the adapter structure, but not applied for each ring,
causing it to not take effect.

Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
Signed-off-by: Osama Abboud <osamaabb@amazon.com>
Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com>
Signed-off-by: David Arinzon <darinzon@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/amazon/ena/ena_ethtool.c
drivers/net/ethernet/amazon/ena/ena_netdev.c
drivers/net/ethernet/amazon/ena/ena_netdev.h

index 98d6386b7f3987e1ea4a336778dc1b398c35c3d4..444ccef76da2975d8d6cc79eb242ed2a88647f5e 100644 (file)
@@ -887,11 +887,7 @@ static int ena_set_tunable(struct net_device *netdev,
        switch (tuna->id) {
        case ETHTOOL_RX_COPYBREAK:
                len = *(u32 *)data;
-               if (len > adapter->netdev->mtu) {
-                       ret = -EINVAL;
-                       break;
-               }
-               adapter->rx_copybreak = len;
+               ret = ena_set_rx_copybreak(adapter, len);
                break;
        default:
                ret = -EINVAL;
index 821355c5db1011ce04d739f1b75114787a06ca3e..663f9cd3babfb1400b64d7160fc804e4bfeb4e97 100644 (file)
@@ -2814,6 +2814,24 @@ int ena_update_queue_sizes(struct ena_adapter *adapter,
        return dev_was_up ? ena_up(adapter) : 0;
 }
 
+int ena_set_rx_copybreak(struct ena_adapter *adapter, u32 rx_copybreak)
+{
+       struct ena_ring *rx_ring;
+       int i;
+
+       if (rx_copybreak > min_t(u16, adapter->netdev->mtu, ENA_PAGE_SIZE))
+               return -EINVAL;
+
+       adapter->rx_copybreak = rx_copybreak;
+
+       for (i = 0; i < adapter->num_io_queues; i++) {
+               rx_ring = &adapter->rx_ring[i];
+               rx_ring->rx_copybreak = rx_copybreak;
+       }
+
+       return 0;
+}
+
 int ena_update_queue_count(struct ena_adapter *adapter, u32 new_channel_count)
 {
        struct ena_com_dev *ena_dev = adapter->ena_dev;
index 290ae9bf47ee417effa6397c7683322f3cea51a4..f9d862b630fadbfce1b7272ba0d099ffa8ba456e 100644 (file)
@@ -392,6 +392,8 @@ int ena_update_queue_sizes(struct ena_adapter *adapter,
 
 int ena_update_queue_count(struct ena_adapter *adapter, u32 new_channel_count);
 
+int ena_set_rx_copybreak(struct ena_adapter *adapter, u32 rx_copybreak);
+
 int ena_get_sset_count(struct net_device *netdev, int sset);
 
 static inline void ena_reset_device(struct ena_adapter *adapter,