Re: [PATCH 08/10] memcg: add cgroupfs interface to memcg dirty limits

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



* Greg Thelen <gthelen@xxxxxxxxxx> [2010-10-03 23:58:03]:

> Add cgroupfs interface to memcg dirty page limits:
>   Direct write-out is controlled with:
>   - memory.dirty_ratio
>   - memory.dirty_bytes
> 
>   Background write-out is controlled with:
>   - memory.dirty_background_ratio
>   - memory.dirty_background_bytes
> 
> Signed-off-by: Andrea Righi <arighi@xxxxxxxxxxx>
> Signed-off-by: Greg Thelen <gthelen@xxxxxxxxxx>
> ---

The added interface is not uniform with the rest of our write
operations. Does the patch below help? I did a quick compile and run
test.


Make writes to memcg dirty tunables more uniform

From: Balbir Singh <balbir@xxxxxxxxxxxxxxxxxx>

We today support 'M', 'm', 'k', 'K', 'g' and 'G' suffixes for
general memcg writes. This patch provides the same functionality
for dirty tunables.
---

 mm/memcontrol.c |   47 +++++++++++++++++++++++++++++++++++++----------
 1 files changed, 37 insertions(+), 10 deletions(-)


diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 2d45a0a..3c360e6 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -4323,6 +4323,41 @@ static u64 mem_cgroup_dirty_read(struct cgroup *cgrp, struct cftype *cft)
 }
 
 static int
+mem_cgroup_dirty_write_string(struct cgroup *cont, struct cftype *cft,
+				const char *buffer)
+{
+	struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);
+	int type = cft->private;
+	int ret = -EINVAL;
+	unsigned long long val;
+
+	if (cgrp->parent == NULL)
+		return ret;
+
+	switch (type) {
+	case MEM_CGROUP_DIRTY_BYTES:
+		/* This function does all necessary parse...reuse it */
+		ret = res_counter_memparse_write_strategy(buffer, &val);
+		if (ret)
+			break;
+		memcg->dirty_param.dirty_bytes = val;
+		memcg->dirty_param.dirty_ratio  = 0;
+		break;
+	case MEM_CGROUP_DIRTY_BACKGROUND_BYTES:
+		ret = res_counter_memparse_write_strategy(buffer, &val);
+		if (ret)
+			break;
+		memcg->dirty_param.dirty_background_bytes = val;
+		memcg->dirty_param.dirty_background_ratio = 0;
+		break;
+	default:
+		BUG();
+		break;
+	}
+	return ret;
+}
+
+static int
 mem_cgroup_dirty_write(struct cgroup *cgrp, struct cftype *cft, u64 val)
 {
 	struct mem_cgroup *memcg = mem_cgroup_from_cont(cgrp);
@@ -4338,18 +4373,10 @@ mem_cgroup_dirty_write(struct cgroup *cgrp, struct cftype *cft, u64 val)
 		memcg->dirty_param.dirty_ratio = val;
 		memcg->dirty_param.dirty_bytes = 0;
 		break;
-	case MEM_CGROUP_DIRTY_BYTES:
-		memcg->dirty_param.dirty_bytes = val;
-		memcg->dirty_param.dirty_ratio  = 0;
-		break;
 	case MEM_CGROUP_DIRTY_BACKGROUND_RATIO:
 		memcg->dirty_param.dirty_background_ratio = val;
 		memcg->dirty_param.dirty_background_bytes = 0;
 		break;
-	case MEM_CGROUP_DIRTY_BACKGROUND_BYTES:
-		memcg->dirty_param.dirty_background_bytes = val;
-		memcg->dirty_param.dirty_background_ratio = 0;
-		break;
 	default:
 		BUG();
 		break;
@@ -4429,7 +4456,7 @@ static struct cftype mem_cgroup_files[] = {
 	{
 		.name = "dirty_bytes",
 		.read_u64 = mem_cgroup_dirty_read,
-		.write_u64 = mem_cgroup_dirty_write,
+		.write_string = mem_cgroup_dirty_write_string,
 		.private = MEM_CGROUP_DIRTY_BYTES,
 	},
 	{
@@ -4441,7 +4468,7 @@ static struct cftype mem_cgroup_files[] = {
 	{
 		.name = "dirty_background_bytes",
 		.read_u64 = mem_cgroup_dirty_read,
-		.write_u64 = mem_cgroup_dirty_write,
+		.write_u64 = mem_cgroup_dirty_write_string,
 		.private = MEM_CGROUP_DIRTY_BACKGROUND_BYTES,
 	},
 };

-- 
	Three Cheers,
	Balbir

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@xxxxxxxxxx  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@xxxxxxxxx";> email@xxxxxxxxx </a>



[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]