lkml.org 
[lkml]   [2012]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/28] Drivers: hv: Optimize signaling in the read path
    Date
    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: K. Y. Srinivasan <kys@microsoft.com>
    Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
    ---
    drivers/hv/connection.c | 28 +++++++++++++++++++++++++---
    1 files changed, 25 insertions(+), 3 deletions(-)

    diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c
    index 650c9f0..d1019a7 100644
    --- a/drivers/hv/connection.c
    +++ b/drivers/hv/connection.c
    @@ -212,6 +212,9 @@ static void process_chn_event(u32 relid)
    {
    struct vmbus_channel *channel;
    unsigned long flags;
    + void *arg;
    + bool read_state;
    + u32 bytes_to_read;

    /*
    * Find the channel based on this relid and invokes the
    @@ -234,10 +237,29 @@ static void process_chn_event(u32 relid)
    */

    spin_lock_irqsave(&channel->inbound_lock, flags);
    - if (channel->onchannel_callback != NULL)
    - channel->onchannel_callback(channel->channel_callback_context);
    - else
    + if (channel->onchannel_callback != NULL) {
    + arg = channel->channel_callback_context;
    + 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);
    + }

    spin_unlock_irqrestore(&channel->inbound_lock, flags);
    }
    --
    1.7.4.1


    \
     
     \ /
      Last update: 2012-12-01 16:41    [W:4.170 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site