• Arthur Kiyanovski's avatar
    net: ena: fix crash during ena_remove() · 58a54b9c
    Arthur Kiyanovski authored
    In ena_remove() we have the following stack call:
    ena_remove()
      unregister_netdev()
      ena_destroy_device()
        netif_carrier_off()
    
    Calling netif_carrier_off() causes linkwatch to try to handle the
    link change event on the already unregistered netdev, which leads
    to a read from an unreadable memory address.
    
    This patch switches the order of the two functions, so that
    netif_carrier_off() is called on a regiestered netdev.
    
    To accomplish this fix we also had to:
    1. Remove the set bit ENA_FLAG_TRIGGER_RESET
    2. Add a sanitiy check in ena_close()
    both to prevent double device reset (when calling unregister_netdev()
    ena_close is called, but the device was already deleted in
    ena_destroy_device()).
    3. Set the admin_queue running state to false to avoid using it after
    device was reset (for example when calling ena_destroy_all_io_queues()
    right after ena_com_dev_reset() in ena_down)
    
    Fixes: 944b28aa ("net: ena: fix missing lock during device destruction")
    Signed-off-by: default avatarArthur Kiyanovski <akiyano@amazon.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    58a54b9c
ena_netdev.c 96.6 KB