]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
x86/kexec: Only swap pages for ::preserve_context mode
authorDavid Woodhouse <dwmw@amazon.co.uk>
Thu, 5 Dec 2024 15:05:10 +0000 (15:05 +0000)
committerIngo Molnar <mingo@kernel.org>
Fri, 6 Dec 2024 09:41:59 +0000 (10:41 +0100)
There's no need to swap pages (which involves three memcopies for each
page) in the plain kexec case. Just do a single copy from source to
destination page.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Baoquan He <bhe@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Dave Young <dyoung@redhat.com>
Cc: Eric Biederman <ebiederm@xmission.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Link: https://lore.kernel.org/r/20241205153343.3275139-5-dwmw2@infradead.org
arch/x86/kernel/relocate_kernel_64.S

index fea650f926066b6e2bd64a82ba00900a7f4b03e3..ca7f1e1d5b11438d7c60cc7fde3c7e47f677dc19 100644 (file)
@@ -310,6 +310,9 @@ SYM_CODE_START_LOCAL_NOALIGN(swap_pages)
        movq    %rdi, %rdx    /* Save destination page to %rdx */
        movq    %rsi, %rax    /* Save source page to %rax */
 
+       testq   %r11, %r11    /* Only actually swap for ::preserve_context */
+       jz      .Lnoswap
+
        /* copy source page to swap page */
        movq    %r10, %rdi
        movl    $512, %ecx
@@ -324,6 +327,7 @@ SYM_CODE_START_LOCAL_NOALIGN(swap_pages)
        /* copy swap page to destination page */
        movq    %rdx, %rdi
        movq    %r10, %rsi
+.Lnoswap:
        movl    $512, %ecx
        rep ; movsq