blob: e9b9d3df4690c7594ce07430e1536ee076a4da99 [file] [log] [blame]
From b42ab8e1aca951dd06c113159491b3fd5cf06f2e Mon Sep 17 00:00:00 2001
From: Haiqing Bai <Haiqing.Bai@windriver.com>
Date: Thu, 24 Oct 2019 09:39:04 +0800
Subject: [PATCH] Add "listen" action for a tcp socket which does not call
'listen' after 'bind'
It is found that /usr/bin/unfsd customus 100% cpu after starting qemu with 'nfs'
option, and below lots of error messages shows when strace the process:
poll([{fd=3, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND},{fd=4, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND},
{fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND},{fd=6, events =POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}],
4, 2000) = 2 ([{fd=4, revents=POLLHUP},{fd=6, revents=POLLHUP}])
accept(4, 0x7ffd5e6dddc0, [128]) = -1 EINVAL (Invalid argument)
accept(6, 0x7ffd5e6dddc0, [128]) = -1 EINVAL (Invalid argument)
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
70.87 0.005392 0 513886 513886 accept
29.13 0.002216 0 256943 poll
0.00 0.000000 0 4 read
The root cause is that 'listen' is not called for the binded
socket. The depended libtipc does not call 'listen' if found
the incomming socket is binded, so 'accept' reports the error
in the 'for' loop and cpu consumed.
Upstream-Status: Pending
Signed-off-by: Haiqing Bai <Haiqing.Bai@windriver.com>
---
daemon.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/daemon.c b/daemon.c
index 028a181..4c85903 100644
--- a/daemon.c
+++ b/daemon.c
@@ -814,6 +814,13 @@ static SVCXPRT *create_tcp_transport(unsigned int port)
fprintf(stderr, "Couldn't bind to tcp port %d\n", port);
exit(1);
}
+
+ if (listen(sock, SOMAXCONN) < 0) {
+ perror("listen");
+ fprintf(stderr, "Couldn't listen on the address \n");
+ close(sock);
+ exit(1);
+ }
}
transp = svctcp_create(sock, 0, 0);
--
1.9.1