Patch "Drivers: hv: vmbus: Fix a Host signaling bug" 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: vmbus: Fix a Host signaling bug
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-vmbus-fix-a-host-signaling-bug.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
8599846d73997cdbccf63f23394d871cfad1e5e6Mon Sep 17 00:00:00 2001
From: "K. Y. Srinivasan" <[email protected]>
Date: Mon, 14 Dec 2015 16:01:54 -0800
Subject: Drivers: hv: vmbus: Fix a Host signaling bug
From: K. Y. Srinivasan <[email protected]>
commit 8599846d73997cdbccf63f23394d871cfad1e5e6 upstream.
Currently we have two policies for deciding when to signal the host:
One based on the ring buffer state and the other based on what the VMBUS client driver wants to do. Consider the case when the client wants to explicitly control when to signal the host. In this case, if the client were to defer signaling, we will not be able to signal the host subsequently when the client does want to signal since the ring buffer state will prevent the signaling. Implement logic to have only one signaling policy in force for a given channel.
--- drivers/hv/channel.c | 18 ++++++++++++++++++ include/linux/hyperv.h | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+)
drivers/hv/channel.c +18 -0
@@ -630,10 +630,19 @@ int vmbus_sendpacket_ctl(struct vmbus_ch* on the ring. We will not signal if more data is * to be placed. * +* Based on the channel signal state, we will decide +* which signaling policy will be applied. +* * If we cannot write to the ring-buffer; signal the host * even if we may not have written anything. This is a rare * enough condition that it should not matter. */ + +if (channel->signal_policy) + signal = true; +else + kick_q = true; +if (((ret ==0 ) && kick_q && signal) || (ret))vmbus_setevent (channel);
@@ -733,10 +742,19 @@ int vmbus_sendpacket_pagebuffer_ctl(stru* on the ring. We will not signal if more data is * to be placed. * +* Based on the channel signal state, we will decide +* which signaling policy will be applied. +* * If we cannot write to the ring-buffer; signal the host * even if we may not have written anything. This is a rare * enough condition that it should not matter. */ + +if (channel->signal_policy) + signal = true; +else + kick_q = true; +if (((ret ==0 ) && kick_q && signal) || (ret))vmbus_setevent (channel);
include/linux/hyperv.h +18 -0
@@ -630,6 +630,11 @@ struct hv_input_signal_event_buffer {struct hv_input_signal_event event; }; +enum hv_signal_policy { +HV_SIGNAL_POLICY_DEFAULT =0 , +HV_SIGNAL_POLICY_EXPLICIT , +}; +struct vmbus_channel {/* Unique channel id */ int id;
@@ -757,8 +762,21 @@ struct vmbus_channel {* link up channels based on their CPU affinity. */ struct list_head percpu_list; +/* +* Host signaling policy: The default policy will be +* based on the ring buffer state. We will also support +* a policy where the client driver can have explicit +* signaling control. +*/ +enum hv_signal_policy signal_policy; }; +static inline void set_channel_signal_state (struct vmbus_channel *c, +enum hv_signal_policy policy) +{ + c->signal_policy = policy; +} +static inline void set_channel_read_state (struct vmbus_channel *c,bool state) { c->batched_reading = state;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/drivers-hv-vmbus-fix-a-host-signaling-bug.patch queue-4.4/tools-hv-vss-fix-the-write-s-argument-error-vss_msg.patch