From 1f6784d2e839f81749d21ad1b615a9f7bb0e64d6 Mon Sep 17 00:00:00 2001 From: Haiqing Bai Date: Thu, 24 Oct 2019 10:33:04 +0800 Subject: unfs3: fixed the issue that unfsd consumes 100% CPU The 'accept' function on the socket of unfsd daemon is always in below error state: accept(4, 0x7ffd5e6dddc0, [128]) = -1 EINVAL (Invalid argument) accept(6, 0x7ffd5e6dddc0, [128]) = -1 EINVAL (Invalid argument) And 'strace -c -p ' shows: % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 70.87 0.005392 0 513886 513886 accept 29.13 0.002216 0 256943 poll This error state is in the 'for' loop of the daemon, so it consumes 100% CPU. The reason is that 'listen' is not called for the TCP socket before 'accept'. Actually the called 'svc_tli_create' from libtirpc will not call 'listen' on a bound socket. Signed-off-by: Haiqing Bai Signed-off-by: Richard Purdie --- .../0001-Add-listen-action-for-a-tcp-socket.patch | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 meta/recipes-devtools/unfs3/unfs3/0001-Add-listen-action-for-a-tcp-socket.patch (limited to 'meta/recipes-devtools/unfs3/unfs3') diff --git a/meta/recipes-devtools/unfs3/unfs3/0001-Add-listen-action-for-a-tcp-socket.patch b/meta/recipes-devtools/unfs3/unfs3/0001-Add-listen-action-for-a-tcp-socket.patch new file mode 100644 index 0000000000..e9b9d3df46 --- /dev/null +++ b/meta/recipes-devtools/unfs3/unfs3/0001-Add-listen-action-for-a-tcp-socket.patch @@ -0,0 +1,54 @@ +From b42ab8e1aca951dd06c113159491b3fd5cf06f2e Mon Sep 17 00:00:00 2001 +From: Haiqing Bai +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 +--- + 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 + -- cgit 1.2.3-korg