The branch main has been updated by mjg:

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

commit 8a0cb04df4ff9902b17c9cb4b2e7413354fb630d
Author:     Mateusz Guzik <[email protected]>
AuthorDate: 2022-02-01 13:10:21 +0000
Commit:     Mateusz Guzik <[email protected]>
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);

Reply via email to