• Sameeh Jubran's avatar
    net: ena: don't wake up tx queue when down · a53651ec
    Sameeh Jubran authored
    There is a race condition that can occur when calling ena_down().
    The ena_clean_tx_irq() - which is a part of the napi handler -
    function might wake up the tx queue when the queue is supposed
    to be down (during recovery or changing the size of the queues
    for example) This causes the ena_start_xmit() function to trigger
    and possibly try to access the destroyed queues.
    
    The race is illustrated below:
    
    Flow A:                                       Flow B(napi handler)
    ena_down()
       netif_carrier_off()
       netif_tx_disable()
                                                          ena_clean_tx_irq()
                                                             netif_tx_wake_queue()
       ena_napi_disable_all()
       ena_destroy_all_io_queues()
    
    After these flows the tx queue is active and ena_start_xmit() accesses
    the destroyed queue which leads to a kernel panic.
    
    fixes: 1738cd3e (net: ena: Add a driver for Amazon Elastic Network Adapters (ENA))
    Signed-off-by: default avatarSameeh Jubran <sameehj@amazon.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    a53651ec
ena_netdev.c 102 KB