X-Git-Url: https://git.karo-electronics.de/?a=blobdiff_plain;f=kernel%2Fres_counter.c;h=d508363858b3a147cf757ae06080dde035842091;hb=b7f077d7bc28649f6bd369fadec01219e725a9c6;hp=6d269cce7aa13c4593540f6aa80be389e3ffc720;hpb=4ba3069fea9f0771dad3f4906b305ab50d5a1b30;p=karo-tx-linux.git diff --git a/kernel/res_counter.c b/kernel/res_counter.c index 6d269cce7aa1..d508363858b3 100644 --- a/kernel/res_counter.c +++ b/kernel/res_counter.c @@ -66,6 +66,31 @@ done: return ret; } +int res_counter_charge_nofail(struct res_counter *counter, unsigned long val, + struct res_counter **limit_fail_at) +{ + int ret, r; + unsigned long flags; + struct res_counter *c; + + r = ret = 0; + *limit_fail_at = NULL; + local_irq_save(flags); + for (c = counter; c != NULL; c = c->parent) { + spin_lock(&c->lock); + r = res_counter_charge_locked(c, val); + if (r) + c->usage += val; + spin_unlock(&c->lock); + if (r < 0 && ret == 0) { + *limit_fail_at = c; + ret = r; + } + } + local_irq_restore(flags); + + return ret; +} void res_counter_uncharge_locked(struct res_counter *counter, unsigned long val) { if (WARN_ON(counter->usage < val))