Message ID | 20170207080904.5974-5-takahiro.akashi@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Akashi, On 07/02/17 08:08, AKASHI Takahiro wrote: > Since arch_kexec_protect_crashkres() removes a mapping for crash dump > kernel memory, the loaded contents won't be preserved around hibernation. > > In this patch, arch_kexec_(un)protect_crashkres() are additionally called > before/after hibernation so that the relevant region will be mapped again > and restored just as the other memory regions are. Reviewed-by: James Morse <james.morse@arm.com> A quick test of this took longer than expected (writing to a slow usb device), I suspect it is save/restoring the whole crash region (which I don't think is a problem). If someone turns out to use this combination of features I will look at improving this, (almost certainly requires core-code changes). Thanks, James
On Wed, Feb 15, 2017 at 12:12:35PM +0000, James Morse wrote: > Hi Akashi, > > On 07/02/17 08:08, AKASHI Takahiro wrote: > > Since arch_kexec_protect_crashkres() removes a mapping for crash dump > > kernel memory, the loaded contents won't be preserved around hibernation. > > > > In this patch, arch_kexec_(un)protect_crashkres() are additionally called > > before/after hibernation so that the relevant region will be mapped again > > and restored just as the other memory regions are. > > Reviewed-by: James Morse <james.morse@arm.com> Thank you very much. > A quick test of this took longer than expected (writing to a slow usb device), Really? I use a uSD card on hikey as a swap device, and it takes just a few moments to save a hibernate image although I do the test right after the system comes up. > I > suspect it is save/restoring the whole crash region (which I don't think is a > problem). Now that we have only page-level mappings for the crash region, it might be possible to mark all the unused pages "reserved" in arch_kexec_unprotect_crashkres() if called in hibernate. -Takahiro AKASHI > If someone turns out to use this combination of features I will look > at improving this, (almost certainly requires core-code changes). > > > Thanks, > > James
diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c index fe301cbcb442..111a849333ee 100644 --- a/arch/arm64/kernel/hibernate.c +++ b/arch/arm64/kernel/hibernate.c @@ -16,6 +16,7 @@ */ #define pr_fmt(x) "hibernate: " x #include <linux/cpu.h> +#include <linux/kexec.h> #include <linux/kvm_host.h> #include <linux/mm.h> #include <linux/pm.h> @@ -289,6 +290,12 @@ int swsusp_arch_suspend(void) local_dbg_save(flags); if (__cpu_suspend_enter(&state)) { +#ifdef CONFIG_KEXEC_CORE + /* make the crash dump kernel region mapped */ + if (kexec_crash_image) + arch_kexec_unprotect_crashkres(); +#endif + sleep_cpu = smp_processor_id(); ret = swsusp_save(); } else { @@ -300,6 +307,12 @@ int swsusp_arch_suspend(void) if (el2_reset_needed()) dcache_clean_range(__hyp_idmap_text_start, __hyp_idmap_text_end); +#ifdef CONFIG_KEXEC_CORE + /* make the crash dump kernel region unmapped */ + if (kexec_crash_image) + arch_kexec_protect_crashkres(); +#endif + /* * Tell the hibernation core that we've just restored * the memory
Since arch_kexec_protect_crashkres() removes a mapping for crash dump kernel memory, the loaded contents won't be preserved around hibernation. In this patch, arch_kexec_(un)protect_crashkres() are additionally called before/after hibernation so that the relevant region will be mapped again and restored just as the other memory regions are. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> --- arch/arm64/kernel/hibernate.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)