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

