kexec jump: fix for ftrace
[firefly-linux-kernel-4.4.55.git] / arch / x86 / kernel / machine_kexec_32.c
index 5c8e7735c896c8e8c4256b307725c6d51a9a82a8..0732adba05ca95bfaf851d3d2193df5074478482 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/init.h>
 #include <linux/numa.h>
 #include <linux/ftrace.h>
+#include <linux/suspend.h>
 
 #include <asm/pgtable.h>
 #include <asm/pgalloc.h>
@@ -113,6 +114,7 @@ void machine_kexec(struct kimage *image)
 {
        unsigned long page_list[PAGES_NR];
        void *control_page;
+       int save_ftrace_enabled;
        asmlinkage unsigned long
                (*relocate_kernel_ptr)(unsigned long indirection_page,
                                       unsigned long control_page,
@@ -120,7 +122,12 @@ void machine_kexec(struct kimage *image)
                                       unsigned int has_pae,
                                       unsigned int preserve_context);
 
-       tracer_disable();
+#ifdef CONFIG_KEXEC_JUMP
+       if (kexec_image->preserve_context)
+               save_processor_state();
+#endif
+
+       save_ftrace_enabled = __ftrace_enabled_save();
 
        /* Interrupts aren't acceptable while we reboot */
        local_irq_disable();
@@ -178,6 +185,13 @@ void machine_kexec(struct kimage *image)
                                           (unsigned long)page_list,
                                           image->start, cpu_has_pae,
                                           image->preserve_context);
+
+#ifdef CONFIG_KEXEC_JUMP
+       if (kexec_image->preserve_context)
+               restore_processor_state();
+#endif
+
+       __ftrace_enabled_restore(save_ftrace_enabled);
 }
 
 void arch_crash_save_vmcoreinfo(void)