Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/rump/librump/rumpkern Fix a lock order reversal that cau...
details: https://anonhg.NetBSD.org/src/rev/0b957ed7f57c
branches: trunk
changeset: 972580:0b957ed7f57c
user: ad <ad%NetBSD.org@localhost>
date: Sat May 30 19:16:53 2020 +0000
description:
Fix a lock order reversal that caused hangs.
diffstat:
sys/rump/librump/rumpkern/lwproc.c | 38 +++++++++++++++++---------------------
1 files changed, 17 insertions(+), 21 deletions(-)
diffs (107 lines):
diff -r 33b47dc225d9 -r 0b957ed7f57c sys/rump/librump/rumpkern/lwproc.c
--- a/sys/rump/librump/rumpkern/lwproc.c Sat May 30 18:40:28 2020 +0000
+++ b/sys/rump/librump/rumpkern/lwproc.c Sat May 30 19:16:53 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lwproc.c,v 1.50 2020/05/23 23:42:44 ad Exp $ */
+/* $NetBSD: lwproc.c,v 1.51 2020/05/30 19:16:53 ad 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.50 2020/05/23 23:42:44 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.51 2020/05/30 19:16:53 ad Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -343,12 +343,10 @@
extern kmutex_t unruntime_lock;
-/*
- * called with p_lock held, releases lock before return
- */
-static void
-lwproc_makelwp(struct proc *p, struct lwp *l, bool doswitch, bool procmake)
+static struct lwp *
+lwproc_makelwp(struct proc *p, bool doswitch, bool procmake)
{
+ struct lwp *l = kmem_zalloc(sizeof(*l), KM_SLEEP);
/*
* Account the new lwp to the owner of the process.
@@ -365,6 +363,9 @@
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);
l->l_fd = p->p_fd;
@@ -392,12 +393,13 @@
mutex_enter(&proc_lock);
LIST_INSERT_HEAD(&alllwp, l, l_list);
mutex_exit(&proc_lock);
+
+ return l;
}
struct lwp *
rump__lwproc_alloclwp(struct proc *p)
{
- struct lwp *l;
bool newproc = false;
if (p == NULL) {
@@ -405,13 +407,7 @@
newproc = true;
}
- l = kmem_zalloc(sizeof(*l), KM_SLEEP);
-
- mutex_enter(p->p_lock);
- KASSERT((p->p_sflag & PS_RUMP_LWPEXIT) == 0);
- lwproc_makelwp(p, l, false, newproc);
-
- return l;
+ return lwproc_makelwp(p, false, newproc);
}
int
@@ -435,8 +431,12 @@
kmem_free(l, sizeof(*l));
return EBUSY;
}
+ mutex_exit(p->p_lock);
mutex_exit(&proc_lock);
- lwproc_makelwp(p, l, true, false);
+
+ /* XXX what holds proc? */
+
+ lwproc_makelwp(p, true, false);
return 0;
}
@@ -445,17 +445,13 @@
rump_lwproc_rfork_vmspace(struct vmspace *vm, int flags)
{
struct proc *p;
- struct lwp *l;
if (flags & ~(RUMP_RFFDG|RUMP_RFCFDG) ||
(~flags & (RUMP_RFFDG|RUMP_RFCFDG)) == 0)
return EINVAL;
p = lwproc_newproc(curproc, vm, flags);
- l = kmem_zalloc(sizeof(*l), KM_SLEEP);
- mutex_enter(p->p_lock);
- KASSERT((p->p_sflag & PS_RUMP_LWPEXIT) == 0);
- lwproc_makelwp(p, l, true, true);
+ lwproc_makelwp(p, true, true);
return 0;
}
Home |
Main Index |
Thread Index |
Old Index