From: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Linux PM <linux-pm@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
Ulf Hansson <ulf.hansson@linaro.org>
Subject: Re: [PATCH v2 10/10] PM: sleep: Call dpm_async_fn() directly in each suspend phase
Date: Tue, 30 Jan 2024 08:37:53 +0100 [thread overview]
Message-ID: <ZbinUdw3Cm58EfkE@linux.intel.com> (raw)
In-Reply-To: <2203732.Icojqenx9y@kreacher>
On Mon, Jan 29, 2024 at 05:29:41PM +0100, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
>
> Simplify the system-wide suspend of devices by invoking dpm_async_fn()
> directly from the main loop in each suspend phase instead of using an
> additional wrapper function for running it.
>
> No intentional functional impact.
>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
> ---
>
> v1 -> v2: No changes.
>
> ---
> drivers/base/power/main.c | 61 ++++++++++++++++++----------------------------
> 1 file changed, 25 insertions(+), 36 deletions(-)
>
> Index: linux-pm/drivers/base/power/main.c
> ===================================================================
> --- linux-pm.orig/drivers/base/power/main.c
> +++ linux-pm/drivers/base/power/main.c
> @@ -1192,7 +1192,7 @@ static void dpm_superior_set_must_resume
> }
>
> /**
> - * __device_suspend_noirq - Execute a "noirq suspend" callback for given device.
> + * device_suspend_noirq - Execute a "noirq suspend" callback for given device.
> * @dev: Device to handle.
> * @state: PM transition of the system being carried out.
> * @async: If true, the device is being suspended asynchronously.
> @@ -1200,7 +1200,7 @@ static void dpm_superior_set_must_resume
> * The driver of @dev will not receive interrupts while this function is being
> * executed.
> */
> -static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool async)
> +static int device_suspend_noirq(struct device *dev, pm_message_t state, bool async)
> {
> pm_callback_t callback = NULL;
> const char *info = NULL;
> @@ -1277,18 +1277,10 @@ static void async_suspend_noirq(void *da
> {
> struct device *dev = data;
>
> - __device_suspend_noirq(dev, pm_transition, true);
> + device_suspend_noirq(dev, pm_transition, true);
> put_device(dev);
> }
>
> -static int device_suspend_noirq(struct device *dev)
> -{
> - if (dpm_async_fn(dev, async_suspend_noirq))
> - return 0;
> -
> - return __device_suspend_noirq(dev, pm_transition, false);
> -}
> -
> static int dpm_noirq_suspend_devices(pm_message_t state)
> {
> ktime_t starttime = ktime_get();
> @@ -1305,10 +1297,15 @@ static int dpm_noirq_suspend_devices(pm_
> struct device *dev = to_device(dpm_late_early_list.prev);
>
> list_move(&dev->power.entry, &dpm_noirq_list);
> +
> + if (dpm_async_fn(dev, async_suspend_noirq))
> + continue;
> +
> get_device(dev);
> +
> mutex_unlock(&dpm_list_mtx);
>
> - error = device_suspend_noirq(dev);
> + error = device_suspend_noirq(dev, state, false);
>
> put_device(dev);
>
> @@ -1369,14 +1366,14 @@ static void dpm_propagate_wakeup_to_pare
> }
>
> /**
> - * __device_suspend_late - Execute a "late suspend" callback for given device.
> + * device_suspend_late - Execute a "late suspend" callback for given device.
> * @dev: Device to handle.
> * @state: PM transition of the system being carried out.
> * @async: If true, the device is being suspended asynchronously.
> *
> * Runtime PM is disabled for @dev while this function is being executed.
> */
> -static int __device_suspend_late(struct device *dev, pm_message_t state, bool async)
> +static int device_suspend_late(struct device *dev, pm_message_t state, bool async)
> {
> pm_callback_t callback = NULL;
> const char *info = NULL;
> @@ -1447,18 +1444,10 @@ static void async_suspend_late(void *dat
> {
> struct device *dev = data;
>
> - __device_suspend_late(dev, pm_transition, true);
> + device_suspend_late(dev, pm_transition, true);
> put_device(dev);
> }
>
> -static int device_suspend_late(struct device *dev)
> -{
> - if (dpm_async_fn(dev, async_suspend_late))
> - return 0;
> -
> - return __device_suspend_late(dev, pm_transition, false);
> -}
> -
> /**
> * dpm_suspend_late - Execute "late suspend" callbacks for all devices.
> * @state: PM transition of the system being carried out.
> @@ -1481,11 +1470,15 @@ int dpm_suspend_late(pm_message_t state)
> struct device *dev = to_device(dpm_suspended_list.prev);
>
> list_move(&dev->power.entry, &dpm_late_early_list);
> +
> + if (dpm_async_fn(dev, async_suspend_late))
> + continue;
> +
> get_device(dev);
>
> mutex_unlock(&dpm_list_mtx);
>
> - error = device_suspend_late(dev);
> + error = device_suspend_late(dev, state, false);
>
> put_device(dev);
>
> @@ -1582,12 +1575,12 @@ static void dpm_clear_superiors_direct_c
> }
>
> /**
> - * __device_suspend - Execute "suspend" callbacks for given device.
> + * device_suspend - Execute "suspend" callbacks for given device.
> * @dev: Device to handle.
> * @state: PM transition of the system being carried out.
> * @async: If true, the device is being suspended asynchronously.
> */
> -static int __device_suspend(struct device *dev, pm_message_t state, bool async)
> +static int device_suspend(struct device *dev, pm_message_t state, bool async)
> {
> pm_callback_t callback = NULL;
> const char *info = NULL;
> @@ -1716,18 +1709,10 @@ static void async_suspend(void *data, as
> {
> struct device *dev = data;
>
> - __device_suspend(dev, pm_transition, true);
> + device_suspend(dev, pm_transition, true);
> put_device(dev);
> }
>
> -static int device_suspend(struct device *dev)
> -{
> - if (dpm_async_fn(dev, async_suspend))
> - return 0;
> -
> - return __device_suspend(dev, pm_transition, false);
> -}
> -
> /**
> * dpm_suspend - Execute "suspend" callbacks for all non-sysdev devices.
> * @state: PM transition of the system being carried out.
> @@ -1752,11 +1737,15 @@ int dpm_suspend(pm_message_t state)
> struct device *dev = to_device(dpm_prepared_list.prev);
>
> list_move(&dev->power.entry, &dpm_suspended_list);
> +
> + if (dpm_async_fn(dev, async_suspend))
> + continue;
> +
> get_device(dev);
>
> mutex_unlock(&dpm_list_mtx);
>
> - error = device_suspend(dev);
> + error = device_suspend(dev, state, false);
>
> put_device(dev);
>
>
>
>
next prev parent reply other threads:[~2024-01-30 7:38 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-29 16:00 [PATCH v2 00/10] PM: sleep: Fix up suspend stats handling and clean up core suspend code Rafael J. Wysocki
2024-01-29 16:09 ` [PATCH v2 01/10] PM: sleep: stats: Use array of suspend step names Rafael J. Wysocki
2024-01-29 16:11 ` [PATCH v2 02/10] PM: sleep: stats: Use an array of step failure counters Rafael J. Wysocki
2024-01-30 7:02 ` Stanislaw Gruszka
2024-01-30 13:42 ` Rafael J. Wysocki
2024-01-29 16:13 ` [PATCH v2 03/10] PM: sleep: stats: Use unsigned int for success and " Rafael J. Wysocki
2024-01-30 7:02 ` Stanislaw Gruszka
2024-01-29 16:24 ` [PATCH v2 05/10] PM: sleep: stats: Call dpm_save_failed_step() at most once per phase Rafael J. Wysocki
2024-01-30 7:20 ` Stanislaw Gruszka
2024-01-29 16:24 ` [PATCH v2 06/10] PM: sleep: stats: Use locking in dpm_save_failed_dev() Rafael J. Wysocki
2024-01-29 16:25 ` [PATCH v2 07/10] PM: sleep: stats: Log errors right after running suspend callbacks Rafael J. Wysocki
2024-01-30 7:36 ` Stanislaw Gruszka
2024-01-29 16:27 ` [PATCH v2 08/10] PM: sleep: Move some assignments from under a lock Rafael J. Wysocki
2024-01-30 7:21 ` Stanislaw Gruszka
2024-01-29 16:28 ` [PATCH v2 09/10] PM: sleep: Move devices to new lists earlier in each suspend phase Rafael J. Wysocki
2024-01-29 16:29 ` [PATCH v2 10/10] PM: sleep: Call dpm_async_fn() directly " Rafael J. Wysocki
2024-01-30 7:37 ` Stanislaw Gruszka [this message]
2024-01-29 16:30 ` [PATCH v2 04/10] PM: sleep: stats: Define suspend_stats next to the code using it Rafael J. Wysocki
2024-01-31 12:42 ` [PATCH v2 00/10] PM: sleep: Fix up suspend stats handling and clean up core suspend code Ulf Hansson
2024-01-31 13:31 ` Rafael J. Wysocki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZbinUdw3Cm58EfkE@linux.intel.com \
--to=stanislaw.gruszka@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=rjw@rjwysocki.net \
--cc=ulf.hansson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.