]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: ethernet: microchip: lan743x: Fix skb allocation failure
authorYuiko Oshino <yuiko.oshino@microchip.com>
Wed, 27 Oct 2021 18:23:02 +0000 (14:23 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 6 Nov 2021 12:59:44 +0000 (13:59 +0100)
commit e8684db191e4164f3f5f3ad7dec04a6734c25f1c upstream.

The driver allocates skb during ndo_open with GFP_ATOMIC which has high chance of failure when there are multiple instances.
GFP_KERNEL is enough while open and use GFP_ATOMIC only from interrupt context.

Fixes: 308800c59cf1 ("lan743x: Add main source files for new lan743x driver")
Signed-off-by: Yuiko Oshino <yuiko.oshino@microchip.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/microchip/lan743x_main.c

index a109120da0e7c3a5acdbe70ef7fd7d421b1add30..22beeb5be9c41e1b58d3400423965cb9f7ba2902 100644 (file)
@@ -1898,13 +1898,13 @@ static int lan743x_rx_next_index(struct lan743x_rx *rx, int index)
        return ((++index) % rx->ring_size);
 }
 
-static struct sk_buff *lan743x_rx_allocate_skb(struct lan743x_rx *rx)
+static struct sk_buff *lan743x_rx_allocate_skb(struct lan743x_rx *rx, gfp_t gfp)
 {
        int length = 0;
 
        length = (LAN743X_MAX_FRAME_SIZE + ETH_HLEN + 4 + RX_HEAD_PADDING);
        return __netdev_alloc_skb(rx->adapter->netdev,
-                                 length, GFP_ATOMIC | GFP_DMA);
+                                 length, gfp);
 }
 
 static void lan743x_rx_update_tail(struct lan743x_rx *rx, int index)
@@ -2077,7 +2077,8 @@ static int lan743x_rx_process_packet(struct lan743x_rx *rx)
                        struct sk_buff *new_skb = NULL;
                        int packet_length;
 
-                       new_skb = lan743x_rx_allocate_skb(rx);
+                       new_skb = lan743x_rx_allocate_skb(rx,
+                                                         GFP_ATOMIC | GFP_DMA);
                        if (!new_skb) {
                                /* failed to allocate next skb.
                                 * Memory is very low.
@@ -2314,7 +2315,8 @@ static int lan743x_rx_ring_init(struct lan743x_rx *rx)
 
        rx->last_head = 0;
        for (index = 0; index < rx->ring_size; index++) {
-               struct sk_buff *new_skb = lan743x_rx_allocate_skb(rx);
+               struct sk_buff *new_skb = lan743x_rx_allocate_skb(rx,
+                                                                  GFP_KERNEL);
 
                ret = lan743x_rx_init_ring_element(rx, index, new_skb);
                if (ret)