Module Name: src Committed By: ozaki-r Date: Wed Nov 2 09:01:42 UTC 2022
Modified Files: src/sys/rump/librump/rumpkern: lwproc.c Log Message: rump: don't touch p_nlwps without holding p_lock There was a race condition on p_nlwps. Heavy thread switching could cause a kernel panic like: panic: kernel diagnostic assertion "LIST_EMPTY(&p->p_lwps)" failed: file "(hidden)/src/lib/librump/../../sys/rump/librump/rumpkern/lwproc.c", line 177 To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/sys/rump/librump/rumpkern/lwproc.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/rump/librump/rumpkern/lwproc.c diff -u src/sys/rump/librump/rumpkern/lwproc.c:1.51 src/sys/rump/librump/rumpkern/lwproc.c:1.52 --- src/sys/rump/librump/rumpkern/lwproc.c:1.51 Sat May 30 19:16:53 2020 +++ src/sys/rump/librump/rumpkern/lwproc.c Wed Nov 2 09:01:42 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: lwproc.c,v 1.51 2020/05/30 19:16:53 ad Exp $ */ +/* $NetBSD: lwproc.c,v 1.52 2022/11/02 09:01:42 ozaki-r Exp $ */ /* * Copyright (c) 2010, 2011 Antti Kantee. All Rights Reserved. @@ -28,7 +28,7 @@ #define RUMP__CURLWP_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.51 2020/05/30 19:16:53 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.52 2022/11/02 09:01:42 ozaki-r Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -348,6 +348,14 @@ lwproc_makelwp(struct proc *p, bool dosw { struct lwp *l = kmem_zalloc(sizeof(*l), KM_SLEEP); + l->l_refcnt = 1; + l->l_proc = p; + l->l_stat = LSIDL; + l->l_mutex = &unruntime_lock; + + proc_alloc_lwpid(p, l); + + mutex_enter(p->p_lock); /* * Account the new lwp to the owner of the process. * For some reason, NetBSD doesn't count the first lwp @@ -357,14 +365,6 @@ lwproc_makelwp(struct proc *p, bool dosw chglwpcnt(kauth_cred_getuid(p->p_cred), 1); } - l->l_refcnt = 1; - l->l_proc = p; - l->l_stat = LSIDL; - l->l_mutex = &unruntime_lock; - - proc_alloc_lwpid(p, l); - - mutex_enter(p->p_lock); KASSERT((p->p_sflag & PS_RUMP_LWPEXIT) == 0); LIST_INSERT_HEAD(&p->p_lwps, l, l_sibling);