On Friday, December 03, 2010, Alan Stern wrote: > On Fri, 3 Dec 2010, Rafael J. Wysocki wrote: > > > From: Rafael J. Wysocki <rjw@xxxxxxx> > > > > Before starting to suspend a device in device_suspend() check if > > there's a request to abort the power transition and return -EBUSY > > in that case. > > > > Signed-off-by: Rafael J. Wysocki <rjw@xxxxxxx> > > --- > > drivers/base/power/main.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > Index: linux-2.6/drivers/base/power/main.c > > =================================================================== > > --- linux-2.6.orig/drivers/base/power/main.c > > +++ linux-2.6/drivers/base/power/main.c > > @@ -935,6 +935,11 @@ static void async_suspend(void *data, as > > > > static int device_suspend(struct device *dev) > > { > > + if (pm_wakeup_pending()) { > > + async_error = -EBUSY; > > + return async_error; > > + } > > + > > INIT_COMPLETION(dev->power.completion); > > > > if (pm_async_enabled && dev->power.async_suspend) { > > Is a similar test needed in async_suspend()? What happens if > dpm_suspend() runs through the entire device list okay, but a wakeup > event occurs in the middle of the async_synchronize_full() delay? The devices will be suspended and the suspend will progress until it's finally aborted before putting the system into the sleep state. But I agree it's better to check pm_wakeup_pending() in async_suspend() too, so I think we can simply put it into __device_suspend() instead, like in the patch below. Thanks, Rafael --- From: Rafael J. Wysocki <rjw@xxxxxxx> Subject: PM: Use pm_wakeup_pending() in __device_suspend() Before starting to suspend a device in __device_suspend() check if there's a request to abort the power transition and return -EBUSY in that case. Signed-off-by: Rafael J. Wysocki <rjw@xxxxxxx> --- drivers/base/power/main.c | 5 +++++ 1 file changed, 5 insertions(+) Index: linux-2.6/drivers/base/power/main.c =================================================================== --- linux-2.6.orig/drivers/base/power/main.c +++ linux-2.6/drivers/base/power/main.c @@ -877,6 +877,11 @@ static int __device_suspend(struct devic if (async_error) goto End; + if (pm_wakeup_pending()) { + async_error = -EBUSY; + goto End; + } + if (dev->class) { if (dev->class->pm) { pm_dev_dbg(dev, state, "class "); _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm