* [PATCH] Don't explode on swsusp failure to find swap
@ 2005-05-31 7:13 Benjamin Herrenschmidt
2005-05-31 10:36 ` Pavel Machek
0 siblings, 1 reply; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2005-05-31 7:13 UTC (permalink / raw)
To: Linux-pm mailing list; +Cc: Pavel Machek, Linux Kernel list
Hi !
If we specify a swap device for swsusp using resume= kernel argument and
that device doesn't exist in the swap list, we end up calling
swsusp_free() before we have allocated pagedir_save. That causes us to
explode when trying to free it.
Pavel, does that look right ?
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Index: linux-work/kernel/power/swsusp.c
===================================================================
--- linux-work.orig/kernel/power/swsusp.c 2005-05-31 16:29:22.000000000 +1000
+++ linux-work/kernel/power/swsusp.c 2005-05-31 16:57:30.000000000 +1000
@@ -730,10 +730,13 @@
void swsusp_free(void)
{
+ if (pagedir_save == NULL)
+ return;
BUG_ON(PageNosave(virt_to_page(pagedir_save)));
BUG_ON(PageNosaveFree(virt_to_page(pagedir_save)));
free_image_pages();
free_pagedir(pagedir_save);
+ pagedir_save = NULL;
}
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Don't explode on swsusp failure to find swap
2005-05-31 7:13 [PATCH] Don't explode on swsusp failure to find swap Benjamin Herrenschmidt
@ 2005-05-31 10:36 ` Pavel Machek
2005-05-31 14:45 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 9+ messages in thread
From: Pavel Machek @ 2005-05-31 10:36 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: Linux-pm mailing list, Linux Kernel list
Hi!
> If we specify a swap device for swsusp using resume= kernel argument and
> that device doesn't exist in the swap list, we end up calling
> swsusp_free() before we have allocated pagedir_save. That causes us to
> explode when trying to free it.
>
> Pavel, does that look right ?
It looks like a workaround. We should not call swsusp_free in case
device does not exists. Quick look did not reveal where the bug comes
from, can you try to trace it?
Pavel
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Don't explode on swsusp failure to find swap
2005-05-31 10:36 ` Pavel Machek
@ 2005-05-31 14:45 ` Benjamin Herrenschmidt
2005-05-31 23:50 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2005-05-31 14:45 UTC (permalink / raw)
To: Pavel Machek; +Cc: Linux-pm mailing list, Linux Kernel list
On Tue, 2005-05-31 at 12:36 +0200, Pavel Machek wrote:
> Hi!
>
> > If we specify a swap device for swsusp using resume= kernel argument and
> > that device doesn't exist in the swap list, we end up calling
> > swsusp_free() before we have allocated pagedir_save. That causes us to
> > explode when trying to free it.
> >
> > Pavel, does that look right ?
>
> It looks like a workaround. We should not call swsusp_free in case
> device does not exists. Quick look did not reveal where the bug comes
> from, can you try to trace it?
> Pavel
Well, the bug comes from arch code calling swsusp_save() which fails,
then we call swsusp_free()
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Don't explode on swsusp failure to find swap
2005-05-31 14:45 ` Benjamin Herrenschmidt
@ 2005-05-31 23:50 ` Benjamin Herrenschmidt
2005-06-01 6:52 ` [linux-pm] " Shaohua Li
2005-06-01 9:27 ` Pavel Machek
0 siblings, 2 replies; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2005-05-31 23:50 UTC (permalink / raw)
To: Pavel Machek; +Cc: Linux-pm mailing list, Linux Kernel list
On Wed, 2005-06-01 at 00:45 +1000, Benjamin Herrenschmidt wrote:
> On Tue, 2005-05-31 at 12:36 +0200, Pavel Machek wrote:
> > Hi!
> >
> > > If we specify a swap device for swsusp using resume= kernel argument and
> > > that device doesn't exist in the swap list, we end up calling
> > > swsusp_free() before we have allocated pagedir_save. That causes us to
> > > explode when trying to free it.
> > >
> > > Pavel, does that look right ?
> >
> > It looks like a workaround. We should not call swsusp_free in case
> > device does not exists. Quick look did not reveal where the bug comes
> > from, can you try to trace it?
> > Pavel
>
> Well, the bug comes from arch code calling swsusp_save() which fails,
> then we call swsusp_free()
More specifically, arch suspend calls swsusp_save().
It fails and returns the error to the arch asm code, which itself
returns it to it's caller swsusp_suspend(), which does that:
if ((error = swsusp_arch_suspend()))
swsusp_free();
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [linux-pm] Re: [PATCH] Don't explode on swsusp failure to find swap
2005-05-31 23:50 ` Benjamin Herrenschmidt
@ 2005-06-01 6:52 ` Shaohua Li
2005-06-01 9:29 ` Pavel Machek
2005-06-01 9:27 ` Pavel Machek
1 sibling, 1 reply; 9+ messages in thread
From: Shaohua Li @ 2005-06-01 6:52 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: Pavel Machek, linux-pm, lkml
Hi,
On Wed, 2005-06-01 at 07:50 +0800, Benjamin Herrenschmidt wrote:
> On Wed, 2005-06-01 at 00:45 +1000, Benjamin Herrenschmidt wrote:
> > On Tue, 2005-05-31 at 12:36 +0200, Pavel Machek wrote:
> > > Hi!
> > >
> > > > If we specify a swap device for swsusp using resume= kernel
> argument and
> > > > that device doesn't exist in the swap list, we end up calling
> > > > swsusp_free() before we have allocated pagedir_save. That causes
> us to
> > > > explode when trying to free it.
> > > >
> > > > Pavel, does that look right ?
> > >
> > > It looks like a workaround. We should not call swsusp_free in
> case
> > > device does not exists. Quick look did not reveal where the bug
> comes
> > > from, can you try to trace it?
> > > Pavel
> >
> > Well, the bug comes from arch code calling swsusp_save() which
> fails,
> > then we call swsusp_free()
>
> More specifically, arch suspend calls swsusp_save().
>
> It fails and returns the error to the arch asm code, which itself
> returns it to it's caller swsusp_suspend(), which does that:
>
> if ((error = swsusp_arch_suspend()))
> swsusp_free();
I encounter a similar issue, when swsusp_swap_check failed.
It seems the swsusp_free isn't required in the failure case,
suspend_prepare_image has correctly handled the failure case to me.
Other arch? I wonder why swsusp_free is called after device_power_down
failed as well. No pages are allocated before device_power_down.
Thanks,
Shaohua
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Don't explode on swsusp failure to find swap
2005-05-31 23:50 ` Benjamin Herrenschmidt
2005-06-01 6:52 ` [linux-pm] " Shaohua Li
@ 2005-06-01 9:27 ` Pavel Machek
2005-06-01 19:20 ` [linux-pm] " Rafael J. Wysocki
1 sibling, 1 reply; 9+ messages in thread
From: Pavel Machek @ 2005-06-01 9:27 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: Linux-pm mailing list, Linux Kernel list
Hi!
> > > > If we specify a swap device for swsusp using resume= kernel argument and
> > > > that device doesn't exist in the swap list, we end up calling
> > > > swsusp_free() before we have allocated pagedir_save. That causes us to
> > > > explode when trying to free it.
> > > >
> > > > Pavel, does that look right ?
> > >
> > > It looks like a workaround. We should not call swsusp_free in case
> > > device does not exists. Quick look did not reveal where the bug comes
> > > from, can you try to trace it?
> > > Pavel
> >
> > Well, the bug comes from arch code calling swsusp_save() which fails,
> > then we call swsusp_free()
>
> More specifically, arch suspend calls swsusp_save().
>
> It fails and returns the error to the arch asm code, which itself
> returns it to it's caller swsusp_suspend(), which does that:
>
> if ((error = swsusp_arch_suspend()))
> swsusp_free();
Ugh, swsusp_free should be totally unneccessary at this point; only
error returns are from the time before anything is allocated.
Does something like this help?
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
--- a/kernel/power/swsusp.c
+++ b/kernel/power/swsusp.c
@@ -975,13 +975,6 @@ extern asmlinkage int swsusp_arch_resume
asmlinkage int swsusp_save(void)
{
- int error = 0;
-
- if ((error = swsusp_swap_check())) {
- printk(KERN_ERR "swsusp: FATAL: cannot find swap device, try "
- "swapon -a!\n");
- return error;
- }
return suspend_prepare_image();
}
@@ -999,12 +992,19 @@ int swsusp_suspend(void)
*/
if ((error = device_power_down(PMSG_FREEZE))) {
local_irq_enable();
- swsusp_free();
return error;
}
+
+ if ((error = swsusp_swap_check())) {
+ printk(KERN_ERR "swsusp: FATAL: cannot find swap device, try "
+ "swapon -a!\n");
+ local_irq_enable();
+ return error;
+ }
+
save_processor_state();
if ((error = swsusp_arch_suspend()))
- swsusp_free();
+ printk("Error %d suspending\n", error);
/* Restore control flow magically appears here */
restore_processor_state();
BUG_ON (nr_copy_pages_check != nr_copy_pages);
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [linux-pm] Re: [PATCH] Don't explode on swsusp failure to find swap
2005-06-01 6:52 ` [linux-pm] " Shaohua Li
@ 2005-06-01 9:29 ` Pavel Machek
0 siblings, 0 replies; 9+ messages in thread
From: Pavel Machek @ 2005-06-01 9:29 UTC (permalink / raw)
To: Shaohua Li; +Cc: Benjamin Herrenschmidt, linux-pm, lkml
Hi!
> > More specifically, arch suspend calls swsusp_save().
> >
> > It fails and returns the error to the arch asm code, which itself
> > returns it to it's caller swsusp_suspend(), which does that:
> >
> > if ((error = swsusp_arch_suspend()))
> > swsusp_free();
> I encounter a similar issue, when swsusp_swap_check failed.
> It seems the swsusp_free isn't required in the failure case,
> suspend_prepare_image has correctly handled the failure case to me.
> Other arch? I wonder why swsusp_free is called after device_power_down
> failed as well. No pages are allocated before device_power_down.
Agreed, its wrong. Also there's no reason for the swap check to be
called (even indirectly) from arch code...
Pavel
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [linux-pm] Re: [PATCH] Don't explode on swsusp failure to find swap
2005-06-01 9:27 ` Pavel Machek
@ 2005-06-01 19:20 ` Rafael J. Wysocki
2005-06-01 20:42 ` Pavel Machek
0 siblings, 1 reply; 9+ messages in thread
From: Rafael J. Wysocki @ 2005-06-01 19:20 UTC (permalink / raw)
To: linux-pm; +Cc: Pavel Machek, Benjamin Herrenschmidt, Linux Kernel list
Hi,
On Wednesday, 1 of June 2005 11:27, Pavel Machek wrote:
> Hi!
>
> > > > > If we specify a swap device for swsusp using resume= kernel argument and
> > > > > that device doesn't exist in the swap list, we end up calling
> > > > > swsusp_free() before we have allocated pagedir_save. That causes us to
> > > > > explode when trying to free it.
> > > > >
> > > > > Pavel, does that look right ?
> > > >
> > > > It looks like a workaround. We should not call swsusp_free in case
> > > > device does not exists. Quick look did not reveal where the bug comes
> > > > from, can you try to trace it?
> > > > Pavel
> > >
> > > Well, the bug comes from arch code calling swsusp_save() which fails,
> > > then we call swsusp_free()
> >
> > More specifically, arch suspend calls swsusp_save().
> >
> > It fails and returns the error to the arch asm code, which itself
> > returns it to it's caller swsusp_suspend(), which does that:
> >
> > if ((error = swsusp_arch_suspend()))
> > swsusp_free();
>
> Ugh, swsusp_free should be totally unneccessary at this point; only
> error returns are from the time before anything is allocated.
Oops, it looks like I have introduced these swsusp_free()s, so I'm sorry ...
> Does something like this help?
>
> diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
> --- a/kernel/power/swsusp.c
> +++ b/kernel/power/swsusp.c
> @@ -975,13 +975,6 @@ extern asmlinkage int swsusp_arch_resume
>
> asmlinkage int swsusp_save(void)
> {
> - int error = 0;
> -
> - if ((error = swsusp_swap_check())) {
> - printk(KERN_ERR "swsusp: FATAL: cannot find swap device, try "
> - "swapon -a!\n");
> - return error;
> - }
> return suspend_prepare_image();
> }
I think we can move the contents of suspend_prepare_image() directly to
swsusp_save(). It's not used anywhere else.
Greets,
Rafael
--
- Would you tell me, please, which way I ought to go from here?
- That depends a good deal on where you want to get to.
-- Lewis Carroll "Alice's Adventures in Wonderland"
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [linux-pm] Re: [PATCH] Don't explode on swsusp failure to find swap
2005-06-01 19:20 ` [linux-pm] " Rafael J. Wysocki
@ 2005-06-01 20:42 ` Pavel Machek
0 siblings, 0 replies; 9+ messages in thread
From: Pavel Machek @ 2005-06-01 20:42 UTC (permalink / raw)
To: Rafael J. Wysocki; +Cc: linux-pm, Benjamin Herrenschmidt, Linux Kernel list
Hi!
> > diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c
> > --- a/kernel/power/swsusp.c
> > +++ b/kernel/power/swsusp.c
> > @@ -975,13 +975,6 @@ extern asmlinkage int swsusp_arch_resume
> >
> > asmlinkage int swsusp_save(void)
> > {
> > - int error = 0;
> > -
> > - if ((error = swsusp_swap_check())) {
> > - printk(KERN_ERR "swsusp: FATAL: cannot find swap device, try "
> > - "swapon -a!\n");
> > - return error;
> > - }
> > return suspend_prepare_image();
> > }
>
> I think we can move the contents of suspend_prepare_image() directly to
> swsusp_save(). It's not used anywhere else.
I thought about that, too, but bugfixes first, cleanups next.
Pavel
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2005-06-01 20:46 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-31 7:13 [PATCH] Don't explode on swsusp failure to find swap Benjamin Herrenschmidt
2005-05-31 10:36 ` Pavel Machek
2005-05-31 14:45 ` Benjamin Herrenschmidt
2005-05-31 23:50 ` Benjamin Herrenschmidt
2005-06-01 6:52 ` [linux-pm] " Shaohua Li
2005-06-01 9:29 ` Pavel Machek
2005-06-01 9:27 ` Pavel Machek
2005-06-01 19:20 ` [linux-pm] " Rafael J. Wysocki
2005-06-01 20:42 ` Pavel Machek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox