[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJZ5v0gL_U=FwY8W-A2pGSif6wbvyFUL7WQ2jcqHFgT2ucqY6Q@mail.gmail.com>
Date: Wed, 21 Sep 2022 20:13:29 +0200
From: "Rafael J. Wysocki" <rafael@...nel.org>
To: cy_huang <u0084500@...il.com>
Cc: "Rafael J. Wysocki" <rafael@...nel.org>,
Len Brown <len.brown@...el.com>, Pavel Machek <pavel@....cz>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Kees Cook <keescook@...omium.org>,
Anton Vorontsov <anton@...msg.org>,
Colin Cross <ccross@...roid.com>,
Tony Luck <tony.luck@...el.com>, cy_huang@...htek.com,
gene_chen@...htek.com, Linux PM <linux-pm@...r.kernel.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: Re: [RFC] PM: core: Add pm_wakeup_pending check in device suspend_noirq
On Fri, Sep 16, 2022 at 4:15 AM cy_huang <u0084500@...il.com> wrote:
>
> From: ChiYuan Huang <cy_huang@...htek.com>
>
> In 'dpm_suspend_noirq', it will do the sychronized_irq to guarantee all
> irqs are all done, and then do any wakeup flag set.
>
> For some peripherial deivces like as I2C/SPI, to speed up the irq handling,
> it may use 'pm_stay_awake' and really handle in another thread context like
> as workqueue.
>
> But in mem suspend flow, after 'dpm_suspend_noirq" stage, the next
> 'pm_wakeup_pending' check will be at 'syscore_suspend'.
>
> The checkpoint seems too late and cause I2C/SPI fail during 'noirq' to
> 'syscore_suspend'
What exactly do you mean by "fail" here?
>. But some adapter was already be marked as 'suspended'
> at 'noirq' callback, any I2C/SPI xfer will return the error flag '-ESHUTDOWN'.
>
> After the code trace, it seems all device callback will do 'pm_wakeup_pending'
> check, except 'noirq'.
>
> This patch is to add 'pm_wakeup_pending' check in 'noirq' sage to prevent this
> kind of usage.
>
> Signed-off-by: ChiYuan Huang <cy_huang@...htek.com>
> ---
> Hi,
>
> Is there any rule to define when I2C/SPI host controller need to mark adapter as
> 'suspended'?
>
> I trace 'drivers/i2c/buses'.It seems there's no common rule, Some are 'suspend',
> others may did it at 'suspend_noirq'.
>
> ---
> drivers/base/power/main.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
> index c501392..7cd7dc5 100644
> --- a/drivers/base/power/main.c
> +++ b/drivers/base/power/main.c
> @@ -1210,6 +1210,11 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
> if (async_error)
> goto Complete;
>
> + if (pm_wakeup_pending()) {
> + async_error = -EBUSY;
> + goto Complete;
> + }
> +
> if (dev->power.syscore || dev->power.direct_complete)
> goto Complete;
>
> --
> 2.7.4
>
Powered by blists - more mailing lists