diff options
author | Andrew Yourtchenko <ayourtch@gmail.com> | 2017-01-03 12:44:15 +0000 |
---|---|---|
committer | Damjan Marion <dmarion.lists@gmail.com> | 2017-01-03 15:15:27 +0000 |
commit | 81c09d03d8d8f37867f776ecf29a6c205883c4d9 (patch) | |
tree | 6a97c987d839d95d4b2adea00fe29dd14bb5a910 | |
parent | b4f252586690ad07c909b9e7aa2f401a848d641c (diff) |
VPP-574: fix VPP hang during security group configuration on a suspended VM
The unix connect() in vhost-user driver in VPP is blocking, and
a non-expedient accept() on the other side causes the entire VPP to hang.
Solution: set the nonblocking flag for the socket fd before calling
connect(), and set the socket back to blocking after the accept() succeeds.
Change-Id: I2d535ea9b95a92922d305d79a8d860062c95faf4
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
-rw-r--r-- | vnet/vnet/devices/virtio/vhost-user.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/vnet/vnet/devices/virtio/vhost-user.c b/vnet/vnet/devices/virtio/vhost-user.c index bde8106c501..fa64f102311 100644 --- a/vnet/vnet/devices/virtio/vhost-user.c +++ b/vnet/vnet/devices/virtio/vhost-user.c @@ -2325,9 +2325,13 @@ vhost_user_process (vlib_main_t * vm, strncpy (sun.sun_path, (char *) vui->sock_filename, sizeof (sun.sun_path) - 1); + /* Avoid hanging VPP if the other end does not accept */ + fcntl(sockfd, F_SETFL, O_NONBLOCK); if (connect (sockfd, (struct sockaddr *) &sun, sizeof (struct sockaddr_un)) == 0) { + /* Set the socket to blocking as it was before */ + fcntl(sockfd, F_SETFL, 0); vui->sock_errno = 0; template.file_descriptor = sockfd; template.private_data = |