summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_loginclass.c
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2015-11-15 12:10:51 +0000
committertrasz <trasz@FreeBSD.org>2015-11-15 12:10:51 +0000
commitae1d62cec88b407829500bdbda089bfdb1a116f8 (patch)
treee99b1082ae89a7ccc5c9b147425c8f65904388a0 /sys/kern/kern_loginclass.c
parentcd2ea18f1d0c7c51b701eb33ec1dd20e14100138 (diff)
downloadFreeBSD-src-ae1d62cec88b407829500bdbda089bfdb1a116f8.zip
FreeBSD-src-ae1d62cec88b407829500bdbda089bfdb1a116f8.tar.gz
Speed up rctl operation with large rulesets, by holding the lock
during iteration instead of relocking it for each traversed rule. Reviewed by: mjg@ MFC after: 1 month Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D4110
Diffstat (limited to 'sys/kern/kern_loginclass.c')
-rw-r--r--sys/kern/kern_loginclass.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/kern/kern_loginclass.c b/sys/kern/kern_loginclass.c
index 62e6421..07ef910 100644
--- a/sys/kern/kern_loginclass.c
+++ b/sys/kern/kern_loginclass.c
@@ -234,12 +234,17 @@ sys_setloginclass(struct thread *td, struct setloginclass_args *uap)
void
loginclass_racct_foreach(void (*callback)(struct racct *racct,
- void *arg2, void *arg3), void *arg2, void *arg3)
+ void *arg2, void *arg3), void (*pre)(void), void (*post)(void),
+ void *arg2, void *arg3)
{
struct loginclass *lc;
rw_rlock(&loginclasses_lock);
+ if (pre != NULL)
+ (pre)();
LIST_FOREACH(lc, &loginclasses, lc_next)
(callback)(lc->lc_racct, arg2, arg3);
+ if (post != NULL)
+ (post)();
rw_runlock(&loginclasses_lock);
}
OpenPOWER on IntegriCloud