Patch "Drivers: hv: avoid vfree() on crash" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
Drivers: hv: avoid vfree() on crash
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drivers-hv-avoid-vfree-on-crash.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
a9f61ca793becabdefab03b77568d6c6f8c1bc79Mon Sep 17 00:00:00 2001
From: Vitaly Kuznetsov <[email protected]>
Date: Fri, 3 Jun 2016 17:09:22 -0700
Subject: Drivers: hv: avoid vfree() on crash
From: Vitaly Kuznetsov <[email protected]>
commit a9f61ca793becabdefab03b77568d6c6f8c1bc79 upstream.
When we crash from NMI context (e.g. after NMI injection from host when 'sysctl -w kernel.unknown_nmi_panic=1' is set) we hit
kernel BUG at mm/vmalloc.c:1530!
as vfree() is denied. While the issue could be solved with in_nmi() check instead I opted for skipping vfree on all sorts of crashes to reduce the amount of work which can cause consequent crashes. We don't really need to free anything on crash.
--- drivers/hv/hv.c | 8 +++++--- drivers/hv/hyperv_vmbus.h | 2 +- drivers/hv/vmbus_drv.c | 8 ++++---- 3 files changed, 10 insertions(+), 8 deletions(-)
drivers/hv/hv.c +5 -3
@@ -274,7 +274,7 @@ cleanup:* * This routine is called normally during driver unloading or exiting. */ -void hv_cleanup (void ) +void hv_cleanup (bool crash) {union hv_x64_msr_hypercall_contents hypercall_msr;
@@ -284,7 +284,8 @@ void hv_cleanup(void)if (hv_context.hypercall_page) { hypercall_msr.as_uint64 =0 ;wrmsrl (HV_X64_MSR_HYPERCALL , hypercall_msr.as_uint64); -vfree (hv_context.hypercall_page); +if (!crash) +vfree (hv_context.hypercall_page); hv_context.hypercall_page =NULL ; }
@@ -304,7 +305,8 @@ void hv_cleanup(void) hypercall_msr.as_uint64 =0 ;wrmsrl (HV_X64_MSR_REFERENCE_TSC , hypercall_msr.as_uint64); -vfree (hv_context.tsc_page); +if (!crash) +vfree (hv_context.tsc_page); hv_context.tsc_page = NULL; }#endif
drivers/hv/hyperv_vmbus.h +1 -1
@@ -581,7 +581,7 @@ struct hv_ring_buffer_debug_info {extern int hv_init (void ); -extern void hv_cleanup (void ); +extern void hv_cleanup (bool crash); extern int hv_post_message(union hv_connection_id connection_id, enum hv_message_type message_type,
drivers/hv/vmbus_drv.c +4 -4
@@ -889,7 +889,7 @@ err_alloc:bus_unregister (&hv_bus); err_cleanup: -hv_cleanup (); +hv_cleanup (false);return ret; }
@@ -1254,7 +1254,7 @@ static void hv_kexec_handler(void)vmbus_initiate_unload ();for_each_online_cpu (cpu)smp_call_function_single (cpu, hv_synic_cleanup,NULL ,1 ); -hv_cleanup (); +hv_cleanup (false); };static void hv_crash_handler (struct pt_regs *regs)
@@ -1266,7 +1266,7 @@ static void hv_crash_handler(struct pt_r* for kdump. */ hv_synic_cleanup (NULL ); -hv_cleanup (); +hv_cleanup (true); };static int __init hv_acpi_init (void )
@@ -1330,7 +1330,7 @@ static void __exit vmbus_exit(void) &hyperv_panic_block); }bus_unregister (&hv_bus); -hv_cleanup (); +hv_cleanup (false);for_each_online_cpu (cpu) {tasklet_kill (hv_context.event_dpc[cpu]);smp_call_function_single (cpu, hv_synic_cleanup,NULL ,1 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/drivers-hv-balloon-don-t-crash-when-memory-is-added-in-non-sorted-order.patch queue-4.4/drivers-hv-avoid-vfree-on-crash.patch queue-4.4/hv_netvsc-use-skb_get_hash-instead-of-a-homegrown-implementation.patch