diff options
Diffstat (limited to 'kexec-Add-quick-kexec-support.patch')
| -rw-r--r-- | kexec-Add-quick-kexec-support.patch | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/kexec-Add-quick-kexec-support.patch b/kexec-Add-quick-kexec-support.patch new file mode 100644 index 0000000..b4a7276 --- /dev/null +++ b/kexec-Add-quick-kexec-support.patch @@ -0,0 +1,118 @@ +From 893ef61ca2b1e857b950654c1bb57f3624df5dc5 Mon Sep 17 00:00:00 2001 +From: snoweay <snoweay@163.com> +Date: Wed, 12 Aug 2020 07:53:13 -0400 +Subject: [PATCH] kexec: Add quick kexec support + +Add quick kexec option -q and flags. + +In normal kexec, relocating kernel may cost 5 ~ 10 seconds, to +copy all segments from vmalloced memory to kernel boot memory, +because of disabled mmu. + +We introduce quick kexec to save time of copying memory as above, +just like kdump(kexec on crash), by using reserved memory. + +We also add this support in syscall kexec_load of linux kernel +through flags of KEXEC_QUICK. + +Add KEXEC_FLAGS_MAX to avoid conflicting with KEXEC_LIVE_UPDATE. +--- + kexec/kexec-syscall.h | 2 ++ + kexec/kexec-xen.h | 2 +- + kexec/kexec.c | 10 ++++++++++ + kexec/kexec.h | 4 +++- + 4 files changed, 16 insertions(+), 2 deletion(-) + +diff --git a/kexec/kexec-syscall.h b/kexec/kexec-syscall.h +index bea29d4..5f22353 100644 +--- a/kexec/kexec-syscall.h ++++ b/kexec/kexec-syscall.h +@@ -109,6 +109,8 @@ static inline long kexec_file_load(int kernel_fd, int initrd_fd, + + #define KEXEC_ON_CRASH 0x00000001 + #define KEXEC_PRESERVE_CONTEXT 0x00000002 ++#define KEXEC_QUICK 0x00000004 ++#define KEXEC_FLAGS_MAX 0x00000010 + #define KEXEC_ARCH_MASK 0xffff0000 + + /* Flags for kexec file based system call */ +diff --git a/kexec/kexec-xen.h b/kexec/kexec-xen.h +index 70fb576..d417c90 100644 +--- a/kexec/kexec-xen.h ++++ b/kexec/kexec-xen.h +@@ -79,7 +79,7 @@ extern int __xc_interface_close(xc_interface *xch); + #endif + + #ifndef KEXEC_LIVE_UPDATE +-#define KEXEC_LIVE_UPDATE 0x00000004 ++#define KEXEC_LIVE_UPDATE KEXEC_FLAGS_MAX + #endif + + int xen_get_kexec_range(int range, uint64_t *start, uint64_t *end); +diff --git a/kexec/kexec.c b/kexec/kexec.c +index f63b36b..5b8beca 100644 +--- a/kexec/kexec.c ++++ b/kexec/kexec.c +@@ -1009,6 +1009,7 @@ void usage(void) + " -l, --load Load the new kernel into the\n" + " current kernel.\n" + " -p, --load-panic Load the new kernel for use on panic.\n" ++ " -q, --load-quick Load the new kernel to quick kexec\n" + " -u, --unload Unload the current kexec target kernel.\n" + " If capture kernel is being unloaded\n" + " specify -p with -u.\n" +@@ -1340,6 +1341,7 @@ int main(int argc, char *argv[]) + int has_opt_load = 0; + int do_load = 1; + int do_exec = 0; ++ int do_quick = 0; + int do_load_jump_back_helper = 0; + int do_shutdown = 1; + int do_sync = 1, skip_sync = 0; +@@ -1460,6 +1462,14 @@ int main(int argc, char *argv[]) + kexec_file_flags |= KEXEC_FILE_ON_CRASH; + kexec_flags = KEXEC_ON_CRASH; + break; ++ case OPT_QUICK: ++ do_load = 1; ++ do_exec = 0; ++ do_shutdown = 0; ++ do_quick = 1; ++ kexec_flags = KEXEC_QUICK; ++ skip_checks = 1; ++ break; + case OPT_MEM_MIN: + mem_min = strtoul(optarg, &endptr, 0); + if (*endptr) { +diff --git a/kexec/kexec.h b/kexec/kexec.h +index 595dd68..9cbc77f 100644 +--- a/kexec/kexec.h ++++ b/kexec/kexec.h +@@ -218,6 +218,7 @@ extern int file_types; + #define OPT_UNLOAD 'u' + #define OPT_TYPE 't' + #define OPT_PANIC 'p' ++#define OPT_QUICK 'q' + #define OPT_KEXEC_FILE_SYSCALL 's' + #define OPT_KEXEC_SYSCALL 'c' + #define OPT_KEXEC_SYSCALL_AUTO 'a' +@@ -249,6 +250,7 @@ extern int file_types; + { "entry", 1, 0, OPT_ENTRY }, \ + { "type", 1, 0, OPT_TYPE }, \ + { "load-panic", 0, 0, OPT_PANIC }, \ ++ { "load-quick", 0, 0, OPT_QUICK }, \ + { "mem-min", 1, 0, OPT_MEM_MIN }, \ + { "mem-max", 1, 0, OPT_MEM_MAX }, \ + { "reuseinitrd", 0, 0, OPT_REUSE_INITRD }, \ +@@ -259,7 +261,7 @@ extern int file_types; + { "status", 0, 0, OPT_STATUS }, \ + { "print-ckr-size", 0, 0, OPT_PRINT_CKR_SIZE }, \ + +-#define KEXEC_OPT_STR "h?vdfixyluet:pscaS" ++#define KEXEC_OPT_STR "h?vdfixyluet:pqscaS" + + extern void dbgprint_mem_range(const char *prefix, struct memory_range *mr, int nr_mr); + extern void die(const char *fmt, ...) +-- +2.30.0 + |
