kernel-packages team mailing list archive
-
kernel-packages team
-
Mailing list archive
-
Message #161468
[Bug 1519897] Re: [Hyper-V] hv: vmbus: Fix a host signaling bug
The test kernel in comment #13 was built on top of Ubuntu-3.13.0-76.120.
It had the 7 commits listed in comment #18 applied. It did not have
the performance regression per comment #14.
The test kernel in comment #19 was built on top of Ubuntu-3.13.0-78.122
I had the 7 commits listed in comment #19 reverted, but it also had the
3.13.11-ckt34 stable updates applied. It still had the regression per
comment #28.
This may indicated the regression came in via one of the upstream stable
updates.
I'd like to perform a kernel bisect between Ubuntu-3.13.0-76.120 and
Ubuntu-3.13.0-78.122. However, we first need to make sure
Ubuntu-3.13.0-76.120 does not have the performance regression and
Ubuntu-3.13.0-78.122 does have the regression.
Can you test these two kernels for confirmation. Once we have the
results, we can start the bisect or decide on the next step:
Ubuntu-3.13.0-76.120: https://launchpad.net/~canonical-kernel-security-
team/+archive/ubuntu/ppa/+build/8865557
Ubuntu-3.13.0-78.122: https://launchpad.net/~canonical-kernel-
team/+archive/ubuntu/ppa/+build/8926054
Note, you need to install both the linux-image and linux-image-extra
.deb packages.
In parallel, I will still build you a test kernel with the original 7
commits and commit 757647e applied. I'm in the process of identifying
all the prereqs and backporting.
--
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1519897
Title:
[Hyper-V] hv: vmbus: Fix a host signaling bug
Status in linux package in Ubuntu:
Fix Committed
Status in linux-lts-trusty package in Ubuntu:
In Progress
Status in linux source package in Trusty:
Fix Committed
Status in linux-lts-trusty source package in Trusty:
In Progress
Status in linux source package in Wily:
Fix Committed
Status in linux source package in Xenial:
Fix Committed
Bug description:
The following fix has been submitted upstream, but has high enough
severity that we would like early inclusion into the Ubuntu kernel.
Please consider for wily, vivid, and trusty (and the HWE kernels for
the same).
Patch follows:
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.
Signed-off-by: K. Y. Srinivasan <kys@xxxxxxxxxxxxx>
Reviewed-by: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx>
Tested-by: Haiyang Zhang <haiyangz@xxxxxxxxxxxxx>
Cc: <stable@xxxxxxxxxxxxxxx> # v4.2+
---
drivers/hv/channel.c | 18 ++++++++++++++++++
include/linux/hyperv.h | 12 ++++++++++++
2 files changed, 30 insertions(+), 0 deletions(-)
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index 77d2579..c6278c7 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -653,10 +653,19 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
* 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_state)
+ signal = true;
+ else
+ kick_q = true;
+
if (((ret == 0) && kick_q && signal) || (ret))
vmbus_setevent(channel);
@@ -756,10 +765,19 @@ int vmbus_sendpacket_pagebuffer_ctl(struct vmbus_channel *channel,
* 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_state)
+ signal = true;
+ else
+ kick_q = true;
+
if (((ret == 0) && kick_q && signal) || (ret))
vmbus_setevent(channel);
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 437c9c8..7b1af52 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -756,8 +756,20 @@ 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.
+ */
+ bool signal_state;
};
+static inline void set_channel_signal_state(struct vmbus_channel *c,
+bool state) {
+ c->signal_state = state;
+}
+
static inline void set_channel_read_state(struct vmbus_channel *c, bool state) {
c->batched_reading = state;
--
1.7.4.1
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1519897/+subscriptions
References