X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-kernel.git;a=blobdiff_plain;f=kernel%2Fres_counter.c;h=f275c8eca772c4dfe6bcdda6b1253a65fefe3e83;hp=16cbec2d5d60514e67c14907e6d11f91cfecafd1;hb=762b8291be6944bd891fbe2c8976a2b2e5bbc726;hpb=0afc2edfada50980bec999f94dcea26ebad3dda6 diff --git a/kernel/res_counter.c b/kernel/res_counter.c index 16cbec2d5d60..f275c8eca772 100644 --- a/kernel/res_counter.c +++ b/kernel/res_counter.c @@ -10,8 +10,10 @@ #include #include #include +#include #include #include +#include void res_counter_init(struct res_counter *counter) { @@ -27,6 +29,8 @@ int res_counter_charge_locked(struct res_counter *counter, unsigned long val) } counter->usage += val; + if (counter->usage > counter->max_usage) + counter->max_usage = counter->usage; return 0; } @@ -65,6 +69,8 @@ res_counter_member(struct res_counter *counter, int member) switch (member) { case RES_USAGE: return &counter->usage; + case RES_MAX_USAGE: + return &counter->max_usage; case RES_LIMIT: return &counter->limit; case RES_FAILCNT: @@ -92,43 +98,42 @@ ssize_t res_counter_read(struct res_counter *counter, int member, pos, buf, s - buf); } -ssize_t res_counter_write(struct res_counter *counter, int member, - const char __user *userbuf, size_t nbytes, loff_t *pos, - int (*write_strategy)(char *st_buf, unsigned long long *val)) +u64 res_counter_read_u64(struct res_counter *counter, int member) { - int ret; - char *buf, *end; - unsigned long flags; - unsigned long long tmp, *val; + return *res_counter_member(counter, member); +} - buf = kmalloc(nbytes + 1, GFP_KERNEL); - ret = -ENOMEM; - if (buf == NULL) - goto out; +int res_counter_memparse_write_strategy(const char *buf, + unsigned long long *res) +{ + char *end; + /* FIXME - make memparse() take const char* args */ + *res = memparse((char *)buf, &end); + if (*end != '\0') + return -EINVAL; - buf[nbytes] = '\0'; - ret = -EFAULT; - if (copy_from_user(buf, userbuf, nbytes)) - goto out_free; + *res = PAGE_ALIGN(*res); + return 0; +} - ret = -EINVAL; +int res_counter_write(struct res_counter *counter, int member, + const char *buf, write_strategy_fn write_strategy) +{ + char *end; + unsigned long flags; + unsigned long long tmp, *val; if (write_strategy) { - if (write_strategy(buf, &tmp)) { - goto out_free; - } + if (write_strategy(buf, &tmp)) + return -EINVAL; } else { tmp = simple_strtoull(buf, &end, 10); if (*end != '\0') - goto out_free; + return -EINVAL; } spin_lock_irqsave(&counter->lock, flags); val = res_counter_member(counter, member); *val = tmp; spin_unlock_irqrestore(&counter->lock, flags); - ret = nbytes; -out_free: - kfree(buf); -out: - return ret; + return 0; }