From owner-svn-src-head@freebsd.org Thu Nov 29 02:52:10 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 39CCD1149B00; Thu, 29 Nov 2018 02:52:10 +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 D25826EB54; Thu, 29 Nov 2018 02:52:09 +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 993B2136F6; Thu, 29 Nov 2018 02:52:09 +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 wAT2q9Vb004205; Thu, 29 Nov 2018 02:52:09 GMT (envelope-from mjg@FreeBSD.org) Received: (from mjg@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id wAT2q8GQ004200; Thu, 29 Nov 2018 02:52:08 GMT (envelope-from mjg@FreeBSD.org) Message-Id: <201811290252.wAT2q8GQ004200@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 02:52:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r341176 - 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: 341176 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: D25826EB54 X-Spamd-Result: default: False [1.60 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_SPAM_LONG(0.51)[0.511,0]; NEURAL_SPAM_MEDIUM(0.31)[0.308,0]; NEURAL_SPAM_SHORT(0.78)[0.783,0] 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 02:52:10 -0000 Author: mjg Date: Thu Nov 29 02:52:08 2018 New Revision: 341176 URL: https://svnweb.freebsd.org/changeset/base/341176 Log: proc: create a dedicated lock for zombproc to ligthen the load on allproc_lock waitpid always takes proctree to evaluate the list, but only takes allproc if it can reap. With this patch allproc is no longer taken, which helps during poudriere -j 128. Discussed with: kib Sponsored by: The FreeBSD Foundation Modified: head/sys/kern/kern_exit.c head/sys/kern/kern_fork.c head/sys/kern/kern_proc.c head/sys/kern/kern_racct.c head/sys/sys/proc.h Modified: head/sys/kern/kern_exit.c ============================================================================== --- head/sys/kern/kern_exit.c Thu Nov 29 01:31:12 2018 (r341175) +++ head/sys/kern/kern_exit.c Thu Nov 29 02:52:08 2018 (r341176) @@ -432,8 +432,10 @@ exit1(struct thread *td, int rval, int signo) * Move proc from allproc queue to zombproc. */ sx_xlock(&allproc_lock); + sx_xlock(&zombproc_lock); LIST_REMOVE(p, p_list); LIST_INSERT_HEAD(&zombproc, p, p_list); + sx_xunlock(&zombproc_lock); sx_xunlock(&allproc_lock); /* @@ -871,9 +873,9 @@ proc_reap(struct thread *td, struct proc *p, int *stat * Remove other references to this process to ensure we have an * exclusive reference. */ - sx_xlock(&allproc_lock); + sx_xlock(&zombproc_lock); LIST_REMOVE(p, p_list); /* off zombproc */ - sx_xunlock(&allproc_lock); + sx_xunlock(&zombproc_lock); sx_xlock(PIDHASHLOCK(p->p_pid)); LIST_REMOVE(p, p_hash); sx_xunlock(PIDHASHLOCK(p->p_pid)); Modified: head/sys/kern/kern_fork.c ============================================================================== --- head/sys/kern/kern_fork.c Thu Nov 29 01:31:12 2018 (r341175) +++ head/sys/kern/kern_fork.c Thu Nov 29 02:52:08 2018 (r341176) @@ -238,6 +238,7 @@ fork_findpid(int flags) struct proc *p; int trypid; static int pidchecked = 0; + bool locked_zomb = false; /* * Requires allproc_lock in order to iterate over the list @@ -318,6 +319,10 @@ again: } if (!doingzomb) { doingzomb = 1; + if (!locked_zomb) { + sx_slock(&zombproc_lock); + locked_zomb = true; + } p = LIST_FIRST(&zombproc); goto again; } @@ -330,6 +335,9 @@ again: pidchecked = 0; else lastpid = trypid; + + if (locked_zomb) + sx_sunlock(&zombproc_lock); return (trypid); } Modified: head/sys/kern/kern_proc.c ============================================================================== --- head/sys/kern/kern_proc.c Thu Nov 29 01:31:12 2018 (r341175) +++ head/sys/kern/kern_proc.c Thu Nov 29 02:52:08 2018 (r341176) @@ -125,6 +125,7 @@ u_long pgrphash; struct proclist allproc; struct proclist zombproc; struct sx __exclusive_cache_line allproc_lock; +struct sx __exclusive_cache_line zombproc_lock; struct sx __exclusive_cache_line proctree_lock; struct mtx __exclusive_cache_line ppeers_lock; uma_zone_t proc_zone; @@ -177,6 +178,7 @@ procinit(void) u_long i; sx_init(&allproc_lock, "allproc"); + sx_init(&zombproc_lock, "zombproc"); sx_init(&proctree_lock, "proctree"); mtx_init(&ppeers_lock, "p_peers", NULL, MTX_DEF); LIST_INIT(&allproc); @@ -1194,14 +1196,14 @@ zpfind(pid_t pid) { struct proc *p; - sx_slock(&allproc_lock); + sx_slock(&zombproc_lock); LIST_FOREACH(p, &zombproc, p_list) { if (p->p_pid == pid) { PROC_LOCK(p); break; } } - sx_sunlock(&allproc_lock); + sx_sunlock(&zombproc_lock); return (p); } Modified: head/sys/kern/kern_racct.c ============================================================================== --- head/sys/kern/kern_racct.c Thu Nov 29 01:31:12 2018 (r341175) +++ head/sys/kern/kern_racct.c Thu Nov 29 02:52:08 2018 (r341176) @@ -1228,11 +1228,13 @@ racctd(void) sx_slock(&allproc_lock); + sx_slock(&zombproc_lock); LIST_FOREACH(p, &zombproc, p_list) { PROC_LOCK(p); racct_set(p, RACCT_PCTCPU, 0); PROC_UNLOCK(p); } + sx_sunlock(&zombproc_lock); FOREACH_PROC_IN_SYSTEM(p) { PROC_LOCK(p); Modified: head/sys/sys/proc.h ============================================================================== --- head/sys/sys/proc.h Thu Nov 29 01:31:12 2018 (r341175) +++ head/sys/sys/proc.h Thu Nov 29 02:52:08 2018 (r341176) @@ -959,6 +959,7 @@ extern u_long pgrphash; extern struct sx allproc_lock; extern int allproc_gen; +extern struct sx zombproc_lock; extern struct sx proctree_lock; extern struct mtx ppeers_lock; extern struct proc proc0; /* Process slot for swapper. */