|
@@ -0,0 +1,54 @@
|
|
|
+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
|
|
|
+
|