• Jiri Pirko's avatar
    virtio_net: move netdev_tx_reset_queue() call before RX napi enable · b96ed2c9
    Jiri Pirko authored
    During suspend/resume the following BUG was hit:
    ------------[ cut here ]------------
    kernel BUG at lib/dynamic_queue_limits.c:99!
    Internal error: Oops - BUG: 0 [#1] SMP ARM
    Modules linked in: bluetooth ecdh_generic ecc libaes
    CPU: 1 PID: 1282 Comm: rtcwake Not tainted
    6.10.0-rc3-00732-gc8bd1f7f #15240
    Hardware name: Generic DT based system
    PC is at dql_completed+0x270/0x2cc
    LR is at __free_old_xmit+0x120/0x198
    pc : [<c07ffa54>]    lr : [<c0c42bf4>]    psr: 80000013
    ...
    Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
    Control: 10c5387d  Table: 43a4406a  DAC: 00000051
    ...
    Process rtcwake (pid: 1282, stack limit = 0xfbc21278)
    Stack: (0xe0805e80 to 0xe0806000)
    ...
    Call trace:
      dql_completed from __free_old_xmit+0x120/0x198
      __free_old_xmit from free_old_xmit+0x44/0xe4
      free_old_xmit from virtnet_poll_tx+0x88/0x1b4
      virtnet_poll_tx from __napi_poll+0x2c/0x1d4
      __napi_poll from net_rx_action+0x140/0x2b4
      net_rx_action from handle_softirqs+0x11c/0x350
      handle_softirqs from call_with_stack+0x18/0x20
      call_with_stack from do_softirq+0x48/0x50
      do_softirq from __local_bh_enable_ip+0xa0/0xa4
      __local_bh_enable_ip from virtnet_open+0xd4/0x21c
      virtnet_open from virtnet_restore+0x94/0x120
      virtnet_restore from virtio_device_restore+0x110/0x1f4
      virtio_device_restore from dpm_run_callback+0x3c/0x100
      dpm_run_callback from device_resume+0x12c/0x2a8
      device_resume from dpm_resume+0x12c/0x1e0
      dpm_resume from dpm_resume_end+0xc/0x18
      dpm_resume_end from suspend_devices_and_enter+0x1f0/0x72c
      suspend_devices_and_enter from pm_suspend+0x270/0x2a0
      pm_suspend from state_store+0x68/0xc8
      state_store from kernfs_fop_write_iter+0x10c/0x1cc
      kernfs_fop_write_iter from vfs_write+0x2b0/0x3dc
      vfs_write from ksys_write+0x5c/0xd4
      ksys_write from ret_fast_syscall+0x0/0x54
    Exception stack(0xe8bf1fa8 to 0xe8bf1ff0)
    ...
    ---[ end trace 0000000000000000 ]---
    
    After virtnet_napi_enable() is called, the following path is hit:
      __napi_poll()
        -> virtnet_poll()
          -> virtnet_poll_cleantx()
            -> netif_tx_wake_queue()
    
    That wakes the TX queue and allows skbs to be submitted and accounted by
    BQL counters.
    
    Then netdev_tx_reset_queue() is called that resets BQL counters and
    eventually leads to the BUG in dql_completed().
    
    Move virtnet_napi_tx_enable() what does BQL counters reset before RX
    napi enable to avoid the issue.
    Reported-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Closes: https://lore.kernel.org/netdev/e632e378-d019-4de7-8f13-07c572ab37a9@samsung.com/
    Fixes: c8bd1f7f ("virtio_net: add support for Byte Queue Limits")
    Tested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
    Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Acked-by: default avatarJason Wang <jasowang@redhat.com>
    Link: https://patch.msgid.link/20240814122500.1710279-1-jiri@resnulli.usSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    b96ed2c9
virtio_net.c 175 KB