Drivers: hv: vmbus: vmbus_sendpacket_ctl: hvsock: avoid unnecessary signaling
authorDexuan Cui <decui@microsoft.com>
Thu, 28 Jan 2016 06:29:39 +0000 (22:29 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 8 Feb 2016 05:34:12 +0000 (21:34 -0800)
When the hvsock channel's outbound ringbuffer is full (i.e.,
hv_ringbuffer_write() returns -EAGAIN), we should avoid the unnecessary
signaling the host.

Signed-off-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/channel.c

index 1161d68a18635d0c43c6722c78f1594c9c992045..3f04533021468666e102a65a3692f0aec3824e1c 100644 (file)
@@ -659,6 +659,9 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
         * If we cannot write to the ring-buffer; signal the host
         * even if we may not have written anything. This is a rare
         * enough condition that it should not matter.
+        * NOTE: in this case, the hvsock channel is an exception, because
+        * it looks the host side's hvsock implementation has a throttling
+        * mechanism which can hurt the performance otherwise.
         */
 
        if (channel->signal_policy)
@@ -666,7 +669,8 @@ int vmbus_sendpacket_ctl(struct vmbus_channel *channel, void *buffer,
        else
                kick_q = true;
 
-       if (((ret == 0) && kick_q && signal) || (ret))
+       if (((ret == 0) && kick_q && signal) ||
+           (ret && !is_hvsock_channel(channel)))
                vmbus_setevent(channel);
 
        return ret;