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
This commit is contained in:
Mark Johnston 2022-03-01 11:48:39 -05:00
parent f27fb06cad
commit 12fb39ec3e

View file

@ -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);
/*