Drivers: hv: fix kexec/kdump after the recent changes
Subsystems (2)
cover Drivers: hv: fix kexec/kdump after the recent changes
'Restructure architecture specific code' series (now merged in char-misc) introduced a regression wrt kexec/kdump. Hypercall and TSC pages setup was moved out to the architecture specific code and the cleanup was dropped. We, however, still need this cleanup: in kexec case the new kernel may try using these pages as normal memory and will certainly crash. Restore the minimal cleanup moving it to the architecture specific code.
Commit ids I mention in 'Fixes:' tags are from char-misc-next.
Vitaly Kuznetsov (2):
Drivers: hv: restore hypervcall page cleanup before kexec
Drivers: hv: restore TSC page cleanup before kexec
arch/x86/hyperv/hv_init.c | 20 ++++++++++++++++++++ arch/x86/include/asm/mshyperv.h | 1 + drivers/hv/hv.c | 10 ---------- drivers/hv/hyperv_vmbus.h | 2 -- drivers/hv/vmbus_drv.c | 10 +++------- 5 files changed, 24 insertions(+), 19 deletions(-)
Signature · 1 line
2.9.3
PATCH 1/2 Drivers: hv: restore hypervcall page cleanup before kexec
We need to cleanup the hypercall page before doing kexec/kdump or the new kernel may crash if it tries to use it. Reuse the now-empty hv_cleanup function renaming it to hyperv_cleanup and moving to the arch specific code.
--- arch/x86/hyperv/hv_init.c | 16 ++++++++++++++++ arch/x86/include/asm/mshyperv.h | 1 + drivers/hv/hv.c | 10 ---------- drivers/hv/hyperv_vmbus.h | 2 -- drivers/hv/vmbus_drv.c | 10 +++------- 5 files changed, 20 insertions(+), 19 deletions(-)
arch/x86/hyperv/hv_init.c +16 -0
@@ -166,6 +166,22 @@ void hyperv_init(void) }/* +* This routine is called before kexec/kdump, it does the required cleanup. +*/ +void hyperv_cleanup (void ) +{ +union hv_x64_msr_hypercall_contents hypercall_msr; + +/* Reset our OS id */ +wrmsrl (HV_X64_MSR_GUEST_OS_ID ,0 ); + +/* Reset the hypercall page */ + hypercall_msr.as_uint64 =0 ; +wrmsrl (HV_X64_MSR_HYPERCALL , hypercall_msr.as_uint64); +} +EXPORT_SYMBOL_GPL (hyperv_cleanup); + +/* * hv_do_hypercall- Invoke the specified hypercall */ u64 hv_do_hypercall (u64 control,void *input,void *output)
arch/x86/include/asm/mshyperv.h +1 -0
@@ -171,5 +171,6 @@ void hv_remove_crash_handler(void);void hyperv_init (void );void hyperv_report_panic (struct pt_regs *regs);bool hv_is_hypercall_page_setup (void ); +void hyperv_cleanup (void );#endif #endif
drivers/hv/hv.c +0 -10
@@ -71,16 +71,6 @@ int hv_init(void) }/* -* hv_cleanup - Cleanup routine. -* -* This routine is called normally during driver unloading or exiting. -*/ -void hv_cleanup (bool crash) -{ - -} - -/* * hv_post_message - Post a message using the hypervisor message IPC. * * This involves a hypercall.
drivers/hv/hyperv_vmbus.h +0 -2
@@ -255,8 +255,6 @@ struct hv_ring_buffer_debug_info {extern int hv_init (void ); -extern void hv_cleanup (bool crash); -extern int hv_post_message (union hv_connection_id connection_id,enum hv_message_type message_type,void *payload,size_t payload_size);
drivers/hv/vmbus_drv.c +3 -7
@@ -962,7 +962,7 @@ static int vmbus_bus_init(void) ret =bus_register (&hv_bus);if (ret) - goto err_cleanup; +return ret;hv_setup_vmbus_irq (vmbus_isr);
@@ -1004,9 +1004,6 @@ static int vmbus_bus_init(void)bus_unregister (&hv_bus); -err_cleanup: -hv_cleanup (false); -return ret; }
@@ -1462,7 +1459,7 @@ static void hv_kexec_handler(void)/* Make sure conn_state is set as hv_synic_cleanup checks for it */ mb ();cpuhp_remove_state (hyperv_cpuhp_online); -hv_cleanup (false); +hyperv_cleanup (); };static void hv_crash_handler (struct pt_regs *regs)
@@ -1475,7 +1472,7 @@ static void hv_crash_handler(struct pt_regs *regs)*/ vmbus_connection.conn_state =DISCONNECTED ;hv_synic_cleanup (smp_processor_id ()); -hv_cleanup (true); +hyperv_cleanup (); };static int __init hv_acpi_init (void )
@@ -1535,7 +1532,6 @@ static void __exit vmbus_exit(void) &hyperv_panic_block); }bus_unregister (&hv_bus); -hv_cleanup (false);for_each_online_cpu (cpu) {tasklet_kill (hv_context.event_dpc[cpu]); }
Signature · 1 line
2.9.3
PATCH 2/2 Drivers: hv: restore TSC page cleanup before kexec
In reply to Vitaly KuznetsovWe need to cleanup the TSC page before doing kexec/kdump or the new kernel may crash if it tries to use it.
--- arch/x86/hyperv/hv_init.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/x86/hyperv/hv_init.c +4 -0
@@ -178,6 +178,10 @@ void hyperv_cleanup(void)/* Reset the hypercall page */ hypercall_msr.as_uint64 =0 ;wrmsrl (HV_X64_MSR_HYPERCALL , hypercall_msr.as_uint64); + +/* Reset the TSC page */ + hypercall_msr.as_uint64 =0 ; +wrmsrl (HV_X64_MSR_REFERENCE_TSC , hypercall_msr.as_uint64); }EXPORT_SYMBOL_GPL (hyperv_cleanup);
Signature · 1 line
2.9.3