OSDN Git Service

net: ena: Fix wrong rx request id by resetting device
authorArthur Kiyanovski <akiyano@amazon.com>
Sun, 2 Jan 2022 07:37:27 +0000 (07:37 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 2 Jan 2022 12:45:13 +0000 (12:45 +0000)
A wrong request id received from the device is a sign that
something is wrong with it, therefore trigger a device reset.

Also add some debug info to the "Page is NULL" print to make
it easier to debug.

Fixes: 1738cd3ed342 ("net: ena: Add a driver for Amazon Elastic Network Adapters (ENA)")
Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amazon/ena/ena_netdev.c

index 2274063..52a8c60 100644 (file)
@@ -1428,6 +1428,7 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
                                  u16 *next_to_clean)
 {
        struct ena_rx_buffer *rx_info;
+       struct ena_adapter *adapter;
        u16 len, req_id, buf = 0;
        struct sk_buff *skb;
        void *page_addr;
@@ -1440,8 +1441,14 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
        rx_info = &rx_ring->rx_buffer_info[req_id];
 
        if (unlikely(!rx_info->page)) {
-               netif_err(rx_ring->adapter, rx_err, rx_ring->netdev,
-                         "Page is NULL\n");
+               adapter = rx_ring->adapter;
+               netif_err(adapter, rx_err, rx_ring->netdev,
+                         "Page is NULL. qid %u req_id %u\n", rx_ring->qid, req_id);
+               ena_increase_stat(&rx_ring->rx_stats.bad_req_id, 1, &rx_ring->syncp);
+               adapter->reset_reason = ENA_REGS_RESET_INV_RX_REQ_ID;
+               /* Make sure reset reason is set before triggering the reset */
+               smp_mb__before_atomic();
+               set_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
                return NULL;
        }