[CRIU] [PATCH cr 1/2] sk-queue: don't block on restore of socket queues

Andrey Vagin avagin at openvz.org
Fri Sep 28 12:37:19 EDT 2012


If a socket queue doesn't have a free space, a error should be returned,
because nobody reads this socket.

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 sk-queue.c                     |   17 ++++++++++++++++-
 sockets.c                      |    1 +
 test/zdtm/live/static/Makefile |    1 +
 3 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/sk-queue.c b/sk-queue.c
index 347f987..6cc2153 100644
--- a/sk-queue.c
+++ b/sk-queue.c
@@ -189,10 +189,20 @@ void show_sk_queues(int fd, struct cr_options *o)
 int restore_sk_queue(int fd, unsigned int peer_id)
 {
 	struct sk_packet *pkt, *tmp;
-	int ret, img_fd;
+	int ret, img_fd, flags;
 
 	pr_info("Trying to restore recv queue for %u\n", peer_id);
 
+	flags = fcntl(fd, F_GETFL, 0);
+	if (flags == -1) {
+		pr_perror("Unable to get flags for %d", fd);
+		return -1;
+	}
+	if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) ) {
+		pr_perror("Unable to set O_NONBLOCK for %d", fd);
+		return -1;
+	}
+
 	img_fd = open_image_ro(CR_FD_SK_QUEUES);
 	if (img_fd < 0)
 		return -1;
@@ -221,6 +231,11 @@ int restore_sk_queue(int fd, unsigned int peer_id)
 		xfree(pkt);
 	}
 
+	if (fcntl(fd, F_SETFL, flags) ) {
+		pr_perror("Unable to restore flags for %d", fd);
+		return -1;
+	}
+
 	close(img_fd);
 	return 0;
 }
diff --git a/sockets.c b/sockets.c
index 739e98f..50bd058 100644
--- a/sockets.c
+++ b/sockets.c
@@ -75,6 +75,7 @@ int restore_socket_opts(int sk, SkOptsEntry *soe)
 	int ret = 0;
 	struct timeval tv;
 
+	pr_info("%d restore sndbuf %d rcv buf %d\n", sk, soe->so_sndbuf, soe->so_rcvbuf);
 	ret |= restore_opt(sk, SOL_SOCKET, SO_SNDBUFFORCE, &soe->so_sndbuf);
 	ret |= restore_opt(sk, SOL_SOCKET, SO_RCVBUFFORCE, &soe->so_rcvbuf);
 
diff --git a/test/zdtm/live/static/Makefile b/test/zdtm/live/static/Makefile
index 072ec1e..f23c4cd 100644
--- a/test/zdtm/live/static/Makefile
+++ b/test/zdtm/live/static/Makefile
@@ -40,6 +40,7 @@ TST_NOFILE	=				\
 		sockets_spair			\
 		sockets_dgram			\
 		socket_queues			\
+		socket_queues02			\
 		socket-tcp			\
 		ipc_namespace			\
 		selfexe00			\
-- 
1.7.1



More information about the CRIU mailing list