• Jacob Keller's avatar
    i40e: shutdown all IRQs and disable MSI-X when suspended · b980c063
    Jacob Keller authored
    On some platforms with a large number of CPUs, we will allocate many IRQ
    vectors. When hibernating, the system will attempt to migrate all of the
    vectors back to CPU0 when shutting down all the other CPUs. It is
    possible that we have so many vectors that it cannot re-assign them to
    CPU0. This is even more likely if we have many devices installed in one
    platform.
    
    The end result is failure to hibernate, as it is not possible to
    shutdown the CPUs. We can avoid this by disabling MSI-X and clearing our
    interrupt scheme when the device is suspended. A more ideal solution
    would be some method for the stack to properly handle this for all
    drivers, rather than on a case-by-case basis for each driver to fix
    itself.
    
    However, until this more ideal solution exists, we can do our part and
    shutdown our IRQs during suspend, which should allow systems with
    a large number of CPUs to safely suspend or hibernate.
    
    It may be worth investigating if we should shut down even further when
    we suspend as it may make the path cleaner, but this was the minimum fix
    for the hibernation issue mentioned here.
    
    Testing-hints:
      This affects systems with a large number of CPUs, and with multiple
      devices enabled. Without this change, those platforms are unable to
      hibernate at all.
    Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    b980c063
i40e_main.c 338 KB