res_counter_uncharge_until(counter, NULL, val);
}
+struct res_counter *res_counter_common_ancestor(struct res_counter *l,
+ struct res_counter *r);
+
/**
* res_counter_margin - calculate chargeable space of a counter
* @cnt: the counter
local_irq_restore(flags);
}
+/*
+ * Walk through r1 and r2 parents and try to find the closest common one
+ * between both. If none is found, it returns NULL.
+ */
+struct res_counter *
+res_counter_common_ancestor(struct res_counter *r1, struct res_counter *r2)
+{
+ struct res_counter *iter;
+ int r1_depth = 0, r2_depth = 0;
+
+ for (iter = r1; iter; iter = iter->parent)
+ r1_depth++;
+
+ for (iter = r2; iter; iter = iter->parent)
+ r2_depth++;
+
+ while (r1_depth > r2_depth) {
+ r1 = r1->parent;
+ r1_depth--;
+ }
+
+ while (r2_depth > r1_depth) {
+ r2 = r2->parent;
+ r2_depth--;
+ }
+
+ while (r1 != r2) {
+ r1 = r1->parent;
+ r2 = r2->parent;
+ }
+
+ return r1;
+}
static inline unsigned long long *
res_counter_member(struct res_counter *counter, int member)