Skip site navigation (1)Skip section navigation (2)
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>