summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Dickson <steved@redhat.com>2018-05-22 12:41:59 +0200
committerJan Kara <jack@suse.cz>2018-05-28 17:57:36 +0200
commit77440bd389425a9a79265f52783e6d39535f199f (patch)
treed462d57a7b4efb57db57a73e5d63562e224fca47
parenta92dcf5a6cc49660d75a67966b0eb093b88e3b4c (diff)
Listen on a TCP socket
rpc.rquotad spins in libtirpc's rendezvous_request() on accepting TCP connections because the polled TCP socket is not listening: poll([{fd=4, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=5, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=6, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 4, -1) = 2 ([{fd=5, revents=POLLHUP}, {fd=7, revents=POLLHUP}]) accept(5, 0x7ffe61698700, [128]) = -1 EINVAL (Invalid argument) accept(7, 0x7ffe61698700, [128]) = -1 EINVAL (Invalid argument) The polled descriptors are: rpc.rquot 21981 root 4u IPv4 80449159 0t0 UDP *:rquotad rpc.rquot 21981 root 5u sock 0,9 0t0 80449162 protocol: TCP rpc.rquot 21981 root 6u IPv6 80449165 0t0 UDP *:rquotad rpc.rquot 21981 root 7u sock 0,9 0t0 80449168 protocol: TCPv6 That results into a high CPU usage just after staring rpc.rquotad process. This patch adds a listen() call to svc_create_sock() routine which is needed with libtirpc version of svc_tli_create() as well as a needed IPv6 setsockopt(). Signed-off-by: Petr Písař <ppisar@redhat.com> Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r--svc_socket.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/svc_socket.c b/svc_socket.c
index 8a44604..d2e3abf 100644
--- a/svc_socket.c
+++ b/svc_socket.c
@@ -118,6 +118,15 @@ static int svc_create_sock(struct addrinfo *ai)
return -1;
}
+ if (ai->ai_family == AF_INET6) {
+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
+ &optval, sizeof(optval)) < 0) {
+ errstr(_("Cannot set IPv6 socket options: %s\n"), strerror(errno));
+ close(fd);
+ return -1;
+ }
+ }
+
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
errstr(_("Cannot set socket options: %s\n"), strerror(errno));
close(fd);
@@ -129,6 +138,15 @@ static int svc_create_sock(struct addrinfo *ai)
close(fd);
return -1;
}
+
+ if (ai->ai_protocol == IPPROTO_TCP) {
+ if (listen(fd, SOMAXCONN) < 0) {
+ errstr(_("Cannot listen to address: %s\n"), strerror(errno));
+ close(fd);
+ return -1;
+ }
+ }
+
return fd;
}