| From affb1aff300ddee54df307812b38f166e8a865ef Mon Sep 17 00:00:00 2001 |
| From: "K. Y. Srinivasan" <kys@microsoft.com> |
| Date: Mon, 7 Jul 2014 16:34:24 -0700 |
| Subject: Drivers: hv: vmbus: Fix a bug in the channel callback dispatch code |
| |
| From: "K. Y. Srinivasan" <kys@microsoft.com> |
| |
| commit affb1aff300ddee54df307812b38f166e8a865ef upstream. |
| |
| Starting with Win8, we have implemented several optimizations to improve the |
| scalability and performance of the VMBUS transport between the Host and the |
| Guest. Some of the non-performance critical services cannot leverage these |
| optimization since they only read and process one message at a time. |
| Make adjustments to the callback dispatch code to account for the way |
| non-performance critical drivers handle reading of the channel. |
| |
| Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/hv/connection.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/hv/connection.c |
| +++ b/drivers/hv/connection.c |
| @@ -319,9 +319,13 @@ static void process_chn_event(u32 relid) |
| */ |
| |
| do { |
| - hv_begin_read(&channel->inbound); |
| + if (read_state) |
| + hv_begin_read(&channel->inbound); |
| channel->onchannel_callback(arg); |
| - bytes_to_read = hv_end_read(&channel->inbound); |
| + if (read_state) |
| + bytes_to_read = hv_end_read(&channel->inbound); |
| + else |
| + bytes_to_read = 0; |
| } while (read_state && (bytes_to_read != 0)); |
| } else { |
| pr_err("no channel callback for relid - %u\n", relid); |