RE: [PATCH] PCI/PM: Do not generate wakeup event when runtime resuming bus

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Mika and Bjorn,

> -----Original Message-----
> From: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
> Sent: Wednesday, November 18, 2020 11:56 PM
> To: Bjorn Helgaas <helgaas@xxxxxxxxxx>
> Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>; Rafael J. Wysocki
> <rjw@xxxxxxxxxxxxx>; Lukas Wunner <lukas@xxxxxxxxx>; David Airlie
> <airlied@xxxxxxxx>; Daniel Vetter <daniel@xxxxxxxx>; Patel, Utkarsh H
> <utkarsh.h.patel@xxxxxxxxx>; Maarten Lankhorst
> <maarten.lankhorst@xxxxxxxxxxxxxxx>; Maxime Ripard <mripard@xxxxxxxxxx>;
> Thomas Zimmermann <tzimmermann@xxxxxxx>; linux-pci@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH] PCI/PM: Do not generate wakeup event when runtime
> resuming bus
> 
> Hi Bjorn,
> 
> On Wed, Nov 18, 2020 at 03:22:00PM -0600, Bjorn Helgaas wrote:
> > On Thu, Oct 29, 2020 at 12:24:53PM +0300, Mika Westerberg wrote:
> > > When a PCI bridge is runtime resumed from D3cold the underlying bus
> > > is walked and the attached devices are runtime resumed as well.
> > > However, in addition to that we also generate a wakeup event for
> > > these devices even though this actually is not a real wakeup event
> > > coming from the hardware.
> > >
> > > Normally this does not cause problems but when combined with
> > > /sys/power/wakeup_count like using the steps below:
> > >
> > >   # count=$(cat /sys/power/wakeup_count)
> > >   # echo $count > /sys/power/wakeup_count
> > >   # echo mem > /sys/power/state
> > >
> > > The system suspend cycle might get aborted at this point if a PCI
> > > bridge that was runtime suspended (D3cold) was runtime resumed for any
> reason.
> > > The runtime resume calls pci_wakeup_bus() and that generates wakeup
> > > event increasing wakeup_count.
> > >
> > > Since this is not a real wakeup event we can prevent the above from
> > > happening by removing the call to pci_wakeup_event() in
> > > pci_wakeup_bus(). While there rename pci_wakeup_bus() to
> > > pci_resume_bus() to better reflect what it does.
> > >
> > > Reported-by: Utkarsh Patel <utkarsh.h.patel@xxxxxxxxx>
> >
> > Is there a URL to a report on a mailing list or a bugzilla that we can
> > include here?  What was the actual user-visible issue?  If we can
> > mention it here, it may be useful to others who encounter the same
> > issue.  I guess maybe a system suspend fails?
> 
> I'm not sure if there is bugzilla entry about this. There might be a Google
> partner bug but not sure if it is public.
> 
> @Utkarsh, if there is one can you share that link with Bjorn?

This is reported only Google partner bug which is private and I am not sure if I can share the link here. 

> 
> There are two user visible issues, first is that if you do the above steps
> manually the suspend gets aborted (as the above commit log tries to explain).
> 
> The second "user visible" issue is that the ChromeOS suspend stress test
> script below fails (as it does the same steps):
> 
> 
> https://chromium.googlesource.com/chromiumos/platform/power_manager/
> +/refs/heads/master/tools/suspend_stress_test
> 
> > > Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
> > > ---
> > >  drivers/gpu/vga/vga_switcheroo.c |  2 +-
> > >  drivers/pci/pci.c                | 16 +++++-----------
> > >  include/linux/pci.h              |  2 +-
> > >  3 files changed, 7 insertions(+), 13 deletions(-)
> > >
> > > diff --git a/drivers/gpu/vga/vga_switcheroo.c
> > > b/drivers/gpu/vga/vga_switcheroo.c
> > > index 087304b1a5d7..8843b078ad4e 100644
> > > --- a/drivers/gpu/vga/vga_switcheroo.c
> > > +++ b/drivers/gpu/vga/vga_switcheroo.c
> > > @@ -1039,7 +1039,7 @@ static int
> vga_switcheroo_runtime_resume(struct device *dev)
> > >  	mutex_lock(&vgasr_mutex);
> > >  	vga_switcheroo_power_switch(pdev, VGA_SWITCHEROO_ON);
> > >  	mutex_unlock(&vgasr_mutex);
> > > -	pci_wakeup_bus(pdev->bus);
> > > +	pci_resume_bus(pdev->bus);
> > >  	ret = dev->bus->pm->runtime_resume(dev);
> > >  	if (ret)
> > >  		return ret;
> > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index
> > > 6d4d5a2f923d..b25dfa63eeb9 100644
> > > --- a/drivers/pci/pci.c
> > > +++ b/drivers/pci/pci.c
> > > @@ -1174,26 +1174,20 @@ int pci_platform_power_transition(struct
> > > pci_dev *dev, pci_power_t state)  }
> > > EXPORT_SYMBOL_GPL(pci_platform_power_transition);
> > >
> > > -/**
> > > - * pci_wakeup - Wake up a PCI device
> > > - * @pci_dev: Device to handle.
> > > - * @ign: ignored parameter
> > > - */
> > > -static int pci_wakeup(struct pci_dev *pci_dev, void *ign)
> > > +static int pci_resume_one(struct pci_dev *pci_dev, void *ign)
> > >  {
> > > -	pci_wakeup_event(pci_dev);
> >
> > IIUC this is the critical change, and all the rest of this patch is
> > no-op renames.  Can you split this into two patches so the important
> > change is more obvious?
> 
> Sure.
> 
> > Then the obvious questions will be why it is safe to remove this, and
> > where the desired call for the real wakeup is.
> 
> This is only called on runtime resume path to turn on devices below this one.
> However, wakeup is only relevant on system sleep path.
> 
> For ACPI backed devices the real wakeup is handled in the
> pci_acpi_wake_dev() and in case of PME it is pcie_pme_handle_request().
> And then there is the pme_poll thread as well.

Sincerely,
Utkarsh Patel. 




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux