Author: mjg
Date: Sat Nov 14 19:21:46 2020
New Revision: 367694
URL: https://svnweb.freebsd.org/changeset/base/367694
Log:
thread: batch resource limit free calls
Modified:
head/sys/kern/kern_resource.c
head/sys/kern/kern_thread.c
head/sys/sys/resourcevar.h
Modified: head/sys/kern/kern_resource.c
==
--- head/sys/kern/kern_resource.c Sat Nov 14 19:20:58 2020
(r367693)
+++ head/sys/kern/kern_resource.c Sat Nov 14 19:21:46 2020
(r367694)
@@ -1236,6 +1236,14 @@ lim_free(struct plimit *limp)
free((void *)limp, M_PLIMIT);
}
+void
+lim_freen(struct plimit *limp, int n)
+{
+
+ if (refcount_releasen(&limp->pl_refcnt, n))
+ free((void *)limp, M_PLIMIT);
+}
+
/*
* Make a copy of the plimit structure.
* We share these structures copy-on-write after fork.
Modified: head/sys/kern/kern_thread.c
==
--- head/sys/kern/kern_thread.c Sat Nov 14 19:20:58 2020(r367693)
+++ head/sys/kern/kern_thread.c Sat Nov 14 19:21:46 2020(r367694)
@@ -537,6 +537,8 @@ thread_reap(void)
struct thread *itd, *ntd;
struct tidbatch tidbatch;
int tdcount;
+ struct plimit *lim;
+ int limcount;
/*
* Reading upfront is pessimal if followed by concurrent atomic_swap,
@@ -552,11 +554,23 @@ thread_reap(void)
tidbatch_prep(&tidbatch);
tdcount = 0;
+ lim = NULL;
+ limcount = 0;
while (itd != NULL) {
ntd = itd->td_zombie;
EVENTHANDLER_DIRECT_INVOKE(thread_dtor, itd);
tidbatch_add(&tidbatch, itd);
- thread_cow_free(itd);
+ MPASS(itd->td_realucred != NULL);
+ crcowfree(itd);
+ MPASS(itd->td_limit != NULL);
+ if (lim != itd->td_limit) {
+ if (limcount != 0) {
+ lim_freen(lim, limcount);
+ limcount = 0;
+ }
+ }
+ lim = itd->td_limit;
+ limcount++;
thread_free_batched(itd);
tidbatch_process(&tidbatch);
tdcount++;
@@ -571,6 +585,8 @@ thread_reap(void)
if (tdcount != 0) {
thread_count_sub(tdcount);
}
+ MPASS(limcount != 0);
+ lim_freen(lim, limcount);
}
/*
Modified: head/sys/sys/resourcevar.h
==
--- head/sys/sys/resourcevar.h Sat Nov 14 19:20:58 2020(r367693)
+++ head/sys/sys/resourcevar.h Sat Nov 14 19:21:46 2020(r367694)
@@ -145,6 +145,7 @@ rlim_t lim_cur(struct thread *td, int which);
rlim_t lim_cur_proc(struct proc *p, int which);
voidlim_fork(struct proc *p1, struct proc *p2);
voidlim_free(struct plimit *limp);
+voidlim_freen(struct plimit *limp, int n);
struct plimit
*lim_hold(struct plimit *limp);
rlim_t lim_max(struct thread *td, int which);
___
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"