Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21fc2bb8 authored by Yuiko Oshino's avatar Yuiko Oshino Committed by Greg Kroah-Hartman
Browse files

net: ethernet: microchip: lan743x: Fix skb allocation failure



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: 23f0703c ("lan743x: Add main source files for new lan743x driver")
Signed-off-by: default avatarYuiko Oshino <yuiko.oshino@microchip.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e02fdd7d
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -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)