Module Name: src Committed By: ad Date: Wed Oct 4 20:46:33 UTC 2023
Modified Files: src/sys/kern: kern_lwp.c Log Message: Do cv_broadcast(&p->p_lwpcv) after dropping p->p_lock in a few places, to reduce contention. To generate a diff of this commit: cvs rdiff -u -r1.261 -r1.262 src/sys/kern/kern_lwp.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_lwp.c diff -u src/sys/kern/kern_lwp.c:1.261 src/sys/kern/kern_lwp.c:1.262 --- src/sys/kern/kern_lwp.c:1.261 Wed Oct 4 20:45:13 2023 +++ src/sys/kern/kern_lwp.c Wed Oct 4 20:46:33 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_lwp.c,v 1.261 2023/10/04 20:45:13 ad Exp $ */ +/* $NetBSD: kern_lwp.c,v 1.262 2023/10/04 20:46:33 ad Exp $ */ /*- * Copyright (c) 2001, 2006, 2007, 2008, 2009, 2019, 2020, 2023 @@ -217,7 +217,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.261 2023/10/04 20:45:13 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.262 2023/10/04 20:46:33 ad Exp $"); #include "opt_ddb.h" #include "opt_lockdebug.h" @@ -1219,10 +1219,10 @@ lwp_exit(struct lwp *l) } lwp_unlock(l); p->p_nrlwps--; - cv_broadcast(&p->p_lwpcv); if (l->l_lwpctl != NULL) l->l_lwpctl->lc_curcpu = LWPCTL_CPU_EXITED; mutex_exit(p->p_lock); + cv_broadcast(&p->p_lwpcv); /* * We can no longer block. At this point, lwp_free() may already @@ -1311,13 +1311,13 @@ lwp_free(struct lwp *l, bool recycle, bo p->p_nzlwps--; if ((l->l_prflag & LPR_DETACHED) != 0) p->p_ndlwps--; + mutex_exit(p->p_lock); /* * Have any LWPs sleeping in lwp_wait() recheck for * deadlock. */ cv_broadcast(&p->p_lwpcv); - mutex_exit(p->p_lock); /* Free the LWP ID. */ mutex_enter(&proc_lock); @@ -1759,11 +1759,11 @@ lwp_userret(struct lwp *l) pcu_save_all(l); mutex_enter(p->p_lock); p->p_nrlwps--; - cv_broadcast(&p->p_lwpcv); lwp_lock(l); l->l_stat = LSSUSPENDED; lwp_unlock(l); mutex_exit(p->p_lock); + cv_broadcast(&p->p_lwpcv); lwp_lock(l); spc_lock(l->l_cpu); mi_switch(l);