mirror of
https://git.yoctoproject.org/poky
synced 2026-06-01 13:09:50 +00:00
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 <the pid of unfsd>' 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. (From OE-Core rev: 1f6784d2e839f81749d21ad1b615a9f7bb0e64d6) Signed-off-by: Haiqing Bai <Haiqing.Bai@windriver.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
85903df1c1
commit
6d77529d62
@@ -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
|
||||
|
||||
@@ -23,6 +23,7 @@ SRC_URI = "git://github.com/unfs3/unfs3.git;protocol=https \
|
||||
file://tcp_no_delay.patch \
|
||||
file://0001-daemon.c-Libtirpc-porting-fixes.patch \
|
||||
file://0001-attr-fix-utime-for-symlink.patch \
|
||||
file://0001-Add-listen-action-for-a-tcp-socket.patch \
|
||||
"
|
||||
SRCREV = "c12a5c69a8d59be6916cbd0e0f41c159f1962425"
|
||||
UPSTREAM_CHECK_GITTAGREGEX = "unfs3\-(?P<pver>.+)"
|
||||
|
||||
Reference in New Issue
Block a user