diff options
author | trasz <trasz@FreeBSD.org> | 2015-11-15 12:10:51 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2015-11-15 12:10:51 +0000 |
commit | ae1d62cec88b407829500bdbda089bfdb1a116f8 (patch) | |
tree | e99b1082ae89a7ccc5c9b147425c8f65904388a0 /sys/kern/kern_loginclass.c | |
parent | cd2ea18f1d0c7c51b701eb33ec1dd20e14100138 (diff) | |
download | FreeBSD-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.c | 7 |
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); } |