git: 8a0cb04df4ff - main - Add lim_cowsync, similar to crcowsync

From: Mateusz Guzik <mjg_at_FreeBSD.org>
Date: Fri, 11 Feb 2022 13:57:58 UTC
The branch main has been updated by mjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=8a0cb04df4ff9902b17c9cb4b2e7413354fb630d

commit 8a0cb04df4ff9902b17c9cb4b2e7413354fb630d
Author:     Mateusz Guzik <mjg@FreeBSD.org>
AuthorDate: 2022-02-01 13:10:21 +0000
Commit:     Mateusz Guzik <mjg@FreeBSD.org>
CommitDate: 2022-02-11 11:44:07 +0000

    Add lim_cowsync, similar to crcowsync
---
 sys/kern/kern_resource.c | 20 ++++++++++++++++++++
 sys/kern/kern_thread.c   |  5 +----
 sys/sys/resourcevar.h    |  2 ++
 3 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index 504e338ba922..c2d75f86d183 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -1216,6 +1216,26 @@ lim_hold(struct plimit *limp)
 	return (limp);
 }
 
+struct plimit *
+lim_cowsync(void)
+{
+	struct thread *td;
+	struct proc *p;
+	struct plimit *oldlimit;
+
+	td = curthread;
+	p = td->td_proc;
+	PROC_LOCK_ASSERT(p, MA_OWNED);
+
+	if (td->td_limit == p->p_limit)
+		return (NULL);
+
+	oldlimit = td->td_limit;
+	td->td_limit = lim_hold(p->p_limit);
+
+	return (oldlimit);
+}
+
 void
 lim_fork(struct proc *p1, struct proc *p2)
 {
diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c
index 7b0ff604b086..dcb52b137b58 100644
--- a/sys/kern/kern_thread.c
+++ b/sys/kern/kern_thread.c
@@ -859,10 +859,7 @@ thread_cow_update(struct thread *td)
 	oldlimit = NULL;
 	PROC_LOCK(p);
 	oldcred = crcowsync();
-	if (td->td_limit != p->p_limit) {
-		oldlimit = td->td_limit;
-		td->td_limit = lim_hold(p->p_limit);
-	}
+	oldlimit = lim_cowsync();
 	td->td_cowgen = p->p_cowgen;
 	PROC_UNLOCK(p);
 	if (oldcred != NULL)
diff --git a/sys/sys/resourcevar.h b/sys/sys/resourcevar.h
index d1c9e6d4985f..bd57211c75f0 100644
--- a/sys/sys/resourcevar.h
+++ b/sys/sys/resourcevar.h
@@ -148,6 +148,8 @@ void	 lim_free(struct plimit *limp);
 void	 lim_freen(struct plimit *limp, int n);
 struct plimit
 	*lim_hold(struct plimit *limp);
+struct plimit
+	*lim_cowsync(void);
 rlim_t	 lim_max(struct thread *td, int which);
 rlim_t	 lim_max_proc(struct proc *p, int which);
 void	 lim_rlimit(struct thread *td, int which, struct rlimit *rlp);