[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