• Stephan Gerhold's avatar
    virtio_net: fix xdp_rxq_info bug after suspend/resume · 8af52fe9
    Stephan Gerhold authored
    The following sequence currently causes a driver bug warning
    when using virtio_net:
    
      # ip link set eth0 up
      # echo mem > /sys/power/state (or e.g. # rtcwake -s 10 -m mem)
      <resume>
      # ip link set eth0 down
    
      Missing register, driver bug
      WARNING: CPU: 0 PID: 375 at net/core/xdp.c:138 xdp_rxq_info_unreg+0x58/0x60
      Call trace:
       xdp_rxq_info_unreg+0x58/0x60
       virtnet_close+0x58/0xac
       __dev_close_many+0xac/0x140
       __dev_change_flags+0xd8/0x210
       dev_change_flags+0x24/0x64
       do_setlink+0x230/0xdd0
       ...
    
    This happens because virtnet_freeze() frees the receive_queue
    completely (including struct xdp_rxq_info) but does not call
    xdp_rxq_info_unreg(). Similarly, virtnet_restore() sets up the
    receive_queue again but does not call xdp_rxq_info_reg().
    
    Actually, parts of virtnet_freeze_down() and virtnet_restore_up()
    are almost identical to virtnet_close() and virtnet_open(): only
    the calls to xdp_rxq_info_(un)reg() are missing. This means that
    we can fix this easily and avoid such problems in the future by
    just calling virtnet_close()/open() from the freeze/restore handlers.
    
    Aside from adding the missing xdp_rxq_info calls the only difference
    is that the refill work is only cancelled if netif_running(). However,
    this should not make any functional difference since the refill work
    should only be active if the network interface is actually up.
    
    Fixes: 754b8a21
    
     ("virtio_net: setup xdp_rxq_info")
    Signed-off-by: default avatarStephan Gerhold <stephan.gerhold@kernkonzept.com>
    Acked-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Acked-by: default avatarJason Wang <jasowang@redhat.com>
    Link: https://lore.kernel.org/r/20220621114845.3650258-1-stephan.gerhold@kernkonzept.com
    
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    8af52fe9
virtio_net.c 100 KB