linux-stable/net
Sunil Muthuswamy 820acbcdca hvsock: fix epollout hang from race condition
[ Upstream commit cb359b6041 ]

Currently, hvsock can enter into a state where epoll_wait on EPOLLOUT will
not return even when the hvsock socket is writable, under some race
condition. This can happen under the following sequence:
- fd = socket(hvsocket)
- fd_out = dup(fd)
- fd_in = dup(fd)
- start a writer thread that writes data to fd_out with a combination of
  epoll_wait(fd_out, EPOLLOUT) and
- start a reader thread that reads data from fd_in with a combination of
  epoll_wait(fd_in, EPOLLIN)
- On the host, there are two threads that are reading/writing data to the
  hvsocket

stack:
hvs_stream_has_space
hvs_notify_poll_out
vsock_poll
sock_poll
ep_poll

Race condition:
check for epollout from ep_poll():
	assume no writable space in the socket
	hvs_stream_has_space() returns 0
check for epollin from ep_poll():
	assume socket has some free space < HVS_PKT_LEN(HVS_SEND_BUF_SIZE)
	hvs_stream_has_space() will clear the channel pending send size
	host will not notify the guest because the pending send size has
		been cleared and so the hvsocket will never mark the
		socket writable

Now, the EPOLLOUT will never return even if the socket write buffer is
empty.

The fix is to set the pending size to the default size and never change it.
This way the host will always notify the guest whenever the writable space
is bigger than the pending size. The host is already optimized to *only*
notify the guest when the pending size threshold boundary is crossed and
not everytime.

This change also reduces the cpu usage somewhat since hv_stream_has_space()
is in the hotpath of send:
vsock_stream_sendmsg()->hv_stream_has_space()
Earlier hv_stream_has_space was setting/clearing the pending size on every
call.

Signed-off-by: Sunil Muthuswamy <sunilmut@microsoft.com>
Reviewed-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2019-07-31 07:28:48 +02:00
..
6lowpan
9p 9p/virtio: Add cleanup path in p9_virtio_init 2019-07-31 07:28:39 +02:00
802
8021q vlan: disable SIOCSHWTSTAMP in container 2019-05-16 19:42:34 +02:00
appletalk appletalk: Fix use-after-free in atalk_proc_exit 2019-04-20 09:15:07 +02:00
atm net: atm: Fix potential Spectre v1 vulnerabilities 2019-04-27 09:35:33 +02:00
ax25 ax25: fix inconsistent lock state in ax25_destroy_timer 2019-06-22 08:16:14 +02:00
batman-adv batman-adv: fix for leaked TVLV handler. 2019-07-31 07:28:19 +02:00
bluetooth Bluetooth: Add SMP workaround Microsoft Surface Precision Mouse bug 2019-07-31 07:28:43 +02:00
bpf
bridge net: bridge: stp: don't cache eth dest pointer before skb pull 2019-07-31 07:28:46 +02:00
caif caif: reduce stack size with KASAN 2019-05-08 07:20:45 +02:00
can can: af_can: Fix error path of can_init() 2019-07-21 09:04:22 +02:00
ceph libceph: wait for latest osdmap in ceph_monc_blacklist_add() 2019-03-27 14:13:51 +09:00
core tcp: fix tcp_set_congestion_control() use from bpf hook 2019-07-31 07:28:46 +02:00
dcb
dccp dccp: do not use ipv6 header for ipv4 flow 2019-04-03 06:25:08 +02:00
decnet
dns_resolver
dsa net: dsa: Fix error cleanup path in dsa_init_module 2019-05-16 19:42:34 +02:00
ethernet
hsr net/hsr: fix possible crash in add_timer() 2019-03-19 13:13:22 +01:00
ieee802154 ipv6: remove dependency of nf_defrag_ipv6 on ipv6 module 2019-04-27 09:35:40 +02:00
ife
ipv4 tcp: Reset bytes_acked and bytes_received when disconnecting 2019-07-31 07:28:46 +02:00
ipv6 netfilter: ipv6: nf_defrag: accept duplicate fragments again 2019-07-21 09:04:21 +02:00
ipx
iucv
kcm kcm: switch order of device registration to fix a crash 2019-04-17 08:37:45 +02:00
key af_key: fix leaks in key_pol_get_resp and dump_sp. 2019-07-31 07:28:21 +02:00
l2tp l2tp: fix infoleak in l2tp_ip6_recvmsg() 2019-03-19 13:13:22 +01:00
l3mdev
lapb lapb: fixed leak of control-blocks. 2019-06-22 08:16:14 +02:00
llc llc: fix skb leak in llc_build_and_send_ui_pkt() 2019-06-09 09:18:10 +02:00
mac80211 mac80211: only warn once on chanctx_conf being NULL 2019-07-21 09:04:25 +02:00
mac802154
mpls mpls: Return error for RTA_GATEWAY attribute 2019-03-13 14:03:09 -07:00
ncsi
netfilter net: make skb_dst_force return true when dst is refcounted 2019-07-31 07:28:46 +02:00
netlabel netlabel: fix out-of-bounds memory accesses 2019-03-13 14:03:08 -07:00
netlink genetlink: Fix a memory leak on error path 2019-04-03 06:25:08 +02:00
netrom netrom: hold sock when setting skb->destructor 2019-07-31 07:28:46 +02:00
nfc nfc: fix potential illegal memory access 2019-07-31 07:28:45 +02:00
nsh
openvswitch net: openvswitch: fix csum updates for MPLS actions 2019-07-31 07:28:45 +02:00
packet net/packet: fix memory leak in packet_set_ring() 2019-07-03 13:16:01 +02:00
phonet phonet: fix building with clang 2019-03-23 14:35:16 +01:00
psample
qrtr
rds net: rds: fix memory leak in rds_ib_flush_mr_pool 2019-06-11 12:21:45 +02:00
rfkill
rose net/rose: fix unbound loop in rose_loopback_timer() 2019-05-02 09:40:34 +02:00
rxrpc rxrpc: Fix send on a connected, but unbound socket 2019-07-31 07:28:45 +02:00
sched net_sched: fix two more memory leaks in cls_tcindex 2019-05-16 19:42:30 +02:00
sctp sctp: change to hold sk after auth shkey is created successfully 2019-07-03 13:16:02 +02:00
smc
strparser
sunrpc net :sunrpc :clnt :Fix xps refcount imbalance on the error path 2019-07-21 09:04:29 +02:00
switchdev
tipc tipc: pass tunnel dev as NULL to udp_tunnel(6)_xmit_skb 2019-07-03 13:16:03 +02:00
tls
unix missing barriers in some of unix_sock ->addr and ->path accesses 2019-03-19 13:13:24 +01:00
vmw_vsock hvsock: fix epollout hang from race condition 2019-07-31 07:28:48 +02:00
wimax
wireless cfg80211: fix memory leak of wiphy device name 2019-06-25 11:36:54 +08:00
x25 net/x25: fix a race in x25_bind() 2019-03-19 13:13:23 +01:00
xfrm ipsec: select crypto ciphers for xfrm_algo 2019-07-31 07:28:27 +02:00
compat.c
Kconfig
Makefile
socket.c net: socket: set sock->sk to NULL after calling proto_ops::release() 2019-03-13 14:03:09 -07:00
sysctl_net.c