On 10/23/19 7:33 PM, Haiqing Bai wrote:
> 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)
with backport to zeus?
>
> 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.
>
> Signed-off-by: Haiqing Bai <haiqing....@windriver.com>
> ---
> .../0001-Add-listen-action-for-a-tcp-socket.patch | 54
> ++++++++++++++++++++++
> meta/recipes-devtools/unfs3/unfs3_git.bb | 1 +
> 2 files changed, 55 insertions(+)
> create mode 100644
> meta/recipes-devtools/unfs3/unfs3/0001-Add-listen-action-for-a-tcp-socket.patch
>
> 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 0000000..e9b9d3d
> --- /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 <haiqing....@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....@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
> +
> diff --git a/meta/recipes-devtools/unfs3/unfs3_git.bb
> b/meta/recipes-devtools/unfs3/unfs3_git.bb
> index 79d0978..d60cee8 100644
> --- a/meta/recipes-devtools/unfs3/unfs3_git.bb
> +++ b/meta/recipes-devtools/unfs3/unfs3_git.bb
> @@ -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>.+)"
--
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core