Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Mar 2022 17:41:55 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 12fb39ec3e6b - main - proc: Relax proc_rwmem()'s assertion on the process hold count
Message-ID:  <202203011741.221Hftwu093303@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202203011741.221Hftwu093303>