|
@@ -302,7 +302,7 @@ retry:
|
|
|
* If we created the page_cgroup, we should free it on exceeding
|
|
|
* the cgroup limit.
|
|
|
*/
|
|
|
- while (res_counter_charge(&mem->res, 1)) {
|
|
|
+ while (res_counter_charge(&mem->res, PAGE_SIZE)) {
|
|
|
if (try_to_free_mem_cgroup_pages(mem))
|
|
|
continue;
|
|
|
|
|
@@ -341,7 +341,7 @@ retry:
|
|
|
kfree(pc);
|
|
|
pc = race_pc;
|
|
|
atomic_inc(&pc->ref_cnt);
|
|
|
- res_counter_uncharge(&mem->res, 1);
|
|
|
+ res_counter_uncharge(&mem->res, PAGE_SIZE);
|
|
|
css_put(&mem->css);
|
|
|
goto done;
|
|
|
}
|
|
@@ -384,7 +384,7 @@ void mem_cgroup_uncharge(struct page_cgroup *pc)
|
|
|
css_put(&mem->css);
|
|
|
page_assign_page_cgroup(page, NULL);
|
|
|
unlock_page_cgroup(page);
|
|
|
- res_counter_uncharge(&mem->res, 1);
|
|
|
+ res_counter_uncharge(&mem->res, PAGE_SIZE);
|
|
|
|
|
|
spin_lock_irqsave(&mem->lru_lock, flags);
|
|
|
list_del_init(&pc->lru);
|
|
@@ -393,12 +393,26 @@ void mem_cgroup_uncharge(struct page_cgroup *pc)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static ssize_t mem_cgroup_read(struct cgroup *cont, struct cftype *cft,
|
|
|
- struct file *file, char __user *userbuf, size_t nbytes,
|
|
|
- loff_t *ppos)
|
|
|
+int mem_cgroup_write_strategy(char *buf, unsigned long long *tmp)
|
|
|
+{
|
|
|
+ *tmp = memparse(buf, &buf);
|
|
|
+ if (*buf != '\0')
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Round up the value to the closest page size
|
|
|
+ */
|
|
|
+ *tmp = ((*tmp + PAGE_SIZE - 1) >> PAGE_SHIFT) << PAGE_SHIFT;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static ssize_t mem_cgroup_read(struct cgroup *cont,
|
|
|
+ struct cftype *cft, struct file *file,
|
|
|
+ char __user *userbuf, size_t nbytes, loff_t *ppos)
|
|
|
{
|
|
|
return res_counter_read(&mem_cgroup_from_cont(cont)->res,
|
|
|
- cft->private, userbuf, nbytes, ppos);
|
|
|
+ cft->private, userbuf, nbytes, ppos,
|
|
|
+ NULL);
|
|
|
}
|
|
|
|
|
|
static ssize_t mem_cgroup_write(struct cgroup *cont, struct cftype *cft,
|
|
@@ -406,17 +420,18 @@ static ssize_t mem_cgroup_write(struct cgroup *cont, struct cftype *cft,
|
|
|
size_t nbytes, loff_t *ppos)
|
|
|
{
|
|
|
return res_counter_write(&mem_cgroup_from_cont(cont)->res,
|
|
|
- cft->private, userbuf, nbytes, ppos);
|
|
|
+ cft->private, userbuf, nbytes, ppos,
|
|
|
+ mem_cgroup_write_strategy);
|
|
|
}
|
|
|
|
|
|
static struct cftype mem_cgroup_files[] = {
|
|
|
{
|
|
|
- .name = "usage",
|
|
|
+ .name = "usage_in_bytes",
|
|
|
.private = RES_USAGE,
|
|
|
.read = mem_cgroup_read,
|
|
|
},
|
|
|
{
|
|
|
- .name = "limit",
|
|
|
+ .name = "limit_in_bytes",
|
|
|
.private = RES_LIMIT,
|
|
|
.write = mem_cgroup_write,
|
|
|
.read = mem_cgroup_read,
|