Commit d6f3609d authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Greg Kroah-Hartman

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.

Fixes: 8730046c ("Drivers: hv vmbus: Move Hypercall page setup out of common code")
Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 17244623
...@@ -165,6 +165,22 @@ void hyperv_init(void) ...@@ -165,6 +165,22 @@ void hyperv_init(void)
clocksource_register_hz(&hyperv_cs_msr, NSEC_PER_SEC/100); clocksource_register_hz(&hyperv_cs_msr, NSEC_PER_SEC/100);
} }
/*
* 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 * hv_do_hypercall- Invoke the specified hypercall
*/ */
......
...@@ -171,5 +171,6 @@ void hv_remove_crash_handler(void); ...@@ -171,5 +171,6 @@ void hv_remove_crash_handler(void);
void hyperv_init(void); void hyperv_init(void);
void hyperv_report_panic(struct pt_regs *regs); void hyperv_report_panic(struct pt_regs *regs);
bool hv_is_hypercall_page_setup(void); bool hv_is_hypercall_page_setup(void);
void hyperv_cleanup(void);
#endif #endif
#endif #endif
...@@ -70,16 +70,6 @@ int hv_init(void) ...@@ -70,16 +70,6 @@ int hv_init(void)
return 0; return 0;
} }
/*
* 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. * hv_post_message - Post a message using the hypervisor message IPC.
* *
......
...@@ -255,8 +255,6 @@ struct hv_ring_buffer_debug_info { ...@@ -255,8 +255,6 @@ struct hv_ring_buffer_debug_info {
extern int hv_init(void); extern int hv_init(void);
extern void hv_cleanup(bool crash);
extern int hv_post_message(union hv_connection_id connection_id, extern int hv_post_message(union hv_connection_id connection_id,
enum hv_message_type message_type, enum hv_message_type message_type,
void *payload, size_t payload_size); void *payload, size_t payload_size);
......
...@@ -962,7 +962,7 @@ static int vmbus_bus_init(void) ...@@ -962,7 +962,7 @@ static int vmbus_bus_init(void)
ret = bus_register(&hv_bus); ret = bus_register(&hv_bus);
if (ret) if (ret)
goto err_cleanup; return ret;
hv_setup_vmbus_irq(vmbus_isr); hv_setup_vmbus_irq(vmbus_isr);
...@@ -1004,9 +1004,6 @@ static int vmbus_bus_init(void) ...@@ -1004,9 +1004,6 @@ static int vmbus_bus_init(void)
bus_unregister(&hv_bus); bus_unregister(&hv_bus);
err_cleanup:
hv_cleanup(false);
return ret; return ret;
} }
...@@ -1462,7 +1459,7 @@ static void hv_kexec_handler(void) ...@@ -1462,7 +1459,7 @@ static void hv_kexec_handler(void)
/* Make sure conn_state is set as hv_synic_cleanup checks for it */ /* Make sure conn_state is set as hv_synic_cleanup checks for it */
mb(); mb();
cpuhp_remove_state(hyperv_cpuhp_online); cpuhp_remove_state(hyperv_cpuhp_online);
hv_cleanup(false); hyperv_cleanup();
}; };
static void hv_crash_handler(struct pt_regs *regs) static void hv_crash_handler(struct pt_regs *regs)
...@@ -1475,7 +1472,7 @@ 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; vmbus_connection.conn_state = DISCONNECTED;
hv_synic_cleanup(smp_processor_id()); hv_synic_cleanup(smp_processor_id());
hv_cleanup(true); hyperv_cleanup();
}; };
static int __init hv_acpi_init(void) static int __init hv_acpi_init(void)
...@@ -1535,7 +1532,6 @@ static void __exit vmbus_exit(void) ...@@ -1535,7 +1532,6 @@ static void __exit vmbus_exit(void)
&hyperv_panic_block); &hyperv_panic_block);
} }
bus_unregister(&hv_bus); bus_unregister(&hv_bus);
hv_cleanup(false);
for_each_online_cpu(cpu) { for_each_online_cpu(cpu) {
tasklet_kill(hv_context.event_dpc[cpu]); tasklet_kill(hv_context.event_dpc[cpu]);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment