Module Name:    src
Committed By:   thorpej
Date:           Tue Dec 21 19:00:38 UTC 2021

Modified Files:
        src/sys/kern: kern_lwp.c

Log Message:
Rather than calling xc_barrier() in lwp_dtor(), set a pre-destruct hook
on the lwp_cache and invoke the barrier there.


To generate a diff of this commit:
cvs rdiff -u -r1.244 -r1.245 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.244 src/sys/kern/kern_lwp.c:1.245
--- src/sys/kern/kern_lwp.c:1.244	Tue Sep 28 15:05:42 2021
+++ src/sys/kern/kern_lwp.c	Tue Dec 21 19:00:37 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_lwp.c,v 1.244 2021/09/28 15:05:42 thorpej Exp $	*/
+/*	$NetBSD: kern_lwp.c,v 1.245 2021/12/21 19:00:37 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2006, 2007, 2008, 2009, 2019, 2020
@@ -217,7 +217,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.244 2021/09/28 15:05:42 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_lwp.c,v 1.245 2021/12/21 19:00:37 thorpej Exp $");
 
 #include "opt_ddb.h"
 #include "opt_lockdebug.h"
@@ -262,6 +262,7 @@ struct lwplist		alllwp		__cacheline_alig
 
 static int		lwp_ctor(void *, void *, int);
 static void		lwp_dtor(void *, void *);
+static void		lwp_pre_dtor(void *);
 
 /* DTrace proc provider probes */
 SDT_PROVIDER_DEFINE(proc);
@@ -341,6 +342,7 @@ lwpinit(void)
 	lwpinit_specificdata();
 	lwp_cache = pool_cache_init(sizeof(lwp_t), MIN_LWP_ALIGNMENT, 0, 0,
 	    "lwppl", NULL, IPL_NONE, lwp_ctor, lwp_dtor, NULL);
+	pool_cache_setpredestruct(lwp_cache, lwp_pre_dtor);
 
 	maxlwp = cpu_maxlwp();
 	sysctl_kern_lwp_setup();
@@ -391,23 +393,29 @@ lwp_ctor(void *arg, void *obj, int flags
 }
 
 static void
-lwp_dtor(void *arg, void *obj)
+lwp_pre_dtor(void *arg __unused)
 {
-	lwp_t *l = obj;
-	(void)l;
-
 	/*
 	 * Provide a barrier to ensure that all mutex_oncpu() and rw_oncpu()
-	 * calls will exit before memory of LWP is returned to the pool, where
+	 * calls will exit before memory of LWPs is returned to the pool, where
 	 * KVA of LWP structure might be freed and re-used for other purposes.
 	 * Kernel preemption is disabled around mutex_oncpu() and rw_oncpu()
-	 * callers, therefore cross-call to all CPUs will do the job.  Also,
-	 * the value of l->l_cpu must be still valid at this point.
+	 * callers, therefore cross-call to all CPUs will do the job.
 	 *
 	 * XXX should use epoch based reclamation.
 	 */
-	KASSERT(l->l_cpu != NULL);
 	xc_barrier(0);
+}
+
+static void
+lwp_dtor(void *arg, void *obj)
+{
+	lwp_t *l = obj;
+
+	/*
+	 * The value of l->l_cpu must still be valid at this point.
+	 */
+	KASSERT(l->l_cpu != NULL);
 
 	/*
 	 * We can't return turnstile0 to the pool (it didn't come from it),

Reply via email to