diff options
author | Lars Wendler <polynomial-c@gentoo.org> | 2018-09-18 10:54:01 +0200 |
---|---|---|
committer | Lars Wendler <polynomial-c@gentoo.org> | 2018-09-18 10:54:01 +0200 |
commit | b97ff58fca5ce104dbc558200389dd6ddda9e64e (patch) | |
tree | 144db05bef9b6db992c30ac6135e9d923f584316 /sys-fs/quota | |
parent | net-ftp/filezilla: Bump to version 3.37.0 (diff) | |
download | gentoo-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')
-rw-r--r-- | sys-fs/quota/files/quota-4.04-Listen-on-a-TCP-socket.patch | 77 | ||||
-rw-r--r-- | sys-fs/quota/quota-4.04-r2.ebuild | 82 |
2 files changed, 159 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 + diff --git a/sys-fs/quota/quota-4.04-r2.ebuild b/sys-fs/quota/quota-4.04-r2.ebuild new file mode 100644 index 000000000000..a6080157d8e6 --- /dev/null +++ b/sys-fs/quota/quota-4.04-r2.ebuild @@ -0,0 +1,82 @@ +# Copyright 1999-2018 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 + +inherit autotools + +DESCRIPTION="Linux quota tools" +HOMEPAGE="https://sourceforge.net/projects/linuxquota/" +SRC_URI="mirror://sourceforge/linuxquota/${P}.tar.gz" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~sparc ~x86" +IUSE="ldap netlink nls rpc tcpd" + +RDEPEND=" + ldap? ( >=net-nds/openldap-2.3.35 ) + netlink? ( + sys-apps/dbus + dev-libs/libnl:3 + ) + rpc? ( + net-nds/rpcbind + elibc_glibc? ( sys-libs/glibc[-rpc(-)] ) + net-libs/libtirpc + net-libs/rpcsvc-proto + ) + tcpd? ( sys-apps/tcp-wrappers ) +" +DEPEND=" + ${RDEPEND} + nls? ( sys-devel/gettext ) +" + +PATCHES=( + "${FILESDIR}/${P}-glibc226.patch" + "${FILESDIR}/${P}-Listen-on-a-TCP-socket.patch" +) + +src_prepare() { + default + eautoreconf +} + +src_configure() { + local myeconfargs=( + --docdir="${EPREFIX%/}/usr/share/doc/${PF}" + $(use_enable nls) + $(use_enable ldap ldapmail) + $(use_enable netlink) + $(use_enable rpc) + $(use_enable rpc rpcsetquota) + ) + econf "${myeconfargs[@]}" +} + +src_install() { + emake DESTDIR="${D}" install + dodoc doc/* README.* Changelog + + insinto /etc + insopts -m0644 + doins warnquota.conf quotatab + + newinitd "${FILESDIR}"/quota.rc7 quota + newconfd "${FILESDIR}"/quota.confd quota + + if use rpc ; then + newinitd "${FILESDIR}"/rpc.rquotad.initd rpc.rquotad + fi + + if use ldap ; then + insinto /etc/openldap/schema + insopts -m0644 + doins "${FILESDIR}"/ldap-scripts/quota.schema + + exeinto /usr/share/quota/ldap-scripts + doexe "${FILESDIR}"/ldap-scripts/*.pl + doexe "${FILESDIR}"/ldap-scripts/edquota_editor + fi +} |