VPP-574: fix VPP hang during security group configuration on a suspended VM 26/4526/2
authorAndrew Yourtchenko <ayourtch@gmail.com>
Tue, 3 Jan 2017 12:44:15 +0000 (12:44 +0000)
committerDamjan Marion <dmarion.lists@gmail.com>
Tue, 3 Jan 2017 15:15:27 +0000 (15:15 +0000)
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>
vnet/vnet/devices/virtio/vhost-user.c

index bde8106..fa64f10 100644 (file)
@@ -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 =