[Hyper-V] do not lose pending heartbeat vmbus packets
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
linux (Ubuntu) |
Fix Released
|
Medium
|
Unassigned | ||
Precise |
Fix Released
|
Medium
|
Unassigned | ||
Trusty |
Fix Released
|
Medium
|
Unassigned | ||
Vivid |
Fix Released
|
Medium
|
Unassigned | ||
Xenial |
Fix Released
|
Medium
|
Unassigned | ||
Yakkety |
Fix Released
|
Medium
|
Unassigned |
Bug Description
Hyper-V hosts can continue sending heartbeat packets to guests independent of whether earlier packets have responses, which led to a potential issue of these packets being dropped when responses took too long to process. Lost heartbeats will lead to the host diagnosing that the guest is dead and should be shut down and restarted.
The following patch was submitted upstream but has not yet been accepted. I will add the upstream commit ID once the patch goes into linux-next:
From: Long Li <email address hidden>
The host keeps sending heartbeat packets independent of the
guest responding to them. Even though we respond to the heartbeat messages at
interrupt level, we can have situations where there maybe multiple heartbeat
messages pending that have not been responded to. For instance this occurs when the
VM is paused and the host continues to send the heartbeat messages.
Address this issue by draining and responding to all
the heartbeat messages that maybe pending.
Signed-off-by: Long Li <email address hidden>
Signed-off-by: K. Y. Srinivasan <email address hidden>
CC: Stable <email address hidden>
---
V2: Submit the patch to stable as well - Joshua R. Poulson <email address hidden>
drivers/
1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/
index 4aa3cb6..bcd0630 100644
--- a/drivers/
+++ b/drivers/
@@ -314,10 +314,14 @@ static void heartbeat_
u8 *hbeat_txf_buf = util_heartbeat.
struct icmsg_negotiate *negop = NULL;
- vmbus_recvpacke
- PAGE_SIZE, &recvlen, &requestid);
+ while (1) {
+
+ vmbus_recvpacke
+ PAGE_SIZE, &recvlen, &requestid);
+
+ if (!recvlen)
+ break;
- if (recvlen > 0) {
Changed in linux (Ubuntu): | |
importance: | Undecided → Medium |
tags: | added: kernel-da-key kernel-hyper-v |
Changed in linux (Ubuntu): | |
status: | Incomplete → Triaged |
Changed in linux (Ubuntu Xenial): | |
status: | New → Triaged |
Changed in linux (Ubuntu Trusty): | |
status: | New → Triaged |
Changed in linux (Ubuntu Xenial): | |
importance: | Undecided → Medium |
Changed in linux (Ubuntu Trusty): | |
importance: | Undecided → Medium |
Changed in linux (Ubuntu Precise): | |
status: | New → Confirmed |
importance: | Undecided → High |
importance: | High → Medium |
Changed in linux (Ubuntu): | |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
Changed in linux (Ubuntu Precise): | |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
Changed in linux (Ubuntu Trusty): | |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
Changed in linux (Ubuntu Xenial): | |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
Changed in linux (Ubuntu Yakkety): | |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
status: | Confirmed → In Progress |
Changed in linux (Ubuntu Xenial): | |
status: | Confirmed → In Progress |
Changed in linux (Ubuntu Trusty): | |
status: | Confirmed → In Progress |
Changed in linux (Ubuntu Precise): | |
status: | Confirmed → In Progress |
Changed in linux (Ubuntu): | |
status: | Confirmed → In Progress |
Changed in linux (Ubuntu Precise): | |
status: | In Progress → Fix Committed |
Changed in linux (Ubuntu Trusty): | |
status: | In Progress → Fix Committed |
Changed in linux (Ubuntu Vivid): | |
status: | New → Fix Committed |
Changed in linux (Ubuntu Xenial): | |
status: | In Progress → Fix Committed |
Changed in linux (Ubuntu Yakkety): | |
status: | In Progress → Fix Committed |
Changed in linux (Ubuntu): | |
status: | In Progress → Fix Committed |
Changed in linux (Ubuntu Vivid): | |
importance: | Undecided → Medium |
assignee: | nobody → Joseph Salisbury (jsalisbury) |
tags: |
added: verification-done-yakkety removed: verification-needed-yakkety |
tags: |
added: verification-done-trusty removed: verification-needed-trusty |
tags: |
added: verification-done-vivid removed: verification-needed-vivid |
tags: |
added: verification-done-xenial removed: verification-needed-xenial |
tags: |
added: verification-done-precise removed: verification-needed-precise |
Changed in linux (Ubuntu): | |
status: | Fix Committed → Fix Released |
This affects 16.10, 16.04, 14.04, and 12.04. Please apply this patch to the HWE kernels for the LTS releases.