mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-22 02:21:34 +00:00
commit
0390b2ba4d
@ -1,4 +1,4 @@
|
||||
From ba1dc9346ba14b24f22ea04db21011f2874c3a67 Mon Sep 17 00:00:00 2001
|
||||
From 0260029492a1503e871236767ed86e2fc3862cc2 Mon Sep 17 00:00:00 2001
|
||||
From: Julia Lawall <julia.lawall@lip6.fr>
|
||||
Date: Sat, 21 Nov 2015 18:39:17 +0100
|
||||
Subject: [PATCH 2/9] VSOCK: constify vmci_transport_notify_ops structures
|
||||
|
@ -0,0 +1,336 @@
|
||||
From 6a585c01a353551a69af45bf31606f13115480d1 Mon Sep 17 00:00:00 2001
|
||||
From: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
|
||||
Date: Tue, 22 Mar 2016 17:05:52 +0100
|
||||
Subject: [PATCH 3/9] AF_VSOCK: Shrink the area influenced by prepare_to_wait
|
||||
|
||||
When a thread is prepared for waiting by calling prepare_to_wait, sleeping
|
||||
is not allowed until either the wait has taken place or finish_wait has
|
||||
been called. The existing code in af_vsock imposed unnecessary no-sleep
|
||||
assumptions to a broad list of backend functions.
|
||||
This patch shrinks the influence of prepare_to_wait to the area where it
|
||||
is strictly needed, therefore relaxing the no-sleep restriction there.
|
||||
|
||||
Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
(cherry picked from commit f7f9b5e7f8eccfd68ffa7b8d74b07c478bb9e7f0)
|
||||
---
|
||||
net/vmw_vsock/af_vsock.c | 158 +++++++++++++++++++++++++----------------------
|
||||
1 file changed, 85 insertions(+), 73 deletions(-)
|
||||
|
||||
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
|
||||
index 7fd1220..3dce53e 100644
|
||||
--- a/net/vmw_vsock/af_vsock.c
|
||||
+++ b/net/vmw_vsock/af_vsock.c
|
||||
@@ -1209,10 +1209,14 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
|
||||
|
||||
if (signal_pending(current)) {
|
||||
err = sock_intr_errno(timeout);
|
||||
- goto out_wait_error;
|
||||
+ sk->sk_state = SS_UNCONNECTED;
|
||||
+ sock->state = SS_UNCONNECTED;
|
||||
+ goto out_wait;
|
||||
} else if (timeout == 0) {
|
||||
err = -ETIMEDOUT;
|
||||
- goto out_wait_error;
|
||||
+ sk->sk_state = SS_UNCONNECTED;
|
||||
+ sock->state = SS_UNCONNECTED;
|
||||
+ goto out_wait;
|
||||
}
|
||||
|
||||
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
@@ -1220,20 +1224,17 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
|
||||
|
||||
if (sk->sk_err) {
|
||||
err = -sk->sk_err;
|
||||
- goto out_wait_error;
|
||||
- } else
|
||||
+ sk->sk_state = SS_UNCONNECTED;
|
||||
+ sock->state = SS_UNCONNECTED;
|
||||
+ } else {
|
||||
err = 0;
|
||||
+ }
|
||||
|
||||
out_wait:
|
||||
finish_wait(sk_sleep(sk), &wait);
|
||||
out:
|
||||
release_sock(sk);
|
||||
return err;
|
||||
-
|
||||
-out_wait_error:
|
||||
- sk->sk_state = SS_UNCONNECTED;
|
||||
- sock->state = SS_UNCONNECTED;
|
||||
- goto out_wait;
|
||||
}
|
||||
|
||||
static int vsock_accept(struct socket *sock, struct socket *newsock, int flags)
|
||||
@@ -1270,18 +1271,20 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags)
|
||||
listener->sk_err == 0) {
|
||||
release_sock(listener);
|
||||
timeout = schedule_timeout(timeout);
|
||||
+ finish_wait(sk_sleep(listener), &wait);
|
||||
lock_sock(listener);
|
||||
|
||||
if (signal_pending(current)) {
|
||||
err = sock_intr_errno(timeout);
|
||||
- goto out_wait;
|
||||
+ goto out;
|
||||
} else if (timeout == 0) {
|
||||
err = -EAGAIN;
|
||||
- goto out_wait;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
prepare_to_wait(sk_sleep(listener), &wait, TASK_INTERRUPTIBLE);
|
||||
}
|
||||
+ finish_wait(sk_sleep(listener), &wait);
|
||||
|
||||
if (listener->sk_err)
|
||||
err = -listener->sk_err;
|
||||
@@ -1301,19 +1304,15 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags)
|
||||
*/
|
||||
if (err) {
|
||||
vconnected->rejected = true;
|
||||
- release_sock(connected);
|
||||
- sock_put(connected);
|
||||
- goto out_wait;
|
||||
+ } else {
|
||||
+ newsock->state = SS_CONNECTED;
|
||||
+ sock_graft(connected, newsock);
|
||||
}
|
||||
|
||||
- newsock->state = SS_CONNECTED;
|
||||
- sock_graft(connected, newsock);
|
||||
release_sock(connected);
|
||||
sock_put(connected);
|
||||
}
|
||||
|
||||
-out_wait:
|
||||
- finish_wait(sk_sleep(listener), &wait);
|
||||
out:
|
||||
release_sock(listener);
|
||||
return err;
|
||||
@@ -1557,11 +1556,11 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
|
||||
while (total_written < len) {
|
||||
ssize_t written;
|
||||
|
||||
+ prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
while (vsock_stream_has_space(vsk) == 0 &&
|
||||
sk->sk_err == 0 &&
|
||||
!(sk->sk_shutdown & SEND_SHUTDOWN) &&
|
||||
@@ -1570,27 +1569,33 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
/* Don't wait for non-blocking sockets. */
|
||||
if (timeout == 0) {
|
||||
err = -EAGAIN;
|
||||
- goto out_wait;
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ goto out_err;
|
||||
}
|
||||
|
||||
err = transport->notify_send_pre_block(vsk, &send_data);
|
||||
- if (err < 0)
|
||||
- goto out_wait;
|
||||
+ if (err < 0) {
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ goto out_err;
|
||||
+ }
|
||||
|
||||
release_sock(sk);
|
||||
timeout = schedule_timeout(timeout);
|
||||
lock_sock(sk);
|
||||
if (signal_pending(current)) {
|
||||
err = sock_intr_errno(timeout);
|
||||
- goto out_wait;
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ goto out_err;
|
||||
} else if (timeout == 0) {
|
||||
err = -EAGAIN;
|
||||
- goto out_wait;
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ goto out_err;
|
||||
}
|
||||
|
||||
prepare_to_wait(sk_sleep(sk), &wait,
|
||||
TASK_INTERRUPTIBLE);
|
||||
}
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
|
||||
/* These checks occur both as part of and after the loop
|
||||
* conditional since we need to check before and after
|
||||
@@ -1598,16 +1603,16 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
*/
|
||||
if (sk->sk_err) {
|
||||
err = -sk->sk_err;
|
||||
- goto out_wait;
|
||||
+ goto out_err;
|
||||
} else if ((sk->sk_shutdown & SEND_SHUTDOWN) ||
|
||||
(vsk->peer_shutdown & RCV_SHUTDOWN)) {
|
||||
err = -EPIPE;
|
||||
- goto out_wait;
|
||||
+ goto out_err;
|
||||
}
|
||||
|
||||
err = transport->notify_send_pre_enqueue(vsk, &send_data);
|
||||
if (err < 0)
|
||||
- goto out_wait;
|
||||
+ goto out_err;
|
||||
|
||||
/* Note that enqueue will only write as many bytes as are free
|
||||
* in the produce queue, so we don't need to ensure len is
|
||||
@@ -1620,7 +1625,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
len - total_written);
|
||||
if (written < 0) {
|
||||
err = -ENOMEM;
|
||||
- goto out_wait;
|
||||
+ goto out_err;
|
||||
}
|
||||
|
||||
total_written += written;
|
||||
@@ -1628,14 +1633,13 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
err = transport->notify_send_post_enqueue(
|
||||
vsk, written, &send_data);
|
||||
if (err < 0)
|
||||
- goto out_wait;
|
||||
+ goto out_err;
|
||||
|
||||
}
|
||||
|
||||
-out_wait:
|
||||
+out_err:
|
||||
if (total_written > 0)
|
||||
err = total_written;
|
||||
- finish_wait(sk_sleep(sk), &wait);
|
||||
out:
|
||||
release_sock(sk);
|
||||
return err;
|
||||
@@ -1716,21 +1720,61 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
|
||||
while (1) {
|
||||
- s64 ready = vsock_stream_has_data(vsk);
|
||||
+ s64 ready;
|
||||
|
||||
- if (ready < 0) {
|
||||
- /* Invalid queue pair content. XXX This should be
|
||||
- * changed to a connection reset in a later change.
|
||||
- */
|
||||
+ prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
+ ready = vsock_stream_has_data(vsk);
|
||||
|
||||
- err = -ENOMEM;
|
||||
- goto out_wait;
|
||||
- } else if (ready > 0) {
|
||||
+ if (ready == 0) {
|
||||
+ if (sk->sk_err != 0 ||
|
||||
+ (sk->sk_shutdown & RCV_SHUTDOWN) ||
|
||||
+ (vsk->peer_shutdown & SEND_SHUTDOWN)) {
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ break;
|
||||
+ }
|
||||
+ /* Don't wait for non-blocking sockets. */
|
||||
+ if (timeout == 0) {
|
||||
+ err = -EAGAIN;
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ err = transport->notify_recv_pre_block(
|
||||
+ vsk, target, &recv_data);
|
||||
+ if (err < 0) {
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ break;
|
||||
+ }
|
||||
+ release_sock(sk);
|
||||
+ timeout = schedule_timeout(timeout);
|
||||
+ lock_sock(sk);
|
||||
+
|
||||
+ if (signal_pending(current)) {
|
||||
+ err = sock_intr_errno(timeout);
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ break;
|
||||
+ } else if (timeout == 0) {
|
||||
+ err = -EAGAIN;
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+ break;
|
||||
+ }
|
||||
+ } else {
|
||||
ssize_t read;
|
||||
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
+
|
||||
+ if (ready < 0) {
|
||||
+ /* Invalid queue pair content. XXX This should
|
||||
+ * be changed to a connection reset in a later
|
||||
+ * change.
|
||||
+ */
|
||||
+
|
||||
+ err = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
err = transport->notify_recv_pre_dequeue(
|
||||
vsk, target, &recv_data);
|
||||
if (err < 0)
|
||||
@@ -1750,42 +1794,12 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
vsk, target, read,
|
||||
!(flags & MSG_PEEK), &recv_data);
|
||||
if (err < 0)
|
||||
- goto out_wait;
|
||||
+ goto out;
|
||||
|
||||
if (read >= target || flags & MSG_PEEK)
|
||||
break;
|
||||
|
||||
target -= read;
|
||||
- } else {
|
||||
- if (sk->sk_err != 0 || (sk->sk_shutdown & RCV_SHUTDOWN)
|
||||
- || (vsk->peer_shutdown & SEND_SHUTDOWN)) {
|
||||
- break;
|
||||
- }
|
||||
- /* Don't wait for non-blocking sockets. */
|
||||
- if (timeout == 0) {
|
||||
- err = -EAGAIN;
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- err = transport->notify_recv_pre_block(
|
||||
- vsk, target, &recv_data);
|
||||
- if (err < 0)
|
||||
- break;
|
||||
-
|
||||
- release_sock(sk);
|
||||
- timeout = schedule_timeout(timeout);
|
||||
- lock_sock(sk);
|
||||
-
|
||||
- if (signal_pending(current)) {
|
||||
- err = sock_intr_errno(timeout);
|
||||
- break;
|
||||
- } else if (timeout == 0) {
|
||||
- err = -EAGAIN;
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- prepare_to_wait(sk_sleep(sk), &wait,
|
||||
- TASK_INTERRUPTIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1816,8 +1830,6 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
err = copied;
|
||||
}
|
||||
|
||||
-out_wait:
|
||||
- finish_wait(sk_sleep(sk), &wait);
|
||||
out:
|
||||
release_sock(sk);
|
||||
return err;
|
||||
--
|
||||
2.8.0.rc3
|
||||
|
@ -1,164 +0,0 @@
|
||||
From e4d5bbced996499e080e790508113985963a55d5 Mon Sep 17 00:00:00 2001
|
||||
From: Laura Abbott <labbott@fedoraproject.org>
|
||||
Date: Thu, 4 Feb 2016 10:50:45 -0800
|
||||
Subject: [PATCH 3/9] vsock: Fix blocking ops call in prepare_to_wait
|
||||
|
||||
We receoved a bug report from someone using vmware:
|
||||
|
||||
WARNING: CPU: 3 PID: 660 at kernel/sched/core.c:7389
|
||||
__might_sleep+0x7d/0x90()
|
||||
do not call blocking ops when !TASK_RUNNING; state=1 set at
|
||||
[<ffffffff810fa68d>] prepare_to_wait+0x2d/0x90
|
||||
Modules linked in: vmw_vsock_vmci_transport vsock snd_seq_midi
|
||||
snd_seq_midi_event snd_ens1371 iosf_mbi gameport snd_rawmidi
|
||||
snd_ac97_codec ac97_bus snd_seq coretemp snd_seq_device snd_pcm
|
||||
snd_timer snd soundcore ppdev crct10dif_pclmul crc32_pclmul
|
||||
ghash_clmulni_intel vmw_vmci vmw_balloon i2c_piix4 shpchp parport_pc
|
||||
parport acpi_cpufreq nfsd auth_rpcgss nfs_acl lockd grace sunrpc btrfs
|
||||
xor raid6_pq 8021q garp stp llc mrp crc32c_intel serio_raw mptspi vmwgfx
|
||||
drm_kms_helper ttm drm scsi_transport_spi mptscsih e1000 ata_generic
|
||||
mptbase pata_acpi
|
||||
CPU: 3 PID: 660 Comm: vmtoolsd Not tainted
|
||||
4.2.0-0.rc1.git3.1.fc23.x86_64 #1
|
||||
Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop
|
||||
Reference Platform, BIOS 6.00 05/20/2014
|
||||
0000000000000000 0000000049e617f3 ffff88006ac37ac8 ffffffff818641f5
|
||||
0000000000000000 ffff88006ac37b20 ffff88006ac37b08 ffffffff810ab446
|
||||
ffff880068009f40 ffffffff81c63bc0 0000000000000061 0000000000000000
|
||||
Call Trace:
|
||||
[<ffffffff818641f5>] dump_stack+0x4c/0x65
|
||||
[<ffffffff810ab446>] warn_slowpath_common+0x86/0xc0
|
||||
[<ffffffff810ab4d5>] warn_slowpath_fmt+0x55/0x70
|
||||
[<ffffffff8112551d>] ? debug_lockdep_rcu_enabled+0x1d/0x20
|
||||
[<ffffffff810fa68d>] ? prepare_to_wait+0x2d/0x90
|
||||
[<ffffffff810fa68d>] ? prepare_to_wait+0x2d/0x90
|
||||
[<ffffffff810da2bd>] __might_sleep+0x7d/0x90
|
||||
[<ffffffff812163b3>] __might_fault+0x43/0xa0
|
||||
[<ffffffff81430477>] copy_from_iter+0x87/0x2a0
|
||||
[<ffffffffa039460a>] __qp_memcpy_to_queue+0x9a/0x1b0 [vmw_vmci]
|
||||
[<ffffffffa0394740>] ? qp_memcpy_to_queue+0x20/0x20 [vmw_vmci]
|
||||
[<ffffffffa0394757>] qp_memcpy_to_queue_iov+0x17/0x20 [vmw_vmci]
|
||||
[<ffffffffa0394d50>] qp_enqueue_locked+0xa0/0x140 [vmw_vmci]
|
||||
[<ffffffffa039593f>] vmci_qpair_enquev+0x4f/0xd0 [vmw_vmci]
|
||||
[<ffffffffa04847bb>] vmci_transport_stream_enqueue+0x1b/0x20
|
||||
[vmw_vsock_vmci_transport]
|
||||
[<ffffffffa047ae05>] vsock_stream_sendmsg+0x2c5/0x320 [vsock]
|
||||
[<ffffffff810fabd0>] ? wake_atomic_t_function+0x70/0x70
|
||||
[<ffffffff81702af8>] sock_sendmsg+0x38/0x50
|
||||
[<ffffffff81702ff4>] SYSC_sendto+0x104/0x190
|
||||
[<ffffffff8126e25a>] ? vfs_read+0x8a/0x140
|
||||
[<ffffffff817042ee>] SyS_sendto+0xe/0x10
|
||||
[<ffffffff8186d9ae>] entry_SYSCALL_64_fastpath+0x12/0x76
|
||||
|
||||
transport->stream_enqueue may call copy_to_user so it should
|
||||
not be called inside a prepare_to_wait. Narrow the scope of
|
||||
the prepare_to_wait to avoid the bad call. This also applies
|
||||
to vsock_stream_recvmsg as well.
|
||||
|
||||
Reported-by: Vinson Lee <vlee@freedesktop.org>
|
||||
Tested-by: Vinson Lee <vlee@freedesktop.org>
|
||||
Signed-off-by: Laura Abbott <labbott@fedoraproject.org>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
(cherry picked from commit 5988818008257ca42010d6b43a3e0e48afec9898)
|
||||
---
|
||||
net/vmw_vsock/af_vsock.c | 19 ++++++-------------
|
||||
1 file changed, 6 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
|
||||
index 7fd1220..bbe65dc 100644
|
||||
--- a/net/vmw_vsock/af_vsock.c
|
||||
+++ b/net/vmw_vsock/af_vsock.c
|
||||
@@ -1557,8 +1557,6 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
-
|
||||
while (total_written < len) {
|
||||
ssize_t written;
|
||||
|
||||
@@ -1578,7 +1576,9 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
goto out_wait;
|
||||
|
||||
release_sock(sk);
|
||||
+ prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
timeout = schedule_timeout(timeout);
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
lock_sock(sk);
|
||||
if (signal_pending(current)) {
|
||||
err = sock_intr_errno(timeout);
|
||||
@@ -1588,8 +1588,6 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
goto out_wait;
|
||||
}
|
||||
|
||||
- prepare_to_wait(sk_sleep(sk), &wait,
|
||||
- TASK_INTERRUPTIBLE);
|
||||
}
|
||||
|
||||
/* These checks occur both as part of and after the loop
|
||||
@@ -1635,7 +1633,6 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
||||
out_wait:
|
||||
if (total_written > 0)
|
||||
err = total_written;
|
||||
- finish_wait(sk_sleep(sk), &wait);
|
||||
out:
|
||||
release_sock(sk);
|
||||
return err;
|
||||
@@ -1716,7 +1713,6 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
- prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
|
||||
while (1) {
|
||||
s64 ready = vsock_stream_has_data(vsk);
|
||||
@@ -1727,7 +1723,7 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
*/
|
||||
|
||||
err = -ENOMEM;
|
||||
- goto out_wait;
|
||||
+ goto out;
|
||||
} else if (ready > 0) {
|
||||
ssize_t read;
|
||||
|
||||
@@ -1750,7 +1746,7 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
vsk, target, read,
|
||||
!(flags & MSG_PEEK), &recv_data);
|
||||
if (err < 0)
|
||||
- goto out_wait;
|
||||
+ goto out;
|
||||
|
||||
if (read >= target || flags & MSG_PEEK)
|
||||
break;
|
||||
@@ -1773,7 +1769,9 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
break;
|
||||
|
||||
release_sock(sk);
|
||||
+ prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
timeout = schedule_timeout(timeout);
|
||||
+ finish_wait(sk_sleep(sk), &wait);
|
||||
lock_sock(sk);
|
||||
|
||||
if (signal_pending(current)) {
|
||||
@@ -1783,9 +1781,6 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
err = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
-
|
||||
- prepare_to_wait(sk_sleep(sk), &wait,
|
||||
- TASK_INTERRUPTIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1816,8 +1811,6 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
||||
err = copied;
|
||||
}
|
||||
|
||||
-out_wait:
|
||||
- finish_wait(sk_sleep(sk), &wait);
|
||||
out:
|
||||
release_sock(sk);
|
||||
return err;
|
||||
--
|
||||
2.8.0.rc3
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 99f109b560a95f17f7d034a48c8479c37a685c5a Mon Sep 17 00:00:00 2001
|
||||
From a3f136168f164f66de1de277a08b76f54b289d5a Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
Date: Thu, 17 Dec 2015 11:10:21 +0800
|
||||
Subject: [PATCH 4/9] VSOCK: transport-specific vsock_transport functions
|
||||
@ -34,10 +34,10 @@ index e9eb2d6..23f5525 100644
|
||||
|
||||
void vsock_release_pending(struct sock *pending);
|
||||
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
|
||||
index bbe65dc..1e5f5ed 100644
|
||||
index 3dce53e..112fa8b 100644
|
||||
--- a/net/vmw_vsock/af_vsock.c
|
||||
+++ b/net/vmw_vsock/af_vsock.c
|
||||
@@ -1987,6 +1987,15 @@ void vsock_core_exit(void)
|
||||
@@ -2006,6 +2006,15 @@ void vsock_core_exit(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vsock_core_exit);
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
From ec05812c3fd57234fa8f7d211924b3c254988c89 Mon Sep 17 00:00:00 2001
|
||||
From 4018aa8a812fd6f1a64e3d227550bf5752127314 Mon Sep 17 00:00:00 2001
|
||||
From: Asias He <asias@redhat.com>
|
||||
Date: Thu, 13 Jun 2013 18:27:00 +0800
|
||||
Subject: [PATCH 5/9] VSOCK: Introduce virtio_vsock_common.ko
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 9e5562c5785843a8247d172112302fb8d1cdfcec Mon Sep 17 00:00:00 2001
|
||||
From ccaac837ceb4a9582bb57f71e0cac791f7336b19 Mon Sep 17 00:00:00 2001
|
||||
From: Asias He <asias@redhat.com>
|
||||
Date: Thu, 13 Jun 2013 18:28:48 +0800
|
||||
Subject: [PATCH 6/9] VSOCK: Introduce virtio_transport.ko
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 2da9f4eef909efa13574326bf29efab439bcc77c Mon Sep 17 00:00:00 2001
|
||||
From f52efbc874c742a671939ea6408c59545025007d Mon Sep 17 00:00:00 2001
|
||||
From: Asias He <asias@redhat.com>
|
||||
Date: Thu, 13 Jun 2013 18:29:21 +0800
|
||||
Subject: [PATCH 7/9] VSOCK: Introduce vhost_vsock.ko
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 4293a00ac211e20980a0739498a73aae4d8546bf Mon Sep 17 00:00:00 2001
|
||||
From e8c8f5299fd202db5d56a10f1dc0a4e464e9a211 Mon Sep 17 00:00:00 2001
|
||||
From: Asias He <asias@redhat.com>
|
||||
Date: Thu, 13 Jun 2013 18:30:19 +0800
|
||||
Subject: [PATCH 8/9] VSOCK: Add Makefile and Kconfig
|
||||
|
@ -1,4 +1,4 @@
|
||||
From 366c9c42afb9bd54f92f72518470c09e46f12e88 Mon Sep 17 00:00:00 2001
|
||||
From 550ec4c8f90f2bf99c1bcb13b2f8476780f42418 Mon Sep 17 00:00:00 2001
|
||||
From: Ian Campbell <ian.campbell@docker.com>
|
||||
Date: Mon, 4 Apr 2016 14:50:10 +0100
|
||||
Subject: [PATCH 9/9] VSOCK: Only allow host network namespace to use AF_VSOCK.
|
||||
@ -12,10 +12,10 @@ Signed-off-by: Ian Campbell <ian.campbell@docker.com>
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
|
||||
index 1e5f5ed..cdb3dd3 100644
|
||||
index 112fa8b..ead5127 100644
|
||||
--- a/net/vmw_vsock/af_vsock.c
|
||||
+++ b/net/vmw_vsock/af_vsock.c
|
||||
@@ -1840,6 +1840,9 @@ static const struct proto_ops vsock_stream_ops = {
|
||||
@@ -1859,6 +1859,9 @@ static const struct proto_ops vsock_stream_ops = {
|
||||
static int vsock_create(struct net *net, struct socket *sock,
|
||||
int protocol, int kern)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user