Commit f878f3d5 authored by K. Y. Srinivasan's avatar K. Y. Srinivasan Committed by Greg Kroah-Hartman

Drivers: hv: Optimize signaling in the read path

Now that we have the infratructure for correctly determining when we
should signal the host; optimize the signaling on the read side -
signaling the guest from the host.
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7ae3e035
...@@ -212,6 +212,9 @@ static void process_chn_event(u32 relid) ...@@ -212,6 +212,9 @@ static void process_chn_event(u32 relid)
{ {
struct vmbus_channel *channel; struct vmbus_channel *channel;
unsigned long flags; unsigned long flags;
void *arg;
bool read_state;
u32 bytes_to_read;
/* /*
* Find the channel based on this relid and invokes the * Find the channel based on this relid and invokes the
...@@ -234,10 +237,29 @@ static void process_chn_event(u32 relid) ...@@ -234,10 +237,29 @@ static void process_chn_event(u32 relid)
*/ */
spin_lock_irqsave(&channel->inbound_lock, flags); spin_lock_irqsave(&channel->inbound_lock, flags);
if (channel->onchannel_callback != NULL) if (channel->onchannel_callback != NULL) {
channel->onchannel_callback(channel->channel_callback_context); arg = channel->channel_callback_context;
else read_state = channel->batched_reading;
/*
* This callback reads the messages sent by the host.
* We can optimize host to guest signaling by ensuring:
* 1. While reading the channel, we disable interrupts from
* host.
* 2. Ensure that we process all posted messages from the host
* before returning from this callback.
* 3. Once we return, enable signaling from the host. Once this
* state is set we check to see if additional packets are
* available to read. In this case we repeat the process.
*/
do {
hv_begin_read(&channel->inbound);
channel->onchannel_callback(arg);
bytes_to_read = hv_end_read(&channel->inbound);
} while (read_state && (bytes_to_read != 0));
} else {
pr_err("no channel callback for relid - %u\n", relid); pr_err("no channel callback for relid - %u\n", relid);
}
spin_unlock_irqrestore(&channel->inbound_lock, flags); spin_unlock_irqrestore(&channel->inbound_lock, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment