> From: Bjorn Helgaas <helgaas@xxxxxxxxxx> > Sent: Thursday, August 8, 2019 12:19 PM > To: Dexuan Cui <decui@xxxxxxxxxxxxx> > > On Thu, Aug 08, 2019 at 06:46:51PM +0000, Dexuan Cui wrote: > > > > In pci_legacy_suspend_late(), the device state is moved to PCI_UNKNOWN. > > In pci_pm_thaw_noirq(), the state is supposed to be moved back to PCI_D0, > > but the current code misses the pci_legacy_resume_early() path, so the > > state remains in PCI_UNKNOWN in that path, and during hiberantion this > > causes an error for the Mellanox VF driver, which fails to enable > > MSI-X: pci_msi_supported() is false due to dev->current_state != PCI_D0: > > s/hiberantion/hibernation/ Thanks for spoting this typo! :-) > Actually, it sounds more like "during *resume*, this causes an error", > so maybe you want s/hiberantion/resume/ instead? Yes, it's during "resume", and to be more accurate, it happens during the "resume" of the "thaw" phase: when we run "echo disk > /sys/power/state", first the kernel "freezes" all the devices and create a hibernation image, then the kernel "thaws" the devices including the disk/NIC, and writes the memory to the disk and powers down. This patch fixes the error message for the Mellanox VF driver in this phase. When the system starts again, a fresh kernel starts to run, and when the kernel detects that a hibernation image was saved, the kernel "quiesces" the devices, and "restores" the devices from the saved image. Here device_resume_noirq() -> ... -> pci_pm_restore_noirq() -> pci_pm_default_resume_early() -> pci_power_up() moves the device states back to PCI_D0. This path is not broken and doesn't need my patch. Thanks, -- Dexuan