Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753163Ab0LCV4A (ORCPT ); Fri, 3 Dec 2010 16:56:00 -0500 Received: from ogre.sisk.pl ([217.79.144.158]:52791 "EHLO ogre.sisk.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752021Ab0LCVz7 (ORCPT ); Fri, 3 Dec 2010 16:55:59 -0500 From: "Rafael J. Wysocki" To: Alan Stern Subject: Re: [PATCH 3/3] PM: Use pm_wakeup_pending() in device_suspend() Date: Fri, 3 Dec 2010 22:54:55 +0100 User-Agent: KMail/1.13.5 (Linux/2.6.37-rc4+; KDE/4.4.4; x86_64; ; ) Cc: "Linux-pm mailing list" , LKML References: In-Reply-To: MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Message-Id: <201012032254.55542.rjw@sisk.pl> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2604 Lines: 78 On Friday, December 03, 2010, Alan Stern wrote: > On Fri, 3 Dec 2010, Rafael J. Wysocki wrote: > > > From: Rafael J. Wysocki > > > > 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 > > --- > > 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 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 --- 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 "); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/