mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-11-02 12:08:53 +00:00
101 lines
3.5 KiB
Diff
101 lines
3.5 KiB
Diff
From 8aff0f967c2347a696e09f7e30877c8284d1403c Mon Sep 17 00:00:00 2001
|
|
From: Vitaly Kuznetsov <vkuznets@redhat.com>
|
|
Date: Fri, 26 Feb 2016 15:13:16 -0800
|
|
Subject: [PATCH 34/44] Drivers: hv: vmbus: avoid wait_for_completion() on
|
|
crash
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
wait_for_completion() may sleep, it enables interrupts and this
|
|
is something we really want to avoid on crashes because interrupt
|
|
handlers can cause other crashes. Switch to the recently introduced
|
|
vmbus_wait_for_unload() doing busy wait instead.
|
|
|
|
Reported-by: Radim Krcmar <rkrcmar@redhat.com>
|
|
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
|
|
Reviewed-by: Radim Kr.má<rkrcmar@redhat.com>
|
|
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
(cherry picked from commit 75ff3a8a9168df750b5bd0589e897a6c0517a9f1)
|
|
---
|
|
drivers/hv/channel_mgmt.c | 4 ++--
|
|
drivers/hv/connection.c | 2 +-
|
|
drivers/hv/hyperv_vmbus.h | 2 +-
|
|
drivers/hv/vmbus_drv.c | 4 ++--
|
|
4 files changed, 6 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
|
|
index b40f429aaa13..f70e35278b94 100644
|
|
--- a/drivers/hv/channel_mgmt.c
|
|
+++ b/drivers/hv/channel_mgmt.c
|
|
@@ -641,7 +641,7 @@ static void vmbus_unload_response(struct vmbus_channel_message_header *hdr)
|
|
complete(&vmbus_connection.unload_event);
|
|
}
|
|
|
|
-void vmbus_initiate_unload(void)
|
|
+void vmbus_initiate_unload(bool crash)
|
|
{
|
|
struct vmbus_channel_message_header hdr;
|
|
|
|
@@ -658,7 +658,7 @@ void vmbus_initiate_unload(void)
|
|
* vmbus_initiate_unload() is also called on crash and the crash can be
|
|
* happening in an interrupt context, where scheduling is impossible.
|
|
*/
|
|
- if (!in_interrupt())
|
|
+ if (!crash)
|
|
wait_for_completion(&vmbus_connection.unload_event);
|
|
else
|
|
vmbus_wait_for_unload();
|
|
diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c
|
|
index 09c08b56e3dc..78b8be87844c 100644
|
|
--- a/drivers/hv/connection.c
|
|
+++ b/drivers/hv/connection.c
|
|
@@ -233,7 +233,7 @@ void vmbus_disconnect(void)
|
|
/*
|
|
* First send the unload request to the host.
|
|
*/
|
|
- vmbus_initiate_unload();
|
|
+ vmbus_initiate_unload(false);
|
|
|
|
if (vmbus_connection.work_queue) {
|
|
drain_workqueue(vmbus_connection.work_queue);
|
|
diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h
|
|
index 89bb5591498e..f424c2df6c19 100644
|
|
--- a/drivers/hv/hyperv_vmbus.h
|
|
+++ b/drivers/hv/hyperv_vmbus.h
|
|
@@ -756,7 +756,7 @@ void hv_vss_onchannelcallback(void *);
|
|
int hv_fcopy_init(struct hv_util_service *);
|
|
void hv_fcopy_deinit(void);
|
|
void hv_fcopy_onchannelcallback(void *);
|
|
-void vmbus_initiate_unload(void);
|
|
+void vmbus_initiate_unload(bool crash);
|
|
|
|
static inline void hv_poll_channel(struct vmbus_channel *channel,
|
|
void (*cb)(void *))
|
|
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
|
|
index 03fc5d317b22..b0cc6fd74fd0 100644
|
|
--- a/drivers/hv/vmbus_drv.c
|
|
+++ b/drivers/hv/vmbus_drv.c
|
|
@@ -1276,7 +1276,7 @@ static void hv_kexec_handler(void)
|
|
int cpu;
|
|
|
|
hv_synic_clockevents_cleanup();
|
|
- vmbus_initiate_unload();
|
|
+ vmbus_initiate_unload(false);
|
|
for_each_online_cpu(cpu)
|
|
smp_call_function_single(cpu, hv_synic_cleanup, NULL, 1);
|
|
hv_cleanup();
|
|
@@ -1284,7 +1284,7 @@ static void hv_kexec_handler(void)
|
|
|
|
static void hv_crash_handler(struct pt_regs *regs)
|
|
{
|
|
- vmbus_initiate_unload();
|
|
+ vmbus_initiate_unload(true);
|
|
/*
|
|
* In crash handler we can't schedule synic cleanup for all CPUs,
|
|
* doing the cleanup for current CPU only. This should be sufficient
|
|
--
|
|
2.11.0
|
|
|