git: 12fb39ec3e6b - main - proc: Relax proc_rwmem()'s assertion on the process hold count
Date: Tue, 01 Mar 2022 17:41:55 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=12fb39ec3e6bc529feff3ba2862c6a4a30bd54eb
commit 12fb39ec3e6bc529feff3ba2862c6a4a30bd54eb
Author: Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2022-03-01 16:48:39 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-03-01 17:40:35 +0000
proc: Relax proc_rwmem()'s assertion on the process hold count
This reference ensures that the process and its associated vmspace will
not be destroyed while proc_rwmem() is executing. If, however, the
calling thread belongs to the target process, then it is unnecessary to
hold the process. In particular, fasttrap - a module which enables
userspace dtrace - may frequently call proc_rwmem(), and we'd prefer to
avoid the overhead of locking and bumping the hold count when possible.
Thus, make the assertion conditional on "p != curproc". Also assert
that the process is not already exiting. No functional change intended.
MFC after: 2 weeks
Sponsored by: The FreeBSD Foundation
---
sys/kern/sys_process.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c
index 582bff962f1a..8d8c5a1d34ff 100644
--- a/sys/kern/sys_process.c
+++ b/sys/kern/sys_process.c
@@ -336,11 +336,12 @@ proc_rwmem(struct proc *p, struct uio *uio)
int error, fault_flags, page_offset, writing;
/*
- * Assert that someone has locked this vmspace. (Should be
- * curthread but we can't assert that.) This keeps the process
- * from exiting out from under us until this operation completes.
+ * Make sure that the process' vmspace remains live.
*/
- PROC_ASSERT_HELD(p);
+ if (p != curproc)
+ PROC_ASSERT_HELD(p);
+ KASSERT((p->p_flag & P_WEXIT) == 0,
+ ("%s: process %p is exiting", __func__, p));
PROC_LOCK_ASSERT(p, MA_NOTOWNED);
/*