kexec jump: fix for ftrace
Subsystems (4)
PATCH 6/6 kexec jump: fix for ftrace
Restore ftrace after jumping back from kexeced kernel.
--- arch/x86/kernel/machine_kexec_32.c | 19 +++++++++++++++++++ kernel/kexec.c | 2 -- 2 files changed, 19 insertions(+), 2 deletions(-)
arch/x86/kernel/machine_kexec_32.c +19 -0
@@ -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>
@@ -117,6 +118,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,
@@ -124,7 +126,15 @@ void machine_kexec(struct kimage *image)unsigned int has_pae, unsigned int preserve_context); +#ifdef CONFIG_KEXEC_JUMP +if (kexec_image->preserve_context) +save_processor_state (); +#endif + +#ifdef CONFIG_FTRACE + save_ftrace_enabled = ftrace_enabled;tracer_disable (); +#endif /* Interrupts aren't acceptable while we reboot */ raw_local_irq_disable ();
@@ -182,6 +192,15 @@ 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 + +#ifdef CONFIG_FTRACE + ftrace_enabled = save_ftrace_enabled; +#endif }void arch_crash_save_vmcoreinfo (void )
kernel/kexec.c +0 -2
@@ -1469,7 +1469,6 @@ int kernel_kexec(void) error =device_power_down (PMSG_FREEZE );if (error) goto Enable_irqs; -save_processor_state (); } else#endif {
@@ -1482,7 +1481,6 @@ int kernel_kexec(void)#ifdef CONFIG_KEXEC_JUMP if (kexec_image->preserve_context) { -restore_processor_state ();device_power_up (PMSG_RESTORE ); Enable_irqs:local_irq_enable ();
_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec
Quoted 15 lines
Restore ftrace after jumping back from kexeced kernel.
Signed-off-by Huang Ying <[email protected]>--- arch/x86/kernel/machine_kexec_32.c | 19 +++++++++++++++++++ kernel/kexec.c | 2 -- 2 files changed, 19 insertions(+), 2 deletions(-)arch/x86/kernel/machine_kexec_32.c +2
-0@@ -124,7 +126,15 @@ void machine_kexec(struct kimage *image)unsigned int has_pae, unsigned int preserve_context); +#ifdef CONFIG_KEXEC_JUMP +if (kexec_image->preserve_context)
arch/x86/kernel/machine_kexec_32.c void machine_kexec(struct kimage *image) · line 140
Quoted 10 lines
arch/x86/kernel/machine_kexec_32.c +6
-0+save_processor_state (); +#endif + +#ifdef CONFIG_FTRACE + save_ftrace_enabled = ftrace_enabled;tracer_disable (); +#endif /* Interrupts aren't acceptable while we reboot */ raw_local_irq_disable ();
The patch does way more than its changelog says...
Pavel
Quoted 35 lines
arch/x86/kernel/machine_kexec_32.c +9
-0@@ -182,6 +192,15 @@ 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 + +#ifdef CONFIG_FTRACE + ftrace_enabled = save_ftrace_enabled; +#endif }void arch_crash_save_vmcoreinfo (void )kernel/kexec.c +0
-2@@ -1469,7 +1469,6 @@ int kernel_kexec(void) error =device_power_down (PMSG_FREEZE );if (error) goto Enable_irqs; -save_processor_state (); } else#endif {@@ -1482,7 +1481,6 @@ int kernel_kexec(void)#ifdef CONFIG_KEXEC_JUMP if (kexec_image->preserve_context) { -restore_processor_state ();device_power_up (PMSG_RESTORE ); Enable_irqs:local_irq_enable ();
Signature · 7 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html _______________________________________________ kexec mailing list [email protected] http://lists.infradead.org/mailman/listinfo/kexec
Quoted 48 lines · Huang Ying
Restore ftrace after jumping back from kexeced kernel.
Signed-off-by Huang Ying <[email protected]>--- arch/x86/kernel/machine_kexec_32.c | 19 +++++++++++++++++++ kernel/kexec.c | 2 -- 2 files changed, 19 insertions(+), 2 deletions(-)arch/x86/kernel/machine_kexec_32.c +11
-0@@ -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> @@ -117,6 +118,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,@@ -124,7 +126,15 @@ void machine_kexec(struct kimage *image)unsigned int has_pae, unsigned int preserve_context); +#ifdef CONFIG_KEXEC_JUMP +if (kexec_image->preserve_context) +save_processor_state (); +#endif + +#ifdef CONFIG_FTRACE + save_ftrace_enabled = ftrace_enabled;tracer_disable (); +#endif /* Interrupts aren't acceptable while we reboot */ raw_local_irq_disable ();@@ -182,6 +192,15 @@ void machine_kexec(struct kimage *image) (unsigned long )page_list, image->start, cpu_has_pae, image->preserve_context); +
arch/x86/kernel/machine_kexec_32.c void machine_kexec(struct kimage *image) · line 205
Quoted 10 lines
arch/x86/kernel/machine_kexec_32.c +8
-0+#ifdef CONFIG_KEXEC_JUMP +if (kexec_image->preserve_context) +restore_processor_state (); +#endif + +#ifdef CONFIG_FTRACE + ftrace_enabled = save_ftrace_enabled; +#endif }
Hi Huang,
What kind of problem we run into if we don't disable the ftracer?
I think there are too many #ifdefs now and probably we can at least get rid if #ifdef CONFIG_FTRACE thing.
I think ftracer needs to export the function to enable the tracer back (tracer_enable()) so that we don't directly play with ftrace_enabled variable. tracer_enable() can be do {} while{0} in case of CONFIG_FTRACE=n so that we can get rid of #ifdefs here.
Thanks
Vivek
_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec
On Thu, 2008-08-07 at 09:38 -0400, Vivek Goyal wrote:
[...]
Quoted 9 lines
What kind of problem we run into if we don't disable the ftracer?
I think there are too many #ifdefs now and probably we can at least get rid if #ifdef
CONFIG_FTRACEthing.I think ftracer needs to export the function to enable the tracer back (
tracer_enable()) so that we don't directly play withftrace_enabledvariable.tracer_enable()can be do {} while{0} in case ofCONFIG_FTRACE=nso that we can get rid of #ifdefs here.
The ftracer issue for kexec is reported by Dhaval Giani and fixed by Ingo as in following thread:
http://lkml.org/lkml/2008/2/19/175
After some testing, I found that if we enable ftrace before restore_processor_state(), system will hang. I think maybe ftracer depends on some processor state that we destroyed during kexec and restored by restore_processor_state(). So I move save_processor_state() and restore_processor_state() into machine_kexec() and enable ftrace after restore_processor_state().
The #ifdef CONFIG_FTRACE should be removed. I think an interface like irq_save/restore is good for this.
saved_ftrace_enabled = ftrace_save_enabled()
<...>ftrace_restore_enabled(saved_ftrace_enabled)
Best Regards,
Huang Ying
_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec