Drivers: hv: Add state to manage batched reading
authorK. Y. Srinivasan <kys@microsoft.com>
Sat, 1 Dec 2012 14:46:33 +0000 (06:46 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Jan 2013 18:46:39 +0000 (10:46 -0800)
For the "read" side signaling optimization, the reader has to completely
drain the queue before exiting. Add state to manage this "batched"
reading.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/channel_mgmt.c
include/linux/hyperv.h

index 2f84c5c..7bf5917 100644 (file)
@@ -275,6 +275,13 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
                return;
        }
 
+       /*
+        * By default we setup state to enable batched
+        * reading. A specific service can choose to
+        * disable this prior to opening the channel.
+        */
+       newchannel->batched_reading = true;
+
        memcpy(&newchannel->offermsg, offer,
               sizeof(struct vmbus_channel_offer_channel));
        newchannel->monitor_grp = (u8)offer->monitorid / 32;
index e73b852..1ffe84d 100644 (file)
@@ -882,8 +882,28 @@ struct vmbus_channel {
 
        void (*onchannel_callback)(void *context);
        void *channel_callback_context;
+
+       /*
+        * A channel can be marked for efficient (batched)
+        * reading:
+        * If batched_reading is set to "true", we read until the
+        * channel is empty and hold off interrupts from the host
+        * during the entire read process.
+        * If batched_reading is set to "false", the client is not
+        * going to perform batched reading.
+        *
+        * By default we will enable batched reading; specific
+        * drivers that don't want this behavior can turn it off.
+        */
+
+       bool batched_reading;
 };
 
+static inline void set_channel_read_state(struct vmbus_channel *c, bool state)
+{
+       c->batched_reading = state;
+}
+
 void vmbus_onmessage(void *context);
 
 int vmbus_request_offers(void);