socsvn commit: r237691 - soc2012/rudot/sys/kern

rudot at FreeBSD.org rudot at FreeBSD.org
Thu Jun 14 14:48:59 UTC 2012


Author: rudot
Date: Thu Jun 14 14:48:57 2012
New Revision: 237691
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237691

Log:
  When setting the pcpu resource in racctd, we both need to use the "force" version and need to know if we are past the limits.

Modified:
  soc2012/rudot/sys/kern/kern_racct.c
  soc2012/rudot/sys/kern/kern_rctl.c

Modified: soc2012/rudot/sys/kern/kern_racct.c
==============================================================================
--- soc2012/rudot/sys/kern/kern_racct.c	Thu Jun 14 13:55:52 2012	(r237690)
+++ soc2012/rudot/sys/kern/kern_racct.c	Thu Jun 14 14:48:57 2012	(r237691)
@@ -510,6 +510,48 @@
 	racct_add_cred(p->p_ucred, resource, amount);
 }
 
+/*
+ * This is basicly racct_set_force_locked(), but with the added
+ * benefit that if we are over limits, we let the caller know
+ * via the return value. But we stil do set the resource to the
+ * specified amount.
+ */
+static int
+racct_set_check_locked(struct proc *p, int resource, uint64_t amount)
+{
+	int64_t diff;
+	int over_limit;
+
+	SDT_PROBE(racct, kernel, rusage, set, p, resource, amount, 0, 0);
+
+	/*
+	 * We need proc lock to dereference p->p_ucred.
+	 */
+	PROC_LOCK_ASSERT(p, MA_OWNED);
+
+	/*
+	 * may be negative
+	 */
+	diff = amount - p->p_racct->r_resources[resource];
+#ifdef notyet
+	KASSERT(diff >= 0 || RACCT_IS_RECLAIMABLE(resource),
+	    ("racct_set: usage of non-reclaimable resource %d dropping",
+	     resource));
+#endif
+#ifdef RCTL
+	over_limit = rctl_enforce(p, resource, diff);
+#else
+	over_limit = 0;
+#endif
+	racct_alloc_resource(p->p_racct, resource, diff);
+	if (diff > 0)
+		racct_add_cred_locked(p->p_ucred, resource, diff);
+	else if (diff < 0)
+		racct_sub_cred_locked(p->p_ucred, resource, -diff);
+
+	return (over_limit);
+}
+
 static int
 racct_set_locked(struct proc *p, int resource, uint64_t amount)
 {
@@ -922,7 +964,7 @@
 	struct timeval wallclock;
 	uint64_t runtime;
 	u_int pct;
-	int error;
+	int over_limits;
 
 	for (;;) {
 		sx_slock(&allproc_lock);
@@ -949,8 +991,8 @@
 			p->p_prev_runtime = runtime;
 			pct = racct_getpcpu(p);
 			mtx_lock(&racct_lock);
-			error = racct_set_locked(p, RACCT_PCTCPU, pct);
-			if (error) {
+			over_limits = racct_set_check_locked(p, RACCT_PCTCPU, pct);
+			if (over_limits) {
 				racct_proc_disable(p);
 			} else if (racct_proc_disabled(p)) {
 				racct_proc_enable(p);

Modified: soc2012/rudot/sys/kern/kern_rctl.c
==============================================================================
--- soc2012/rudot/sys/kern/kern_rctl.c	Thu Jun 14 13:55:52 2012	(r237690)
+++ soc2012/rudot/sys/kern/kern_rctl.c	Thu Jun 14 14:48:57 2012	(r237691)
@@ -277,7 +277,7 @@
  * be denied, 0 otherwise.
  */
 int
-rctl_enforce(struct proc *p, int resource, uint64_t amount)
+rctl_enforce(struct proc *p, int resource, int64_t amount)
 {
 	struct rctl_rule *rule;
 	struct rctl_rule_link *link;


More information about the svn-soc-all mailing list