Skip to content
Snippets Groups Projects
  • David Woodhouse's avatar
    84f85eb9
    net: do not delete nics in net_cleanup() · 84f85eb9
    David Woodhouse authored
    
    In net_cleanup() we only need to delete the netdevs, as those may have
    state which outlives Qemu when it exits, and thus may actually need to
    be cleaned up on exit.
    
    The nics, on the other hand, are owned by the device which created them.
    Most devices don't bother to clean up on exit because they don't have
    any state which will outlive Qemu... but XenBus devices do need to clean
    up their nodes in XenStore, and do have an exit handler to delete them.
    
    When the XenBus exit handler destroys the xen-net-device, it attempts
    to delete its nic after net_cleanup() had already done so. And crashes.
    
    Fix this by only deleting netdevs as we walk the list. As the comment
    notes, we can't use QTAILQ_FOREACH_SAFE() as each deletion may remove
    *multiple* entries, including the "safely" saved 'next' pointer. But
    we can store the *previous* entry, since nics are safe.
    
    Signed-off-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
    Reviewed-by: default avatarPaul Durrant <paul@xen.org>
    Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
    84f85eb9
    History
    net: do not delete nics in net_cleanup()
    David Woodhouse authored
    
    In net_cleanup() we only need to delete the netdevs, as those may have
    state which outlives Qemu when it exits, and thus may actually need to
    be cleaned up on exit.
    
    The nics, on the other hand, are owned by the device which created them.
    Most devices don't bother to clean up on exit because they don't have
    any state which will outlive Qemu... but XenBus devices do need to clean
    up their nodes in XenStore, and do have an exit handler to delete them.
    
    When the XenBus exit handler destroys the xen-net-device, it attempts
    to delete its nic after net_cleanup() had already done so. And crashes.
    
    Fix this by only deleting netdevs as we walk the list. As the comment
    notes, we can't use QTAILQ_FOREACH_SAFE() as each deletion may remove
    *multiple* entries, including the "safely" saved 'next' pointer. But
    we can store the *previous* entry, since nics are safe.
    
    Signed-off-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
    Reviewed-by: default avatarPaul Durrant <paul@xen.org>
    Signed-off-by: default avatarJason Wang <jasowang@redhat.com>