diff options
| author | Lukas Wunner <lukas@wunner.de> | 2025-09-04 15:11:09 +0200 |
|---|---|---|
| committer | Juergen Gross <jgross@suse.com> | 2025-09-09 09:10:44 +0200 |
| commit | f770c3d858687252f1270265ba152d5c622e793f (patch) | |
| tree | 5555202a3aa56a17c05d7ca5bb5d699a99105e81 /drivers/xen | |
| parent | 3fcc8e146935415d69ffabb5df40ecf50e106131 (diff) | |
| download | linux-f770c3d858687252f1270265ba152d5c622e793f.tar.gz | |
xen/manage: Fix suspend error path
The device power management API has the following asymmetry:
* dpm_suspend_start() does not clean up on failure
(it requires a call to dpm_resume_end())
* dpm_suspend_end() does clean up on failure
(it does not require a call to dpm_resume_start())
The asymmetry was introduced by commit d8f3de0d2412 ("Suspend-related
patches for 2.6.27") in June 2008: It removed a call to device_resume()
from device_suspend() (which was later renamed to dpm_suspend_start()).
When Xen began using the device power management API in May 2008 with
commit 0e91398f2a5d ("xen: implement save/restore"), the asymmetry did
not yet exist. But since it was introduced, a call to dpm_resume_end()
is missing in the error path of dpm_suspend_start(). Fix it.
Fixes: d8f3de0d2412 ("Suspend-related patches for 2.6.27")
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org # v2.6.27
Reviewed-by: "Rafael J. Wysocki (Intel)" <rafael@kernel.org>
Signed-off-by: Juergen Gross <jgross@suse.com>
Message-ID: <22453676d1ddcebbe81641bb68ddf587fee7e21e.1756990799.git.lukas@wunner.de>
Diffstat (limited to 'drivers/xen')
| -rw-r--r-- | drivers/xen/manage.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c index 841afa4933c7a6..1f5a7a42fc3278 100644 --- a/drivers/xen/manage.c +++ b/drivers/xen/manage.c @@ -110,7 +110,7 @@ static void do_suspend(void) err = dpm_suspend_start(PMSG_FREEZE); if (err) { pr_err("%s: dpm_suspend_start %d\n", __func__, err); - goto out_thaw; + goto out_resume_end; } printk(KERN_DEBUG "suspending xenstore...\n"); @@ -150,6 +150,7 @@ out_resume: else xs_suspend_cancel(); +out_resume_end: dpm_resume_end(si.cancelled ? PMSG_THAW : PMSG_RESTORE); out_thaw: |
