From c6834b0710332d924c965ca5ba9d9051d98c62a8 Mon Sep 17 00:00:00 2001 From: Salman Qazi Date: Thu, 14 Jun 2012 14:55:30 -0700 Subject: [PATCH] --- yaml --- r: 311171 b: refs/heads/master c: 8e3bbf42c6d73881956863cc3305456afe2bc4ea h: refs/heads/master i: 311169: 6bf13729edbaa38692f4ee7fd80571fabfac611f 311167: 844235c4a4c330b76011b57f0128090c46fa6bce v: v3 --- [refs] | 2 +- trunk/kernel/cgroup.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 6fe28a413cf6..ccf115d15ce7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 967db0ea65b0bf8507a7643ac8f296c4f2c0a834 +refs/heads/master: 8e3bbf42c6d73881956863cc3305456afe2bc4ea diff --git a/trunk/kernel/cgroup.c b/trunk/kernel/cgroup.c index ceeafe874b3f..2097684cf194 100644 --- a/trunk/kernel/cgroup.c +++ b/trunk/kernel/cgroup.c @@ -255,12 +255,17 @@ int cgroup_lock_is_held(void) EXPORT_SYMBOL_GPL(cgroup_lock_is_held); +static int css_unbias_refcnt(int refcnt) +{ + return refcnt >= 0 ? refcnt : refcnt - CSS_DEACT_BIAS; +} + /* the current nr of refs, always >= 0 whether @css is deactivated or not */ static int css_refcnt(struct cgroup_subsys_state *css) { int v = atomic_read(&css->refcnt); - return v >= 0 ? v : v - CSS_DEACT_BIAS; + return css_unbias_refcnt(v); } /* convenient tests for these bits */ @@ -4982,9 +4987,12 @@ EXPORT_SYMBOL_GPL(__css_tryget); void __css_put(struct cgroup_subsys_state *css) { struct cgroup *cgrp = css->cgroup; + int v; rcu_read_lock(); - switch (atomic_dec_return(&css->refcnt)) { + v = css_unbias_refcnt(atomic_dec_return(&css->refcnt)); + + switch (v) { case 1: if (notify_on_release(cgrp)) { set_bit(CGRP_RELEASABLE, &cgrp->flags);