PERFORCE change 188750 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Sat Feb 12 14:58:23 UTC 2011
http://p4web.freebsd.org/@@188750?ac=10
Change 188750 by trasz at trasz_victim on 2011/02/12 14:57:51
Replace the hacky mechanism used to send a signal or log a warning
only when the rule gets exceeded, and not at every subsequent resource
usage increase, with a proper one.
Affected files ...
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_rctl.c#30 edit
Differences ...
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_rctl.c#30 (text+ko) ====
@@ -82,6 +82,7 @@
struct rctl_rule_link {
LIST_ENTRY(rctl_rule_link) rrl_next;
struct rctl_rule *rrl_rule;
+ int rrl_exceeded;
};
struct dict {
@@ -265,18 +266,6 @@
if (available >= amount)
return (0);
- /*
- * We've already exceeded that one.
- */
- if (available < 0) {
-#ifdef notyet
- KASSERT(rule->rr_action != RCTL_ACTION_DENY ||
- !rusage_is_deniable(rule->rr_resource),
- ("rctl_would_exceed: deny rule already exceeded"));
-#endif
- return (0);
- }
-
return (1);
}
@@ -291,7 +280,7 @@
struct rctl_rule *rule;
struct rctl_rule_link *link;
struct sbuf sb;
- int should_deny = 0;
+ int should_deny = 0, already_exceeded;
char *buf;
static int curtime = 0;
static struct timeval lasttime;
@@ -306,14 +295,22 @@
rule = link->rrl_rule;
if (rule->rr_resource != resource)
continue;
- if (!rctl_would_exceed(p, rule, amount))
+ if (!rctl_would_exceed(p, rule, amount)) {
+ link->rrl_exceeded = 0;
continue;
+ }
+ already_exceeded = link->rrl_exceeded;
+ link->rrl_exceeded = 1;
+
switch (rule->rr_action) {
case RCTL_ACTION_DENY:
should_deny = 1;
continue;
case RCTL_ACTION_LOG:
+ if (already_exceeded)
+ continue;
+
if (!ppsratecheck(&lasttime, &curtime, 10))
continue;
@@ -333,6 +330,9 @@
free(buf, M_RCTL);
continue;
default:
+ if (already_exceeded)
+ continue;
+
KASSERT(rule->rr_action > 0 &&
rule->rr_action <= RCTL_ACTION_SIGNAL_MAX,
("rctl_enforce: unknown action %d",
@@ -550,6 +550,7 @@
rctl_rule_acquire(rule);
link = uma_zalloc(rctl_rule_link_zone, M_WAITOK);
link->rrl_rule = rule;
+ link->rrl_exceeded = 0;
rw_wlock(&rctl_lock);
LIST_INSERT_HEAD(&container->c_rule_links, link, rrl_next);
@@ -569,6 +570,7 @@
return (ENOMEM);
rctl_rule_acquire(rule);
link->rrl_rule = rule;
+ link->rrl_exceeded = 0;
LIST_INSERT_HEAD(&container->c_rule_links, link, rrl_next);
return (0);
More information about the p4-projects
mailing list