• Arthur Kiyanovski's avatar
    net: ena: fix incorrect setting of the number of msix vectors · ce1f3521
    Arthur Kiyanovski authored
    Overview:
    We don't frequently change the msix vectors throughout the life cycle of
    the driver. We do so in two functions: ena_probe() and ena_restore().
    ena_probe() is only called when the driver is loaded. ena_restore() on the
    other hand is called during device reset / resume operations.
    
    We use num_io_queues for calculating and allocating the number of msix
    vectors. At ena_probe() this value is equal to max_num_io_queues and thus
    this is not an issue, however ena_restore() might be called after the
    number of io queues has changed.
    
    A possible bug scenario is as follows:
    
    * Change number of queues from 8 to 4.
      (num_io_queues = 4, max_num_io_queues = 8, msix_vecs = 9,)
    * Trigger reset occurs -> ena_restore is called.
      (num_io_queues = 4, max_num_io_queues =8 , msix_vecs = 5)
    * Change number of queues from 4 to 6.
      (num_io_queues = 6, max_num_io_queues = 8, msix_vecs = 5)
    * The driver will reset due to failure of check_for_rx_interrupt_queue()
    
    Fix:
    This can be easily fixed by always using max_num_io_queues to init the
    msix_vecs, since this number won't change as opposed to num_io_queues.
    
    Fixes: 4d192660 ("net: ena: multiple queue creation related cleanups")
    Signed-off-by: default avatarSameeh Jubran <sameehj@amazon.com>
    Signed-off-by: default avatarArthur Kiyanovski <akiyano@amazon.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ce1f3521
ena_netdev.c 121 KB