From owner-p4-projects@FreeBSD.ORG Sat Feb 12 14:58:23 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 722821065673; Sat, 12 Feb 2011 14:58:23 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 27953106566C for ; Sat, 12 Feb 2011 14:58:23 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id ED7D98FC08 for ; Sat, 12 Feb 2011 14:58:22 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p1CEwMuQ069071 for ; Sat, 12 Feb 2011 14:58:22 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p1CEwMxF069068 for perforce@freebsd.org; Sat, 12 Feb 2011 14:58:22 GMT (envelope-from trasz@freebsd.org) Date: Sat, 12 Feb 2011 14:58:22 GMT Message-Id: <201102121458.p1CEwMxF069068@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 188750 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 12 Feb 2011 14:58:23 -0000 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);