From owner-svn-src-head@freebsd.org Thu Nov 29 05:08:47 2018 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 973C0114FCB8; Thu, 29 Nov 2018 05:08:47 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 3AE927375B; Thu, 29 Nov 2018 05:08:47 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 18AA514EA7; Thu, 29 Nov 2018 05:08:47 +0000 (UTC) (envelope-from mjg@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id wAT58kFW073604; Thu, 29 Nov 2018 05:08:46 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id wAT58kPR073602; Thu, 29 Nov 2018 05:08:46 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <201811290508.wAT58kPR073602@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mjg set sender to mjg@FreeBSD.org using -f From: Mateusz Guzik Date: Thu, 29 Nov 2018 05:08:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r341181 - in head/sys: kern sys X-SVN-Group: head X-SVN-Commit-Author: mjg X-SVN-Commit-Paths: in head/sys: kern sys X-SVN-Commit-Revision: 341181 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 3AE927375B X-Spamd-Result: default: False [1.28 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_SPAM_LONG(0.51)[0.511,0]; NEURAL_SPAM_SHORT(0.46)[0.458,0]; NEURAL_SPAM_MEDIUM(0.31)[0.308,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US] X-Rspamd-Server: mx1.freebsd.org X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 29 Nov 2018 05:08:47 -0000 Author: mjg Date: Thu Nov 29 05:08:46 2018 New Revision: 341181 URL: https://svnweb.freebsd.org/changeset/base/341181 Log: Deinline racct throttling out of syscall exit path. racct is not enabled by default and even when it is enabled processes are typically not throttled. The order of checks is left unchanged since racct_enable will be annotated as __read_frequently, while checking for the flag in the processes would probably require an extra fetch. Sponsored by: The FreeBSD Foundation Modified: head/sys/kern/kern_racct.c head/sys/kern/subr_trap.c head/sys/sys/racct.h Modified: head/sys/kern/kern_racct.c ============================================================================== --- head/sys/kern/kern_racct.c Thu Nov 29 04:48:22 2018 (r341180) +++ head/sys/kern/kern_racct.c Thu Nov 29 05:08:46 2018 (r341181) @@ -1087,6 +1087,22 @@ racct_move(struct racct *dest, struct racct *src) RACCT_UNLOCK(); } +void +racct_proc_throttled(struct proc *p) +{ + + ASSERT_RACCT_ENABLED(); + + PROC_LOCK(p); + while (p->p_throttled != 0) { + msleep(p->p_racct, &p->p_mtx, 0, "racct", + p->p_throttled < 0 ? 0 : p->p_throttled); + if (p->p_throttled > 0) + p->p_throttled = 0; + } + PROC_UNLOCK(p); +} + /* * Make the process sleep in userret() for 'timeout' ticks. Setting * timeout to -1 makes it sleep until woken up by racct_proc_wakeup(). Modified: head/sys/kern/subr_trap.c ============================================================================== --- head/sys/kern/subr_trap.c Thu Nov 29 04:48:22 2018 (r341180) +++ head/sys/kern/subr_trap.c Thu Nov 29 05:08:46 2018 (r341181) @@ -198,16 +198,8 @@ userret(struct thread *td, struct trapframe *frame) (td->td_vnet_lpush != NULL) ? td->td_vnet_lpush : "N/A")); #endif #ifdef RACCT - if (racct_enable && p->p_throttled != 0) { - PROC_LOCK(p); - while (p->p_throttled != 0) { - msleep(p->p_racct, &p->p_mtx, 0, "racct", - p->p_throttled < 0 ? 0 : p->p_throttled); - if (p->p_throttled > 0) - p->p_throttled = 0; - } - PROC_UNLOCK(p); - } + if (__predict_false(racct_enable && p->p_throttled != 0)) + racct_proc_throttled(p); #endif } Modified: head/sys/sys/racct.h ============================================================================== --- head/sys/sys/racct.h Thu Nov 29 04:48:22 2018 (r341180) +++ head/sys/sys/racct.h Thu Nov 29 05:08:46 2018 (r341181) @@ -194,6 +194,7 @@ void racct_proc_exit(struct proc *p); void racct_proc_ucred_changed(struct proc *p, struct ucred *oldcred, struct ucred *newcred); void racct_move(struct racct *dest, struct racct *src); +void racct_proc_throttled(struct proc *p); void racct_proc_throttle(struct proc *p, int timeout); #else