• Niklas Cassel's avatar
    net: stmmac: fix broken dma_interrupt handling for multi-queues · 5a6a0445
    Niklas Cassel authored
    There is nothing that says that number of TX queues == number of RX
    queues. E.g. the ARTPEC-6 SoC has 2 TX queues and 1 RX queue.
    
    This code is obviously wrong:
    for (chan = 0; chan < tx_channel_count; chan++) {
        struct stmmac_rx_queue *rx_q = &priv->rx_queue[chan];
    
    priv->rx_queue has size MTL_MAX_RX_QUEUES, so this will send an
    uninitialized napi_struct to __napi_schedule(), causing us to
    crash in net_rx_action(), because napi_struct->poll is zero.
    
    [12846.759880] Unable to handle kernel NULL pointer dereference at virtual address 00000000
    [12846.768014] pgd = (ptrval)
    [12846.770742] [00000000] *pgd=39ec7831, *pte=00000000, *ppte=00000000
    [12846.777023] Internal error: Oops: 80000007 [#1] PREEMPT SMP ARM
    [12846.782942] Modules linked in:
    [12846.785998] CPU: 0 PID: 161 Comm: dropbear Not tainted 4.15.0-rc2-00285-gf5fb5f2f39a7 #36
    [12846.794177] Hardware name: Axis ARTPEC-6 Platform
    [12846.798879] task: (ptrval) task.stack: (ptrval)
    [12846.803407] PC is at 0x0
    [12846.805942] LR is at net_rx_action+0x274/0x43c
    [12846.810383] pc : [<00000000>]    lr : [<80bff064>]    psr: 200e0113
    [12846.816648] sp : b90d9ae8  ip : b90d9ae8  fp : b90d9b44
    [12846.821871] r10: 00000008  r9 : 0013250e  r8 : 00000100
    [12846.827094] r7 : 0000012c  r6 : 00000000  r5 : 00000001  r4 : bac84900
    [12846.833619] r3 : 00000000  r2 : b90d9b08  r1 : 00000000  r0 : bac84900
    
    Since each DMA channel can be used for rx and tx simultaneously,
    the current code should probably be rewritten so that napi_struct is
    embedded in a new struct stmmac_channel.
    That way, stmmac_poll() can call stmmac_tx_clean() on just the tx queue
    where we got the IRQ, instead of looping through all tx queues.
    This is also how the xgbe driver does it (another driver for this IP).
    
    Fixes: c22a3f48 ("net: stmmac: adding multiple napi mechanism")
    Signed-off-by: default avatarNiklas Cassel <niklas.cassel@axis.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    5a6a0445
stmmac_main.c 126 KB