Date: Sat, 12 Feb 2011 14:58:22 GMT From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 188750 for review Message-ID: <201102121458.p1CEwMxF069068@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@188750?ac=10 Change 188750 by trasz@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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201102121458.p1CEwMxF069068>