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