| From f770c3d858687252f1270265ba152d5c622e793f Mon Sep 17 00:00:00 2001 |
| From: Lukas Wunner <lukas@wunner.de> |
| Date: Thu, 4 Sep 2025 15:11:09 +0200 |
| Subject: xen/manage: Fix suspend error path |
| |
| From: Lukas Wunner <lukas@wunner.de> |
| |
| commit f770c3d858687252f1270265ba152d5c622e793f upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/xen/manage.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/xen/manage.c |
| +++ b/drivers/xen/manage.c |
| @@ -116,7 +116,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"); |
| @@ -156,6 +156,7 @@ out_resume: |
| else |
| xs_suspend_cancel(); |
| |
| +out_resume_end: |
| dpm_resume_end(si.cancelled ? PMSG_THAW : PMSG_RESTORE); |
| |
| out_thaw: |