]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/vmw_vsock/hyperv_transport.c
Merge branch 'for-5.3/uclogic' into for-linus
[linux.git] / net / vmw_vsock / hyperv_transport.c
index fb2df6e068fa6accf7e678f42ab10620578a2c53..62dcdf082349323182b09b46b3a156e5b93ca2e9 100644 (file)
@@ -211,18 +211,6 @@ static void hvs_set_channel_pending_send_size(struct vmbus_channel *chan)
        set_channel_pending_send_size(chan,
                                      HVS_PKT_LEN(HVS_SEND_BUF_SIZE));
 
-       /* See hvs_stream_has_space(): we must make sure the host has seen
-        * the new pending send size, before we can re-check the writable
-        * bytes.
-        */
-       virt_mb();
-}
-
-static void hvs_clear_channel_pending_send_size(struct vmbus_channel *chan)
-{
-       set_channel_pending_send_size(chan, 0);
-
-       /* Ditto */
        virt_mb();
 }
 
@@ -292,9 +280,6 @@ static void hvs_channel_cb(void *ctx)
        if (hvs_channel_readable(chan))
                sk->sk_data_ready(sk);
 
-       /* See hvs_stream_has_space(): when we reach here, the writable bytes
-        * may be already less than HVS_PKT_LEN(HVS_SEND_BUF_SIZE).
-        */
        if (hv_get_bytes_to_write(&chan->outbound) > 0)
                sk->sk_write_space(sk);
 }
@@ -395,6 +380,13 @@ static void hvs_open_connection(struct vmbus_channel *chan)
        set_per_channel_state(chan, conn_from_host ? new : sk);
        vmbus_set_chn_rescind_callback(chan, hvs_close_connection);
 
+       /* Set the pending send size to max packet size to always get
+        * notifications from the host when there is enough writable space.
+        * The host is optimized to send notifications only when the pending
+        * size boundary is crossed, and not always.
+        */
+       hvs_set_channel_pending_send_size(chan);
+
        if (conn_from_host) {
                new->sk_state = TCP_ESTABLISHED;
                sk->sk_ack_backlog++;
@@ -688,23 +680,8 @@ static s64 hvs_stream_has_data(struct vsock_sock *vsk)
 static s64 hvs_stream_has_space(struct vsock_sock *vsk)
 {
        struct hvsock *hvs = vsk->trans;
-       struct vmbus_channel *chan = hvs->chan;
-       s64 ret;
-
-       ret = hvs_channel_writable_bytes(chan);
-       if (ret > 0)  {
-               hvs_clear_channel_pending_send_size(chan);
-       } else {
-               /* See hvs_channel_cb() */
-               hvs_set_channel_pending_send_size(chan);
-
-               /* Re-check the writable bytes to avoid race */
-               ret = hvs_channel_writable_bytes(chan);
-               if (ret > 0)
-                       hvs_clear_channel_pending_send_size(chan);
-       }
 
-       return ret;
+       return hvs_channel_writable_bytes(hvs->chan);
 }
 
 static u64 hvs_stream_rcvhiwat(struct vsock_sock *vsk)