[PATCH 10/10] memcg: check memcg dirty limits in page writeback

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Greg Thelen
Date: Sunday, October 3, 2010 - 11:58 pm

If the current process is in a non-root memcg, then
global_dirty_limits() will consider the memcg dirty limit.
This allows different cgroups to have distinct dirty limits
which trigger direct and background writeback at different
levels.

Signed-off-by: Andrea Righi <arighi@develer.com>
Signed-off-by: Greg Thelen <gthelen@google.com>
---
 mm/page-writeback.c |   87 ++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 72 insertions(+), 15 deletions(-)

diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index a0bb3e2..c1db336 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -180,7 +180,7 @@ static unsigned long highmem_dirtyable_memory(unsigned long total)
  * Returns the numebr of pages that can currently be freed and used
  * by the kernel for direct mappings.
  */
-static unsigned long determine_dirtyable_memory(void)
+static unsigned long get_global_dirtyable_memory(void)
 {
 	unsigned long x;
 
@@ -192,6 +192,58 @@ static unsigned long determine_dirtyable_memory(void)
 	return x + 1;	/* Ensure that we never return 0 */
 }
 
+static unsigned long get_dirtyable_memory(void)
+{
+	unsigned long memory;
+	s64 memcg_memory;
+
+	memory = get_global_dirtyable_memory();
+	if (!mem_cgroup_has_dirty_limit())
+		return memory;
+	memcg_memory = mem_cgroup_page_stat(MEMCG_NR_DIRTYABLE_PAGES);
+	BUG_ON(memcg_memory < 0);
+
+	return min((unsigned long)memcg_memory, memory);
+}
+
+static long get_reclaimable_pages(void)
+{
+	s64 ret;
+
+	if (!mem_cgroup_has_dirty_limit())
+		return global_page_state(NR_FILE_DIRTY) +
+			global_page_state(NR_UNSTABLE_NFS);
+	ret = mem_cgroup_page_stat(MEMCG_NR_RECLAIM_PAGES);
+	BUG_ON(ret < 0);
+
+	return ret;
+}
+
+static long get_writeback_pages(void)
+{
+	s64 ret;
+
+	if (!mem_cgroup_has_dirty_limit())
+		return global_page_state(NR_WRITEBACK);
+	ret = mem_cgroup_page_stat(MEMCG_NR_WRITEBACK);
+	BUG_ON(ret < 0);
+
+	return ret;
+}
+
+static unsigned long get_dirty_writeback_pages(void)
+{
+	s64 ret;
+
+	if (!mem_cgroup_has_dirty_limit())
+		return global_page_state(NR_UNSTABLE_NFS) +
+			global_page_state(NR_WRITEBACK);
+	ret = mem_cgroup_page_stat(MEMCG_NR_DIRTY_WRITEBACK_PAGES);
+	BUG_ON(ret < 0);
+
+	return ret;
+}
+
 /*
  * couple the period to the dirty_ratio:
  *
@@ -204,7 +256,7 @@ static int calc_period_shift(void)
 	if (vm_dirty_bytes)
 		dirty_total = vm_dirty_bytes / PAGE_SIZE;
 	else
-		dirty_total = (vm_dirty_ratio * determine_dirtyable_memory()) /
+		dirty_total = (vm_dirty_ratio * get_global_dirtyable_memory()) /
 				100;
 	return 2 + ilog2(dirty_total - 1);
 }
@@ -410,18 +462,23 @@ void global_dirty_limits(unsigned long *pbackground, unsigned long *pdirty)
 {
 	unsigned long background;
 	unsigned long dirty;
-	unsigned long available_memory = determine_dirtyable_memory();
+	unsigned long available_memory = get_dirtyable_memory();
 	struct task_struct *tsk;
+	struct vm_dirty_param dirty_param;
 
-	if (vm_dirty_bytes)
-		dirty = DIV_ROUND_UP(vm_dirty_bytes, PAGE_SIZE);
+	get_vm_dirty_param(&dirty_param);
+
+	if (dirty_param.dirty_bytes)
+		dirty = DIV_ROUND_UP(dirty_param.dirty_bytes, PAGE_SIZE);
 	else
-		dirty = (vm_dirty_ratio * available_memory) / 100;
+		dirty = (dirty_param.dirty_ratio * available_memory) / 100;
 
-	if (dirty_background_bytes)
-		background = DIV_ROUND_UP(dirty_background_bytes, PAGE_SIZE);
+	if (dirty_param.dirty_background_bytes)
+		background = DIV_ROUND_UP(dirty_param.dirty_background_bytes,
+					  PAGE_SIZE);
 	else
-		background = (dirty_background_ratio * available_memory) / 100;
+		background = (dirty_param.dirty_background_ratio *
+			      available_memory) / 100;
 
 	if (background >= dirty)
 		background = dirty / 2;
@@ -493,9 +550,8 @@ static void balance_dirty_pages(struct address_space *mapping,
 			.range_cyclic	= 1,
 		};
 
-		nr_reclaimable = global_page_state(NR_FILE_DIRTY) +
-					global_page_state(NR_UNSTABLE_NFS);
-		nr_writeback = global_page_state(NR_WRITEBACK);
+		nr_reclaimable = get_reclaimable_pages();
+		nr_writeback = get_writeback_pages();
 
 		global_dirty_limits(&background_thresh, &dirty_thresh);
 
@@ -652,6 +708,7 @@ void throttle_vm_writeout(gfp_t gfp_mask)
 {
 	unsigned long background_thresh;
 	unsigned long dirty_thresh;
+	unsigned long dirty;
 
         for ( ; ; ) {
 		global_dirty_limits(&background_thresh, &dirty_thresh);
@@ -662,9 +719,9 @@ void throttle_vm_writeout(gfp_t gfp_mask)
                  */
                 dirty_thresh += dirty_thresh / 10;      /* wheeee... */
 
-                if (global_page_state(NR_UNSTABLE_NFS) +
-			global_page_state(NR_WRITEBACK) <= dirty_thresh)
-                        	break;
+		dirty = get_dirty_writeback_pages();
+		if (dirty <= dirty_thresh)
+			break;
                 congestion_wait(BLK_RW_ASYNC, HZ/10);
 
 		/*
-- 
1.7.1

--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00/10] memcg: per cgroup dirty page accounting, Greg Thelen, (Sun Oct 3, 11:57 pm)
[PATCH 07/10] memcg: add dirty limits to mem_cgroup, Greg Thelen, (Sun Oct 3, 11:58 pm)
[PATCH 10/10] memcg: check memcg dirty limits in page writ ..., Greg Thelen, (Sun Oct 3, 11:58 pm)
Re: [PATCH 01/10] memcg: add page_cgroup flags for dirty p ..., KAMEZAWA Hiroyuki, (Mon Oct 4, 11:20 pm)
Re: [PATCH 02/10] memcg: document cgroup dirty memory inte ..., KAMEZAWA Hiroyuki, (Mon Oct 4, 11:48 pm)
Re: [PATCH 03/10] memcg: create extensible page stat updat ..., KAMEZAWA Hiroyuki, (Mon Oct 4, 11:51 pm)
Re: [PATCH 04/10] memcg: disable local interrupts in lock_ ..., KAMEZAWA Hiroyuki, (Mon Oct 4, 11:54 pm)
Re: [PATCH 06/10] memcg: add kernel calls for memcg dirty ..., KAMEZAWA Hiroyuki, (Mon Oct 4, 11:55 pm)
Re: [PATCH 07/10] memcg: add dirty limits to mem_cgroup, KAMEZAWA Hiroyuki, (Tue Oct 5, 12:07 am)
Re: [PATCH 08/10] memcg: add cgroupfs interface to memcg d ..., KAMEZAWA Hiroyuki, (Tue Oct 5, 12:13 am)
Re: [PATCH 09/10] writeback: make determine_dirtyable_memo ..., KAMEZAWA Hiroyuki, (Tue Oct 5, 12:15 am)
Re: [PATCH 05/10] memcg: add dirty page accounting infrast ..., KAMEZAWA Hiroyuki, (Tue Oct 5, 12:22 am)
Re: [PATCH 10/10] memcg: check memcg dirty limits in page ..., KAMEZAWA Hiroyuki, (Tue Oct 5, 12:29 am)
Re: [PATCH 08/10] memcg: add cgroupfs interface to memcg d ..., KAMEZAWA Hiroyuki, (Tue Oct 5, 12:31 am)
Re: [PATCH 07/10] memcg: add dirty limits to mem_cgroup, KAMEZAWA Hiroyuki, (Wed Oct 6, 5:13 pm)
Re: [PATCH 07/10] memcg: add dirty limits to mem_cgroup, KAMEZAWA Hiroyuki, (Wed Oct 6, 5:48 pm)
[PATCH] memcg: reduce lock time at move charge (Was Re: [P ..., KAMEZAWA Hiroyuki, (Wed Oct 6, 11:21 pm)
[PATCH] memcg: lock-free clear page writeback (Was Re: [P ..., KAMEZAWA Hiroyuki, (Wed Oct 6, 11:24 pm)
Re: [PATCH] memcg: reduce lock time at move charge (Was Re ..., Daisuke Nishimura, (Thu Oct 7, 12:28 am)
Re: [PATCH] memcg: reduce lock time at move charge (Was Re ..., KAMEZAWA Hiroyuki, (Thu Oct 7, 12:42 am)
Re: [PATCH] memcg: lock-free clear page writeback (Was Re ..., KAMEZAWA Hiroyuki, (Thu Oct 7, 2:05 am)
Re: [PATCH v2] memcg: reduce lock time at move charge (Was ..., KAMEZAWA Hiroyuki, (Thu Oct 7, 10:12 pm)
Re: [PATCH 07/10] memcg: add dirty limits to mem_cgroup, KAMEZAWA Hiroyuki, (Mon Oct 11, 5:55 pm)
Re: [PATCH v2] memcg: reduce lock time at move charge (Was ..., KAMEZAWA Hiroyuki, (Mon Oct 11, 8:42 pm)
Re: [PATCH v2] memcg: reduce lock time at move charge (Was ..., Daisuke Nishimura, (Mon Oct 11, 8:56 pm)
Re: [PATCH v2] memcg: reduce lock time at move charge (Was ..., KAMEZAWA Hiroyuki, (Mon Oct 11, 10:01 pm)
[PATCH v4] memcg: reduce lock time at move charge, KAMEZAWA Hiroyuki, (Mon Oct 11, 10:48 pm)
Re: [PATCH v4] memcg: reduce lock time at move charge, Daisuke Nishimura, (Mon Oct 11, 11:23 pm)
Re: [PATCH 07/10] memcg: add dirty limits to mem_cgroup, Greg Thelen, (Tue Oct 12, 12:32 am)
Re: [PATCH 07/10] memcg: add dirty limits to mem_cgroup, KAMEZAWA Hiroyuki, (Tue Oct 12, 1:38 am)
Re: [PATCH 00/10] memcg: per cgroup dirty page accounting, KAMEZAWA Hiroyuki, (Sun Oct 17, 10:56 pm)