[azure 4.13][PATCH 02/19] Revert "UBUNTU: SAUCE: hv-sock: a temporary workaround for the pending_send_size issue"

Marcelo Henrique Cerri marcelo.cerri at canonical.com
Tue Dec 12 15:41:51 UTC 2017


From: Dexuan Cui <decui at microsoft.com>

BugLink: http://bugs.launchpad.net/bugs/1736283

This reverts commit 5d7e6db39352d001c92393dafa5e7bf501144c63.

Signed-off-by: Dexuan Cui <decui at microsoft.com>
Signed-off-by: Marcelo Henrique Cerri <marcelo.cerri at canonical.com>
---
 net/vmw_vsock/af_vsock.c         |  7 ++-----
 net/vmw_vsock/hyperv_transport.c | 32 ++++++++++----------------------
 2 files changed, 12 insertions(+), 27 deletions(-)

diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index d32bee6af856..b7b2c66d91fd 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -1544,7 +1544,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
 	struct sock *sk;
 	struct vsock_sock *vsk;
 	ssize_t total_written;
-	long timeout, timeout_once;
+	long timeout;
 	int err;
 	struct vsock_transport_send_notify_data send_data;
 	DEFINE_WAIT_FUNC(wait, woken_wake_function);
@@ -1613,7 +1613,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
 			}
 
 			release_sock(sk);
-			timeout_once = schedule_timeout(1);
+			timeout = wait_woken(&wait, TASK_INTERRUPTIBLE, timeout);
 			lock_sock(sk);
 			if (signal_pending(current)) {
 				err = sock_intr_errno(timeout);
@@ -1623,9 +1623,6 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
 				err = -EAGAIN;
 				remove_wait_queue(sk_sleep(sk), &wait);
 				goto out_err;
-			} else {
-				if (timeout_once == 0)
-					timeout--;
 			}
 		}
 		remove_wait_queue(sk_sleep(sk), &wait);
diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c
index 76c0b9802376..30154836acd0 100644
--- a/net/vmw_vsock/hyperv_transport.c
+++ b/net/vmw_vsock/hyperv_transport.c
@@ -268,7 +268,7 @@ static void hvs_channel_cb(void *ctx)
 		sk->sk_data_ready(sk);
 
 	/* Mark it writable only if there is enough space */
-	if (hv_get_bytes_to_write(&chan->outbound) > 0)
+	if (hvs_channel_writable_bytes(chan) >= HVS_SEND_BUF_SIZE)
 		sk->sk_write_space(sk);
 }
 
@@ -350,6 +350,10 @@ 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);
 
+	/* See hvs_channel_cb() and hvs_notify_poll_out()  */
+	set_channel_pending_send_size(chan,
+				      HVS_PKT_LEN(HVS_SEND_BUF_SIZE) + 1);
+
 	if (conn_from_host) {
 		new->sk_state = SS_CONNECTED;
 		sk->sk_ack_backlog++;
@@ -538,7 +542,7 @@ static ssize_t hvs_stream_enqueue(struct vsock_sock *vsk, struct msghdr *msg,
 	struct hvsock *hvs = vsk->trans;
 	struct vmbus_channel *chan = hvs->chan;
 	struct hvs_send_buf *send_buf;
-	ssize_t to_write, max_writable, ret;
+	size_t to_write, max_writable, ret;
 
 	BUILD_BUG_ON(sizeof(*send_buf) != PAGE_SIZE_4K);
 
@@ -547,8 +551,8 @@ static ssize_t hvs_stream_enqueue(struct vsock_sock *vsk, struct msghdr *msg,
 		return -ENOMEM;
 
 	max_writable = hvs_channel_writable_bytes(chan);
-	to_write = min_t(ssize_t, len, max_writable);
-	to_write = min_t(ssize_t, to_write, HVS_SEND_BUF_SIZE);
+	to_write = min_t(size_t, len, max_writable);
+	to_write = min_t(size_t, to_write, HVS_SEND_BUF_SIZE);
 
 	ret = memcpy_from_msg(send_buf->data, msg, to_write);
 	if (ret < 0)
@@ -591,22 +595,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;
-	s64 ret;
-
-	ret = hvs_channel_writable_bytes(hvs->chan);
-	if (ret > 0)  {
-		set_channel_pending_send_size(hvs->chan, 0);
-	} else {
-		/* See hvs_channel_cb() and hvs_notify_poll_out()  */
-		set_channel_pending_send_size(hvs->chan,
-				      HVS_PKT_LEN(HVS_SEND_BUF_SIZE) + 1);
 
-		ret = hvs_channel_writable_bytes(hvs->chan);
-		if (ret > 0)
-			set_channel_pending_send_size(hvs->chan, 0);
-	}
-
-	return ret;
+	return hvs_channel_writable_bytes(hvs->chan);
 }
 
 static u64 hvs_stream_rcvhiwat(struct vsock_sock *vsk)
@@ -656,10 +646,8 @@ int hvs_notify_poll_in(struct vsock_sock *vsk, size_t target, bool *readable)
 static
 int hvs_notify_poll_out(struct vsock_sock *vsk, size_t target, bool *writable)
 {
-	struct hvsock *hvs = vsk->trans;
-
 	/* Report writable only if there is enough space */
-	*writable = hvs_channel_writable_bytes(hvs->chan) > 0;
+	*writable = hvs_stream_has_space(vsk) >= HVS_SEND_BUF_SIZE;
 
 	return 0;
 }
-- 
2.7.4





More information about the kernel-team mailing list