• Esben Haabendal's avatar
    net: ll_temac: Fix RX buffer descriptor handling on GFP_ATOMIC pressure · 770d9c67
    Esben Haabendal authored
    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: 92744989 ("net: add Xilinx ll_temac device driver")
    Signed-off-by: default avatarEsben Haabendal <esben@geanix.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    770d9c67
ll_temac_main.c 40.1 KB