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