• Andre Przywara's avatar
    net: axienet: Convert DMA error handler to a work queue · 24201a64
    Andre Przywara authored
    The DMA error handler routine is currently a tasklet, scheduled to run
    after the DMA error IRQ was handled.
    However it needs to take the MDIO mutex, which is not allowed to do in a
    tasklet. A kernel (with debug options) complains consequently:
    [  614.050361] net eth0: DMA Tx error 0x174019
    [  614.064002] net eth0: Current BD is at: 0x8f84aa0ce
    [  614.080195] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:935
    [  614.109484] in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 40, name: kworker/u4:4
    [  614.135428] 3 locks held by kworker/u4:4/40:
    [  614.149075]  #0: ffff000879863328 ((wq_completion)rpciod){....}, at: process_one_work+0x1f0/0x6a8
    [  614.177528]  #1: ffff80001251bdf8 ((work_completion)(&task->u.tk_work)){....}, at: process_one_work+0x1f0/0x6a8
    [  614.209033]  #2: ffff0008784e0110 (sk_lock-AF_INET-RPC){....}, at: tcp_sendmsg+0x24/0x58
    [  614.235429] CPU: 0 PID: 40 Comm: kworker/u4:4 Not tainted 5.6.0-rc3-00926-g4a165a9d5921 #26
    [  614.260854] Hardware name: ARM Test FPGA (DT)
    [  614.274734] Workqueue: rpciod rpc_async_schedule
    [  614.289022] Call trace:
    [  614.296871]  dump_backtrace+0x0/0x1a0
    [  614.308311]  show_stack+0x14/0x20
    [  614.318751]  dump_stack+0xbc/0x100
    [  614.329403]  ___might_sleep+0xf0/0x140
    [  614.341018]  __might_sleep+0x4c/0x80
    [  614.352201]  __mutex_lock+0x5c/0x8a8
    [  614.363348]  mutex_lock_nested+0x1c/0x28
    [  614.375654]  axienet_dma_err_handler+0x38/0x388
    [  614.389999]  tasklet_action_common.isra.15+0x160/0x1a8
    [  614.405894]  tasklet_action+0x24/0x30
    [  614.417297]  efi_header_end+0xe0/0x494
    [  614.429020]  irq_exit+0xd0/0xd8
    [  614.439047]  __handle_domain_irq+0x60/0xb0
    [  614.451877]  gic_handle_irq+0xdc/0x2d0
    [  614.463486]  el1_irq+0xcc/0x180
    [  614.473451]  __tcp_transmit_skb+0x41c/0xb58
    [  614.486513]  tcp_write_xmit+0x224/0x10a0
    [  614.498792]  __tcp_push_pending_frames+0x38/0xc8
    [  614.513126]  tcp_rcv_established+0x41c/0x820
    [  614.526301]  tcp_v4_do_rcv+0x8c/0x218
    [  614.537784]  __release_sock+0x5c/0x108
    [  614.549466]  release_sock+0x34/0xa0
    [  614.560318]  tcp_sendmsg+0x40/0x58
    [  614.571053]  inet_sendmsg+0x40/0x68
    [  614.582061]  sock_sendmsg+0x18/0x30
    [  614.593074]  xs_sendpages+0x218/0x328
    [  614.604506]  xs_tcp_send_request+0xa0/0x1b8
    [  614.617461]  xprt_transmit+0xc8/0x4f0
    [  614.628943]  call_transmit+0x8c/0xa0
    [  614.640028]  __rpc_execute+0xbc/0x6f8
    [  614.651380]  rpc_async_schedule+0x28/0x48
    [  614.663846]  process_one_work+0x298/0x6a8
    [  614.676299]  worker_thread+0x40/0x490
    [  614.687687]  kthread+0x134/0x138
    [  614.697804]  ret_from_fork+0x10/0x18
    [  614.717319] xilinx_axienet 7fe00000.ethernet eth0: Link is Down
    [  615.748343] xilinx_axienet 7fe00000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
    
    Since tasklets are not really popular anymore anyway, lets convert this
    over to a work queue, which can sleep and thus can take the MDIO mutex.
    Signed-off-by: default avatarAndre Przywara <andre.przywara@arm.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    24201a64
xilinx_axienet_main.c 55.7 KB