lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <200711210100.32631.rjw@sisk.pl>
Date:	Wed, 21 Nov 2007 01:00:31 +0100
From:	"Rafael J. Wysocki" <rjw@...k.pl>
To:	"Huang, Ying" <ying.huang@...el.com>
Cc:	"Eric W. Biederman" <ebiederm@...ssion.com>,
	Pavel Machek <pavel@....cz>, nigel@...el.suspend2.net,
	Andrew Morton <akpm@...ux-foundation.org>,
	Jeremy Maitin-Shepard <jbms@....edu>,
	linux-kernel@...r.kernel.org, linux-pm@...ts.linux-foundation.org,
	Kexec Mailing List <kexec@...ts.infradead.org>
Subject: Re: [PATCH 3/3 -mm] kexec based hibernation -v6: kexec hibernate/resume

On Tuesday, 20 of November 2007, Huang, Ying wrote:
> On Tue, 2007-11-20 at 03:24 +0100, Rafael J. Wysocki wrote:
> > On Tuesday, 20 of November 2007, Huang, Ying wrote:
> > > On Mon, 2007-11-19 at 19:22 +0100, Rafael J. Wysocki wrote:
> > > > > +#ifdef CONFIG_KEXEC
> > > > > +static void kexec_hibernate_power_down(void)
> > > > > +{
> > > > > +	switch (hibernation_mode) {
> > > > > +	case HIBERNATION_TEST:
> > > > > +	case HIBERNATION_TESTPROC:
> > > > > +		break;
> > > > > +	case HIBERNATION_REBOOT:
> > > > > +		machine_restart(NULL);
> > > > > +		break;
> > > > > +	case HIBERNATION_PLATFORM:
> > > > > +		if (!hibernation_ops)
> > > > > +			break;
> > > > > +		hibernation_ops->enter();
> > > > 
> > > > hibernation_platform_enter() should be used here (as of the current mainline).
> > > 
> > > The power_down will be called with interrupt disabled, device suspended,
> > > non-boot CPU disabled. But the latest hibernate_platform_enter calls the
> > > device_suspend, disable_nonboot_cpus etc function. So, I use
> > > hibernation_ops->enter() directly instead of
> > > hibernation_platform_enter().
> > 
> > Hm, you need to call device_power_down(PMSG_SUSPEND) before
> > hibernation_ops->enter().
> > 
> > Also, all of the ACPI global calls need to be carried out before that and the
> > devices should be suspended rather than shut down in that case.
> > 
> > That's why hibernation_platform_enter() has been introduced, BTW.
> 
> Situation is a little different between u/swsusp and khiberantion.
> 
> u/swsusp:
> 
> platform_start();
> suspend console();
> device_suspend(PMSG_FREEZE);
> platform_pre_snapshot();
> disable_nonboot_cpus();
> local_irq_disable();
> device_power_down(PMSG_FREEZE);
> /* create snapshot */
> device_power_up();
> local_irq_enable();
> enable_nonboot_cpus();
> platform_finish();
> device_resume();
> resume_console();
> /* write the image out */
> hibernation_ops->start();
> suspend_console();
> device_suspend(PMSG_SUSPEND);
> hibernation_ops->prepare();
> disable_nonboot_cpus();
> local_irq_disable();
> device_power_down(PMSG_SUSPEND);
> hibernation_ops->enter();
> 
> khibernation:
> 
> suspend_console();
> platform_start();
> device_suspend(PMSG_FREEZE);
> platform_pre_snapshot();
> disable_nonboot_cpus();
> local_irq_disable();
> device_power_down(PMSG_FREEZE);
> /* jump to kexeced (hibernating) kernel */
> /* in kexeced kernel */
> device_power_up();
> local_irq_eanble();
> enable_nonboot_cpus();

You should call platform_finish() here, or device_resume() will not work
appropriately on some systems.

However, after platform_finish() has been executed, the ACPI firmware will
assume that the hibernation has been canceled, so you need to tell it that
you'd like to go into the low power state after all.

> device_resume();
> resume_console();
> /* write the image */

For this reason, you have to call hibernation_ops->start() once again
and the other functions like in the swsusp case, in that order.

> suspend_console();
> device_suspend(PMSG_FREEZE);
> disable_nonboot_cpus();
> local_irq_disable();
> device_power_down(PMSG_FREEZE);
> /* jump to original (hibernated) kernel */

This looks too fragile to my eyes.

Why don't you call hibernation_ops->enter() directly from the "kexeced" kernel?

Rafael
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ