[PATCH 19.11] net/virtio-user: fix socket non-blocking mode

Yuan Wang yuanx.wang at intel.com
Thu Jul 14 19:09:58 CEST 2022


[ upstream commit 41f9a1757ffc010cc3debaad9a56af8ad88d0c6d ]

The virtio-user initialization requires unix socket to receive backend
messages in block mode. However, virtio_user_read_dev_config() sets
the same socket to nonblocking via fcntl, which affects all threads.
Enabling the rxq interrupt can causes both of these behaviors to occur
concurrently, with the result that the initialization may fail
because no messages are received in nonblocking socket.

Fix that by replacing O_NONBLOCK with the recv per-call option
MSG_DONTWAIT.

Fixes: ef53b6030039 ("net/virtio-user: support LSC")

Signed-off-by: Yuan Wang <yuanx.wang at intel.com>
Acked-by: Stephen Hemminger <stephen at networkplumber.org>
Reviewed-by: Chenbo Xia <chenbo.xia at intel.com>
---
 drivers/net/virtio/virtio_user_ethdev.c | 15 ++-------------
 1 file changed, 2 insertions(+), 13 deletions(-)

diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c
index 2fccf9fce..1c07caeb5 100644
--- a/drivers/net/virtio/virtio_user_ethdev.c
+++ b/drivers/net/virtio/virtio_user_ethdev.c
@@ -211,15 +211,9 @@ virtio_user_read_dev_config(struct virtio_hw *hw, size_t offset,
 
 		if (dev->vhostfd >= 0) {
 			int r;
-			int flags;
 
-			flags = fcntl(dev->vhostfd, F_GETFL);
-			if (fcntl(dev->vhostfd, F_SETFL,
-					flags | O_NONBLOCK) == -1) {
-				PMD_DRV_LOG(ERR, "error setting O_NONBLOCK flag");
-				return;
-			}
-			r = recv(dev->vhostfd, buf, 128, MSG_PEEK);
+			r = recv(dev->vhostfd, buf, 128,
+				       MSG_PEEK | MSG_DONTWAIT);
 			if (r == 0 || (r < 0 && errno != EAGAIN)) {
 				dev->net_status &= (~VIRTIO_NET_S_LINK_UP);
 				PMD_DRV_LOG(ERR, "virtio-user port %u is down",
@@ -235,11 +229,6 @@ virtio_user_read_dev_config(struct virtio_hw *hw, size_t offset,
 			} else {
 				dev->net_status |= VIRTIO_NET_S_LINK_UP;
 			}
-			if (fcntl(dev->vhostfd, F_SETFL,
-					flags & ~O_NONBLOCK) == -1) {
-				PMD_DRV_LOG(ERR, "error clearing O_NONBLOCK flag");
-				return;
-			}
 		} else if (dev->is_server) {
 			dev->net_status &= (~VIRTIO_NET_S_LINK_UP);
 			if (virtio_user_server_reconnect(dev) >= 0)
-- 
2.25.1



More information about the stable mailing list