aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_rctl.c
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2016-04-05 11:30:52 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2016-04-05 11:30:52 +0000
commit4c230cdafd698f20a23f42f6c66fe725fb1b6bbf (patch)
treea697dec7615e5192222afe08b5749b96fafbe3c9 /sys/kern/kern_rctl.c
parentc77702de74d8ae5010e6aa8aeef4f95b1566a5fc (diff)
Use proper locking macros in RACCT in RCTL.
MFC after: 1 month Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/head/; revision=297578
Diffstat (limited to 'sys/kern/kern_rctl.c')
-rw-r--r--sys/kern/kern_rctl.c82
1 files changed, 44 insertions, 38 deletions
diff --git a/sys/kern/kern_rctl.c b/sys/kern/kern_rctl.c
index 1970ed85f1df..7f6a7ad5075f 100644
--- a/sys/kern/kern_rctl.c
+++ b/sys/kern/kern_rctl.c
@@ -181,6 +181,13 @@ static uma_zone_t rctl_rule_zone;
static struct rwlock rctl_lock;
RW_SYSINIT(rctl_lock, &rctl_lock, "RCTL lock");
+#define RCTL_RLOCK() rw_rlock(&rctl_lock)
+#define RCTL_RUNLOCK() rw_runlock(&rctl_lock)
+#define RCTL_WLOCK() rw_wlock(&rctl_lock)
+#define RCTL_WUNLOCK() rw_wunlock(&rctl_lock)
+#define RCTL_LOCK_ASSERT() rw_assert(&rctl_lock, RA_LOCKED)
+#define RCTL_WLOCK_ASSERT() rw_assert(&rctl_lock, RA_WLOCKED)
+
static int rctl_rule_fully_specified(const struct rctl_rule *rule);
static void rctl_rule_to_sbuf(struct sbuf *sb, const struct rctl_rule *rule);
@@ -231,7 +238,7 @@ rctl_proc_rule_to_racct(const struct proc *p, const struct rctl_rule *rule)
struct ucred *cred = p->p_ucred;
ASSERT_RACCT_ENABLED();
- rw_assert(&rctl_lock, RA_LOCKED);
+ RCTL_LOCK_ASSERT();
switch (rule->rr_per) {
case RCTL_SUBJECT_TYPE_PROCESS:
@@ -258,7 +265,7 @@ rctl_available_resource(const struct proc *p, const struct rctl_rule *rule)
const struct racct *racct;
ASSERT_RACCT_ENABLED();
- rw_assert(&rctl_lock, RA_LOCKED);
+ RCTL_LOCK_ASSERT();
racct = rctl_proc_rule_to_racct(p, rule);
available = rule->rr_amount - racct->r_resources[rule->rr_resource];
@@ -277,8 +284,7 @@ rctl_would_exceed(const struct proc *p, const struct rctl_rule *rule,
int64_t available;
ASSERT_RACCT_ENABLED();
-
- rw_assert(&rctl_lock, RA_LOCKED);
+ RCTL_LOCK_ASSERT();
available = rctl_available_resource(p, rule);
if (available >= amount)
@@ -302,7 +308,7 @@ rctl_pcpu_available(const struct proc *p) {
minavailable = INT64_MAX;
limit = 0;
- rw_rlock(&rctl_lock);
+ RCTL_RLOCK();
LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) {
rule = link->rrl_rule;
@@ -317,7 +323,7 @@ rctl_pcpu_available(const struct proc *p) {
}
}
- rw_runlock(&rctl_lock);
+ RCTL_RUNLOCK();
/*
* Return slightly less than actual value of the available
@@ -352,7 +358,7 @@ rctl_enforce(struct proc *p, int resource, uint64_t amount)
ASSERT_RACCT_ENABLED();
- rw_rlock(&rctl_lock);
+ RCTL_RLOCK();
/*
* There may be more than one matching rule; go through all of them.
@@ -460,7 +466,7 @@ rctl_enforce(struct proc *p, int resource, uint64_t amount)
}
}
- rw_runlock(&rctl_lock);
+ RCTL_RUNLOCK();
if (should_deny) {
/*
@@ -482,7 +488,7 @@ rctl_get_limit(struct proc *p, int resource)
ASSERT_RACCT_ENABLED();
- rw_rlock(&rctl_lock);
+ RCTL_RLOCK();
/*
* There may be more than one matching rule; go through all of them.
@@ -498,7 +504,7 @@ rctl_get_limit(struct proc *p, int resource)
amount = rule->rr_amount;
}
- rw_runlock(&rctl_lock);
+ RCTL_RUNLOCK();
return (amount);
}
@@ -514,7 +520,7 @@ rctl_get_available(struct proc *p, int resource)
ASSERT_RACCT_ENABLED();
- rw_rlock(&rctl_lock);
+ RCTL_RLOCK();
/*
* There may be more than one matching rule; go through all of them.
@@ -531,7 +537,7 @@ rctl_get_available(struct proc *p, int resource)
minavailable = available;
}
- rw_runlock(&rctl_lock);
+ RCTL_RUNLOCK();
/*
* XXX: Think about this _hard_.
@@ -675,9 +681,9 @@ rctl_racct_add_rule(struct racct *racct, struct rctl_rule *rule)
link->rrl_rule = rule;
link->rrl_exceeded = 0;
- rw_wlock(&rctl_lock);
+ RCTL_WLOCK();
LIST_INSERT_HEAD(&racct->r_rule_links, link, rrl_next);
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
}
static int
@@ -687,7 +693,7 @@ rctl_racct_add_rule_locked(struct racct *racct, struct rctl_rule *rule)
ASSERT_RACCT_ENABLED();
KASSERT(rctl_rule_fully_specified(rule), ("rule not fully specified"));
- rw_assert(&rctl_lock, RA_WLOCKED);
+ RCTL_WLOCK_ASSERT();
link = uma_zalloc(rctl_rule_link_zone, M_NOWAIT);
if (link == NULL)
@@ -713,7 +719,7 @@ rctl_racct_remove_rules(struct racct *racct,
struct rctl_rule_link *link, *linktmp;
ASSERT_RACCT_ENABLED();
- rw_assert(&rctl_lock, RA_WLOCKED);
+ RCTL_WLOCK_ASSERT();
LIST_FOREACH_SAFE(link, &racct->r_rule_links, rrl_next, linktmp) {
if (!rctl_rule_matches(link->rrl_rule, filter))
@@ -1172,14 +1178,14 @@ static void
rctl_rule_pre_callback(void)
{
- rw_wlock(&rctl_lock);
+ RCTL_WLOCK();
}
static void
rctl_rule_post_callback(void)
{
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
}
static void
@@ -1189,7 +1195,7 @@ rctl_rule_remove_callback(struct racct *racct, void *arg2, void *arg3)
int found = 0;
ASSERT_RACCT_ENABLED();
- rw_assert(&rctl_lock, RA_WLOCKED);
+ RCTL_WLOCK_ASSERT();
found += rctl_racct_remove_rules(racct, filter);
@@ -1210,9 +1216,9 @@ rctl_rule_remove(struct rctl_rule *filter)
if (filter->rr_subject_type == RCTL_SUBJECT_TYPE_PROCESS &&
filter->rr_subject.rs_proc != NULL) {
p = filter->rr_subject.rs_proc;
- rw_wlock(&rctl_lock);
+ RCTL_WLOCK();
found = rctl_racct_remove_rules(p->p_racct, filter);
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
if (found)
return (0);
return (ESRCH);
@@ -1229,11 +1235,11 @@ rctl_rule_remove(struct rctl_rule *filter)
filter, (void *)&found);
sx_assert(&allproc_lock, SA_LOCKED);
- rw_wlock(&rctl_lock);
+ RCTL_WLOCK();
FOREACH_PROC_IN_SYSTEM(p) {
found += rctl_racct_remove_rules(p->p_racct, filter);
}
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
if (found)
return (0);
@@ -1460,7 +1466,7 @@ rctl_get_rules_callback(struct racct *racct, void *arg2, void *arg3)
struct sbuf *sb = (struct sbuf *)arg3;
ASSERT_RACCT_ENABLED();
- rw_assert(&rctl_lock, RA_LOCKED);
+ RCTL_LOCK_ASSERT();
LIST_FOREACH(link, &racct->r_rule_links, rrl_next) {
if (!rctl_rule_matches(link->rrl_rule, filter))
@@ -1511,7 +1517,7 @@ sys_rctl_get_rules(struct thread *td, struct rctl_get_rules_args *uap)
KASSERT(sb != NULL, ("sbuf_new failed"));
FOREACH_PROC_IN_SYSTEM(p) {
- rw_rlock(&rctl_lock);
+ RCTL_RLOCK();
LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) {
/*
* Non-process rules will be added to the buffer later.
@@ -1525,7 +1531,7 @@ sys_rctl_get_rules(struct thread *td, struct rctl_get_rules_args *uap)
rctl_rule_to_sbuf(sb, link->rrl_rule);
sbuf_printf(sb, ",");
}
- rw_runlock(&rctl_lock);
+ RCTL_RUNLOCK();
}
loginclass_racct_foreach(rctl_get_rules_callback,
@@ -1612,13 +1618,13 @@ sys_rctl_get_limits(struct thread *td, struct rctl_get_limits_args *uap)
sb = sbuf_new(NULL, buf, bufsize, SBUF_FIXEDLEN);
KASSERT(sb != NULL, ("sbuf_new failed"));
- rw_rlock(&rctl_lock);
+ RCTL_RLOCK();
LIST_FOREACH(link, &filter->rr_subject.rs_proc->p_racct->r_rule_links,
rrl_next) {
rctl_rule_to_sbuf(sb, link->rrl_rule);
sbuf_printf(sb, ",");
}
- rw_runlock(&rctl_lock);
+ RCTL_RUNLOCK();
if (sbuf_error(sb) == ENOMEM) {
error = ERANGE;
goto out;
@@ -1743,7 +1749,7 @@ again:
* credentials.
*/
rulecnt = 0;
- rw_rlock(&rctl_lock);
+ RCTL_RLOCK();
LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) {
if (link->rrl_rule->rr_subject_type ==
RCTL_SUBJECT_TYPE_PROCESS)
@@ -1755,7 +1761,7 @@ again:
rulecnt++;
LIST_FOREACH(link, &newprr->prr_racct->r_rule_links, rrl_next)
rulecnt++;
- rw_runlock(&rctl_lock);
+ RCTL_RUNLOCK();
/*
* Create temporary list. We've dropped the rctl_lock in order
@@ -1773,7 +1779,7 @@ again:
/*
* Assign rules to the newly allocated list entries.
*/
- rw_wlock(&rctl_lock);
+ RCTL_WLOCK();
LIST_FOREACH(link, &p->p_racct->r_rule_links, rrl_next) {
if (link->rrl_rule->rr_subject_type ==
RCTL_SUBJECT_TYPE_PROCESS) {
@@ -1841,13 +1847,13 @@ again:
newlink, rrl_next);
}
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
return;
}
goaround:
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
/*
* Rule list changed while we were not holding the rctl_lock.
@@ -1879,7 +1885,7 @@ rctl_proc_fork(struct proc *parent, struct proc *child)
ASSERT_RACCT_ENABLED();
KASSERT(parent->p_racct != NULL, ("process without racct; p = %p", parent));
- rw_wlock(&rctl_lock);
+ RCTL_WLOCK();
/*
* Go through limits applicable to the parent and assign them
@@ -1908,7 +1914,7 @@ rctl_proc_fork(struct proc *parent, struct proc *child)
}
}
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
return (0);
fail:
@@ -1918,7 +1924,7 @@ fail:
rctl_rule_release(link->rrl_rule);
uma_zfree(rctl_rule_link_zone, link);
}
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
return (EAGAIN);
}
@@ -1932,14 +1938,14 @@ rctl_racct_release(struct racct *racct)
ASSERT_RACCT_ENABLED();
- rw_wlock(&rctl_lock);
+ RCTL_WLOCK();
while (!LIST_EMPTY(&racct->r_rule_links)) {
link = LIST_FIRST(&racct->r_rule_links);
LIST_REMOVE(link, rrl_next);
rctl_rule_release(link->rrl_rule);
uma_zfree(rctl_rule_link_zone, link);
}
- rw_wunlock(&rctl_lock);
+ RCTL_WUNLOCK();
}
static void