From 3ce4bd5ec8645f21e22f0ac02de9767010368312 Mon Sep 17 00:00:00 2001 From: Stefano Garzarella Date: Tue, 16 Jun 2020 12:09:16 +0200 Subject: [PATCH] vsock: absorb spurious EPOLLOUT events This patch has been cherry-picked from the Firecracker tree. The reference commit is 109e631566350867dafa4b16c3919dfd1533eeea. This commit changes the vsock connection state machine behavior to absorb any EWOULDBLOCK errors recevied while handling an EPOLLOUT event. Previously, this condition would lead to immediate connection termination. Signed-off-by: Dan Horobeanu Signed-off-by: Gabriel Ionescu Signed-off-by: Stefano Garzarella --- vm-virtio/src/vsock/csm/connection.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/vm-virtio/src/vsock/csm/connection.rs b/vm-virtio/src/vsock/csm/connection.rs index 0c143318c..4735b4b27 100644 --- a/vm-virtio/src/vsock/csm/connection.rs +++ b/vm-virtio/src/vsock/csm/connection.rs @@ -454,7 +454,13 @@ where "vsock: error flushing TX buf for (lp={}, pp={}): {:?}", self.local_port, self.peer_port, err ); - self.kill(); + match err { + Error::TxBufFlush(inner) if inner.kind() == ErrorKind::WouldBlock => { + // This should never happen (EWOULDBLOCK after EPOLLOUT), but + // it does, so let's absorb it. + } + _ => self.kill(), + }; 0 }); self.fwd_cnt += Wrapping(flushed as u32);