git: 8a0cb04df4ff - main - Add lim_cowsync, similar to crcowsync
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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);