* [PATCH 0/2] Drivers: hv @ 2014-07-07 23:33 K. Y. Srinivasan 2014-07-07 23:34 ` [PATCH 1/2] Drivers: hv: vmbus: Fix a bug in the channel callback dispatch code K. Y. Srinivasan 0 siblings, 1 reply; 3+ messages in thread From: K. Y. Srinivasan @ 2014-07-07 23:33 UTC (permalink / raw) To: gregkh, linux-kernel, devel, olaf, apw, jasowang; +Cc: K. Y. Srinivasan This patch set fixes a bug in the VMBUS driver that dispatches driver specific callback as well as a bug in the KVP code. K. Y. Srinivasan (2): Drivers: hv: vmbus: Fix a bug in the channel callback dispatch code Drivers: hv: util: Fix a bug in the KVP code drivers/hv/connection.c | 8 ++++++-- drivers/hv/hv_kvp.c | 17 ++++++++++++++--- drivers/hv/hv_util.c | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) -- 1.7.4.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] Drivers: hv: vmbus: Fix a bug in the channel callback dispatch code 2014-07-07 23:33 [PATCH 0/2] Drivers: hv K. Y. Srinivasan @ 2014-07-07 23:34 ` K. Y. Srinivasan 2014-07-07 23:34 ` [PATCH 2/2] Drivers: hv: util: Fix a bug in the KVP code K. Y. Srinivasan 0 siblings, 1 reply; 3+ messages in thread From: K. Y. Srinivasan @ 2014-07-07 23:34 UTC (permalink / raw) To: gregkh, linux-kernel, devel, olaf, apw, jasowang; +Cc: K. Y. Srinivasan, stable 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> Cc: <stable@vger.kernel.org> --- drivers/hv/connection.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index e84f452..ae22e3c 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c @@ -339,9 +339,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); -- 1.7.4.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] Drivers: hv: util: Fix a bug in the KVP code 2014-07-07 23:34 ` [PATCH 1/2] Drivers: hv: vmbus: Fix a bug in the channel callback dispatch code K. Y. Srinivasan @ 2014-07-07 23:34 ` K. Y. Srinivasan 0 siblings, 0 replies; 3+ messages in thread From: K. Y. Srinivasan @ 2014-07-07 23:34 UTC (permalink / raw) To: gregkh, linux-kernel, devel, olaf, apw, jasowang; +Cc: K. Y. Srinivasan, stable Add code to poll the channel since we process only one message at a time and the host may not interrupt us. Also increase the receive buffer size since some KVP messages are close to 8K bytes in size. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Cc: <stable@vger.kernel.org> --- drivers/hv/hv_kvp.c | 17 ++++++++++++++--- drivers/hv/hv_util.c | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c index ea85253..521c146 100644 --- a/drivers/hv/hv_kvp.c +++ b/drivers/hv/hv_kvp.c @@ -127,6 +127,17 @@ kvp_work_func(struct work_struct *dummy) kvp_respond_to_host(NULL, HV_E_FAIL); } +static void poll_channel(struct vmbus_channel *channel) +{ + if (channel->target_cpu != smp_processor_id()) + smp_call_function_single(channel->target_cpu, + hv_kvp_onchannelcallback, + channel, true); + else + hv_kvp_onchannelcallback(channel); +} + + static int kvp_handle_handshake(struct hv_kvp_msg *msg) { int ret = 1; @@ -155,7 +166,7 @@ static int kvp_handle_handshake(struct hv_kvp_msg *msg) kvp_register(dm_reg_value); kvp_transaction.active = false; if (kvp_transaction.kvp_context) - hv_kvp_onchannelcallback(kvp_transaction.kvp_context); + poll_channel(kvp_transaction.kvp_context); } return ret; } @@ -568,7 +579,7 @@ response_done: vmbus_sendpacket(channel, recv_buffer, buf_len, req_id, VM_PKT_DATA_INBAND, 0); - + poll_channel(channel); } /* @@ -603,7 +614,7 @@ void hv_kvp_onchannelcallback(void *context) return; } - vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 2, &recvlen, + vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 4, &recvlen, &requestid); if (recvlen > 0) { diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c index dd76180..3b9c9ef 100644 --- a/drivers/hv/hv_util.c +++ b/drivers/hv/hv_util.c @@ -319,7 +319,7 @@ static int util_probe(struct hv_device *dev, (struct hv_util_service *)dev_id->driver_data; int ret; - srv->recv_buffer = kmalloc(PAGE_SIZE * 2, GFP_KERNEL); + srv->recv_buffer = kmalloc(PAGE_SIZE * 4, GFP_KERNEL); if (!srv->recv_buffer) return -ENOMEM; if (srv->util_init) { -- 1.7.4.1 ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-07-07 22:34 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-07-07 23:33 [PATCH 0/2] Drivers: hv K. Y. Srinivasan 2014-07-07 23:34 ` [PATCH 1/2] Drivers: hv: vmbus: Fix a bug in the channel callback dispatch code K. Y. Srinivasan 2014-07-07 23:34 ` [PATCH 2/2] Drivers: hv: util: Fix a bug in the KVP code K. Y. Srinivasan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome