summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wendler <polynomial-c@gentoo.org>2018-09-18 10:54:01 +0200
committerLars Wendler <polynomial-c@gentoo.org>2018-09-18 10:54:01 +0200
commitb97ff58fca5ce104dbc558200389dd6ddda9e64e (patch)
tree144db05bef9b6db992c30ac6135e9d923f584316 /sys-fs/quota/files
parentnet-ftp/filezilla: Bump to version 3.37.0 (diff)
downloadgentoo-b97ff58fca5ce104dbc558200389dd6ddda9e64e.tar.gz
gentoo-b97ff58fca5ce104dbc558200389dd6ddda9e64e.tar.bz2
gentoo-b97ff58fca5ce104dbc558200389dd6ddda9e64e.zip
sys-fs/quota: Fixed high CPU usage with USE="rpc".
Closes: https://bugs.gentoo.org/658022 Package-Manager: Portage-2.3.49, Repoman-2.3.10
Diffstat (limited to 'sys-fs/quota/files')
-rw-r--r--sys-fs/quota/files/quota-4.04-Listen-on-a-TCP-socket.patch77
1 files changed, 77 insertions, 0 deletions
diff --git a/sys-fs/quota/files/quota-4.04-Listen-on-a-TCP-socket.patch b/sys-fs/quota/files/quota-4.04-Listen-on-a-TCP-socket.patch
new file mode 100644
index 000000000000..cf1bd4aad32f
--- /dev/null
+++ b/sys-fs/quota/files/quota-4.04-Listen-on-a-TCP-socket.patch
@@ -0,0 +1,77 @@
+From 31ecd29b3b3f51145fd78f63087c10e9fcadf999 Mon Sep 17 00:00:00 2001
+From: Steve Dickson <steved@redhat.com>
+Date: Tue, 22 May 2018 12:41:59 +0200
+Subject: [PATCH] Listen on a TCP socket
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+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>
+---
+ svc_socket.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+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;
+ }
+
+--
+2.14.3
+