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>
This commit is contained in:

committed by
Damjan Marion

parent
b4f2525866
commit
81c09d03d8
@ -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 =
|
||||
|
Reference in New Issue
Block a user