Blame SOURCES/quota-4.04-Listen-on-a-TCP-socket.patch

273bc0
From 31ecd29b3b3f51145fd78f63087c10e9fcadf999 Mon Sep 17 00:00:00 2001
273bc0
From: Steve Dickson <steved@redhat.com>
273bc0
Date: Tue, 22 May 2018 12:41:59 +0200
273bc0
Subject: [PATCH] Listen on a TCP socket
273bc0
MIME-Version: 1.0
273bc0
Content-Type: text/plain; charset=UTF-8
273bc0
Content-Transfer-Encoding: 8bit
273bc0
273bc0
rpc.rquotad spins in libtirpc's rendezvous_request() on accepting TCP
273bc0
connections because the polled TCP socket is not listening:
273bc0
273bc0
poll([{fd=4, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=5,
273bc0
  events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=6,
273bc0
  events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}, {fd=7,
273bc0
  events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 4, -1) = 2 ([{fd=5,
273bc0
  revents=POLLHUP}, {fd=7, revents=POLLHUP}])
273bc0
accept(5, 0x7ffe61698700, [128])        = -1 EINVAL (Invalid argument)
273bc0
accept(7, 0x7ffe61698700, [128])        = -1 EINVAL (Invalid argument)
273bc0
273bc0
The polled descriptors are:
273bc0
273bc0
rpc.rquot 21981 root    4u  IPv4 80449159      0t0      UDP *:rquotad
273bc0
rpc.rquot 21981 root    5u  sock      0,9      0t0 80449162 protocol: TCP
273bc0
rpc.rquot 21981 root    6u  IPv6 80449165      0t0      UDP *:rquotad
273bc0
rpc.rquot 21981 root    7u  sock      0,9      0t0 80449168 protocol: TCPv6
273bc0
273bc0
That results into a high CPU usage just after staring rpc.rquotad
273bc0
process.
273bc0
273bc0
This patch adds a listen() call to svc_create_sock()
273bc0
routine which is needed with libtirpc version of svc_tli_create()
273bc0
as well as a needed IPv6 setsockopt().
273bc0
273bc0
Signed-off-by: Petr Písař <ppisar@redhat.com>
273bc0
---
273bc0
 svc_socket.c | 18 ++++++++++++++++++
273bc0
 1 file changed, 18 insertions(+)
273bc0
273bc0
diff --git a/svc_socket.c b/svc_socket.c
273bc0
index 8a44604..d2e3abf 100644
273bc0
--- a/svc_socket.c
273bc0
+++ b/svc_socket.c
273bc0
@@ -118,6 +118,15 @@ static int svc_create_sock(struct addrinfo *ai)
273bc0
 		return -1;
273bc0
 	}
273bc0
 
273bc0
+	if (ai->ai_family == AF_INET6) {
273bc0
+		if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY,
273bc0
+				&optval, sizeof(optval)) < 0) {
273bc0
+			errstr(_("Cannot set IPv6 socket options: %s\n"), strerror(errno));
273bc0
+			close(fd);
273bc0
+			return -1;
273bc0
+		}
273bc0
+	}
273bc0
+
273bc0
 	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
273bc0
 		errstr(_("Cannot set socket options: %s\n"), strerror(errno));
273bc0
 		close(fd);
273bc0
@@ -129,6 +138,15 @@ static int svc_create_sock(struct addrinfo *ai)
273bc0
 		close(fd);
273bc0
 		return -1;
273bc0
 	}
273bc0
+
273bc0
+	if (ai->ai_protocol == IPPROTO_TCP) {
273bc0
+		if (listen(fd, SOMAXCONN) < 0) {
273bc0
+			errstr(_("Cannot listen to address: %s\n"), strerror(errno));
273bc0
+			close(fd);
273bc0
+			return -1;
273bc0
+		}
273bc0
+	}
273bc0
+
273bc0
 	return fd;
273bc0
 }
273bc0
 
273bc0
-- 
273bc0
2.14.3
273bc0