|
@@ -94,13 +94,15 @@ void res_counter_uncharge_locked(struct res_counter *counter, unsigned long val)
|
|
|
counter->usage -= val;
|
|
|
}
|
|
|
|
|
|
-void res_counter_uncharge(struct res_counter *counter, unsigned long val)
|
|
|
+void res_counter_uncharge_until(struct res_counter *counter,
|
|
|
+ struct res_counter *top,
|
|
|
+ unsigned long val)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
struct res_counter *c;
|
|
|
|
|
|
local_irq_save(flags);
|
|
|
- for (c = counter; c != NULL; c = c->parent) {
|
|
|
+ for (c = counter; c != top; c = c->parent) {
|
|
|
spin_lock(&c->lock);
|
|
|
res_counter_uncharge_locked(c, val);
|
|
|
spin_unlock(&c->lock);
|
|
@@ -108,6 +110,10 @@ void res_counter_uncharge(struct res_counter *counter, unsigned long val)
|
|
|
local_irq_restore(flags);
|
|
|
}
|
|
|
|
|
|
+void res_counter_uncharge(struct res_counter *counter, unsigned long val)
|
|
|
+{
|
|
|
+ res_counter_uncharge_until(counter, NULL, val);
|
|
|
+}
|
|
|
|
|
|
static inline unsigned long long *
|
|
|
res_counter_member(struct res_counter *counter, int member)
|