2003-08-30 12:43:35

by Mika Penttilä

[permalink] [raw]
Subject: swsusp broken

2.6.0-test4 software suspend seems to be badly broken...looking at it
(relevant code included below), no wonder. pm_suspend_disk() calls
swsusp_save(), which is is essentially a nop. The intention was clearly
that after resume control would return from swsusp_save(), which isn't
the case, instead we return from swsusp_write(), and power down again!!!

--Mika

--------------------------------------------------------------------------
static int pm_suspend_disk(void)
{
int error;

pr_debug("PM: Attempting to suspend to disk.\n");
if (pm_disk_mode == PM_DISK_FIRMWARE)
return pm_ops->enter(PM_SUSPEND_DISK);

if (!have_swsusp)
return -EPERM;

pr_debug("PM: snapshotting memory.\n");
in_suspend = 1;
if ((error = swsusp_save()))
goto Done;

if (in_suspend) {
pr_debug("PM: writing image.\n");
error = swsusp_write();
if (!error)
error = power_down(pm_disk_mode);
pr_debug("PM: Power down failed.\n");
} else
pr_debug("PM: Image restored successfully.\n");
swsusp_free();
Done:
return error;
}
----------------------------------------------------------------------------

/**
* swsusp_save - Snapshot memory
*/

int swsusp_save(void)
{
#if defined (CONFIG_HIGHMEM) || defined (COFNIG_DISCONTIGMEM)
printk("swsusp is not supported with high- or discontig-mem.\n");
return -EPERM;
#endif
return 0;
}



2003-08-31 21:07:05

by Pavel Machek

[permalink] [raw]
Subject: Re: swsusp broken

Hi!

> 2.6.0-test4 software suspend seems to be badly broken...looking at it
> (relevant code included below), no wonder. pm_suspend_disk() calls
> swsusp_save(), which is is essentially a nop. The intention was clearly
> that after resume control would return from swsusp_save(), which isn't
> the case, instead we return from swsusp_write(), and power down
> again!!!

If you want working swsusp/S3, go for -test3. This is known and
Patrick is working on that... I hope we can just rollback
powermanagment to -test3 state.

> --------------------------------------------------------------------------
> static int pm_suspend_disk(void)
> {
> int error;
>
> pr_debug("PM: Attempting to suspend to disk.\n");
> if (pm_disk_mode == PM_DISK_FIRMWARE)
> return pm_ops->enter(PM_SUSPEND_DISK);
>
> if (!have_swsusp)
> return -EPERM;
>
> pr_debug("PM: snapshotting memory.\n");
> in_suspend = 1;
> if ((error = swsusp_save()))
> goto Done;
>
> if (in_suspend) {
> pr_debug("PM: writing image.\n");
> error = swsusp_write();
> if (!error)
> error = power_down(pm_disk_mode);
> pr_debug("PM: Power down failed.\n");
> } else
> pr_debug("PM: Image restored successfully.\n");
> swsusp_free();
> Done:
> return error;
> }
> ----------------------------------------------------------------------------
>
> /**
> * swsusp_save - Snapshot memory
> */
>
> int swsusp_save(void)
> {
> #if defined (CONFIG_HIGHMEM) || defined (COFNIG_DISCONTIGMEM)
> printk("swsusp is not supported with high- or discontig-mem.\n");
> return -EPERM;
> #endif
> return 0;
> }

--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]

2003-09-02 17:01:13

by Patrick Mochel

[permalink] [raw]
Subject: Re: swsusp broken


> 2.6.0-test4 software suspend seems to be badly broken...looking at it
> (relevant code included below), no wonder. pm_suspend_disk() calls
> swsusp_save(), which is is essentially a nop. The intention was clearly
> that after resume control would return from swsusp_save(), which isn't
> the case, instead we return from swsusp_write(), and power down again!!!

Could you please try -test4-mm4? This problem should be fixed in there.

Thanks,


Pat