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
|