Thread (3 messages) 3 messages, 2 authors, 2019-08-08

RE: [PATCH] PCI: PM: Also move to D0 before calling pci_legacy_resume_early()

From: Dexuan Cui <decui@microsoft.com>
Date: 2019-08-08 20:02:52
Also in: linux-pci, lkml

From: Bjorn Helgaas <helgaas@kernel.org>
Sent: Thursday, August 8, 2019 12:19 PM
To: Dexuan Cui <decui@microsoft.com>

On Thu, Aug 08, 2019 at 06:46:51PM +0000, Dexuan Cui wrote:
quoted
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help