net: ll_temac: Fix RX buffer descriptor handling on GFP_ATOMIC pressure
Failures caused by GFP_ATOMIC memory pressure have been observed, and
due to the missing error handling, results in kernel crash such as
[
1876998.350133] kernel BUG at mm/slub.c:3952!
[
1876998.350141] invalid opcode: 0000 [#1] PREEMPT SMP PTI
[
1876998.350147] CPU: 2 PID: 0 Comm: swapper/2 Not tainted 5.3.0-scnxt #1
[
1876998.350150] Hardware name: N/A N/A/COMe-bIP2, BIOS CCR2R920 03/01/2017
[
1876998.350160] RIP: 0010:kfree+0x1ca/0x220
[
1876998.350164] Code: 85 db 74 49 48 8b 95 68 01 00 00 48 31 c2 48 89 10 e9 d7 fe ff ff 49 8b 04 24 a9 00 00 01 00 75 0b 49 8b 44 24 08 a8 01 75 02 <0f> 0b 49 8b 04 24 31 f6 a9 00 00 01 00 74 06 41 0f b6 74 24
5b
[
1876998.350172] RSP: 0018:
ffffc900000f0df0 EFLAGS:
00010246
[
1876998.350177] RAX:
ffffea00027f0708 RBX:
ffff888008d78000 RCX:
0000000000391372
[
1876998.350181] RDX:
0000000000000000 RSI:
ffffe8ffffd01400 RDI:
ffff888008d78000
[
1876998.350185] RBP:
ffff8881185a5d00 R08:
ffffc90000087dd8 R09:
000000000000280a
[
1876998.350189] R10:
0000000000000002 R11:
0000000000000000 R12:
ffffea0000235e00
[
1876998.350193] R13:
ffff8881185438a0 R14:
0000000000000000 R15:
ffff888118543870
[
1876998.350198] FS:
0000000000000000(0000) GS:
ffff88811f300000(0000) knlGS:
0000000000000000
[
1876998.350203] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
s#1 Part1
[
1876998.350206] CR2:
00007f8dac7b09f0 CR3:
000000011e20a006 CR4:
00000000001606e0
[
1876998.350210] Call Trace:
[
1876998.350215] <IRQ>
[
1876998.350224] ? __netif_receive_skb_core+0x70a/0x920
[
1876998.350229] kfree_skb+0x32/0xb0
[
1876998.350234] __netif_receive_skb_core+0x70a/0x920
[
1876998.350240] __netif_receive_skb_one_core+0x36/0x80
[
1876998.350245] process_backlog+0x8b/0x150
[
1876998.350250] net_rx_action+0xf7/0x340
[
1876998.350255] __do_softirq+0x10f/0x353
[
1876998.350262] irq_exit+0xb2/0xc0
[
1876998.350265] do_IRQ+0x77/0xd0
[
1876998.350271] common_interrupt+0xf/0xf
[
1876998.350274] </IRQ>
In order to handle such failures more graceful, this change splits the
receive loop into one for consuming the received buffers, and one for
allocating new buffers.
When GFP_ATOMIC allocations fail, the receive will continue with the
buffers that is still there, and with the expectation that the allocations
will succeed in a later call to receive.
Fixes: 7391458cef35 ("net: add Xilinx ll_temac device driver")
Signed-off-by: Esben Haabendal <esben@geanix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>