[PATCH v3 06/11] memcg: add kernel calls for memcg dirty page stats

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Greg Thelen
Date: Monday, October 18, 2010 - 5:39 pm

Add calls into memcg dirty page accounting.  Notify memcg when pages
transition between clean, file dirty, writeback, and unstable nfs.
This allows the memory controller to maintain an accurate view of
the amount of its memory that is dirty.

Signed-off-by: Greg Thelen <gthelen@google.com>
Signed-off-by: Andrea Righi <arighi@develer.com>
---
 fs/nfs/write.c      |    4 ++++
 mm/filemap.c        |    1 +
 mm/page-writeback.c |    4 ++++
 mm/truncate.c       |    1 +
 4 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 4c14c17..a3c39f7 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -450,6 +450,7 @@ nfs_mark_request_commit(struct nfs_page *req)
 			NFS_PAGE_TAG_COMMIT);
 	nfsi->ncommit++;
 	spin_unlock(&inode->i_lock);
+	mem_cgroup_inc_page_stat(req->wb_page, MEMCG_NR_FILE_UNSTABLE_NFS);
 	inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
 	inc_bdi_stat(req->wb_page->mapping->backing_dev_info, BDI_RECLAIMABLE);
 	__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
@@ -461,6 +462,7 @@ nfs_clear_request_commit(struct nfs_page *req)
 	struct page *page = req->wb_page;
 
 	if (test_and_clear_bit(PG_CLEAN, &(req)->wb_flags)) {
+		mem_cgroup_dec_page_stat(page, MEMCG_NR_FILE_UNSTABLE_NFS);
 		dec_zone_page_state(page, NR_UNSTABLE_NFS);
 		dec_bdi_stat(page->mapping->backing_dev_info, BDI_RECLAIMABLE);
 		return 1;
@@ -1316,6 +1318,8 @@ nfs_commit_list(struct inode *inode, struct list_head *head, int how)
 		req = nfs_list_entry(head->next);
 		nfs_list_remove_request(req);
 		nfs_mark_request_commit(req);
+		mem_cgroup_dec_page_stat(req->wb_page,
+					 MEMCG_NR_FILE_UNSTABLE_NFS);
 		dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
 		dec_bdi_stat(req->wb_page->mapping->backing_dev_info,
 				BDI_RECLAIMABLE);
diff --git a/mm/filemap.c b/mm/filemap.c
index 49b2d2e..f6bd6f2 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -146,6 +146,7 @@ void __remove_from_page_cache(struct page *page)
 	 * having removed the page entirely.
 	 */
 	if (PageDirty(page) && mapping_cap_account_dirty(mapping)) {
+		mem_cgroup_dec_page_stat(page, MEMCG_NR_FILE_DIRTY);
 		dec_zone_page_state(page, NR_FILE_DIRTY);
 		dec_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE);
 	}
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index b840afa..820eb66 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -1114,6 +1114,7 @@ int __set_page_dirty_no_writeback(struct page *page)
 void account_page_dirtied(struct page *page, struct address_space *mapping)
 {
 	if (mapping_cap_account_dirty(mapping)) {
+		mem_cgroup_inc_page_stat(page, MEMCG_NR_FILE_DIRTY);
 		__inc_zone_page_state(page, NR_FILE_DIRTY);
 		__inc_zone_page_state(page, NR_DIRTIED);
 		__inc_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE);
@@ -1303,6 +1304,7 @@ int clear_page_dirty_for_io(struct page *page)
 		 * for more comments.
 		 */
 		if (TestClearPageDirty(page)) {
+			mem_cgroup_dec_page_stat(page, MEMCG_NR_FILE_DIRTY);
 			dec_zone_page_state(page, NR_FILE_DIRTY);
 			dec_bdi_stat(mapping->backing_dev_info,
 					BDI_RECLAIMABLE);
@@ -1333,6 +1335,7 @@ int test_clear_page_writeback(struct page *page)
 				__dec_bdi_stat(bdi, BDI_WRITEBACK);
 				__bdi_writeout_inc(bdi);
 			}
+			mem_cgroup_dec_page_stat(page, MEMCG_NR_FILE_WRITEBACK);
 		}
 		spin_unlock_irqrestore(&mapping->tree_lock, flags);
 	} else {
@@ -1360,6 +1363,7 @@ int test_set_page_writeback(struct page *page)
 						PAGECACHE_TAG_WRITEBACK);
 			if (bdi_cap_account_writeback(bdi))
 				__inc_bdi_stat(bdi, BDI_WRITEBACK);
+			mem_cgroup_inc_page_stat(page, MEMCG_NR_FILE_WRITEBACK);
 		}
 		if (!PageDirty(page))
 			radix_tree_tag_clear(&mapping->page_tree,
diff --git a/mm/truncate.c b/mm/truncate.c
index cd94607..54cca83 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c
@@ -76,6 +76,7 @@ void cancel_dirty_page(struct page *page, unsigned int account_size)
 	if (TestClearPageDirty(page)) {
 		struct address_space *mapping = page->mapping;
 		if (mapping && mapping_cap_account_dirty(mapping)) {
+			mem_cgroup_dec_page_stat(page, MEMCG_NR_FILE_DIRTY);
 			dec_zone_page_state(page, NR_FILE_DIRTY);
 			dec_bdi_stat(mapping->backing_dev_info,
 					BDI_RECLAIMABLE);
-- 
1.7.1

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

Messages in current thread:
[PATCH v3 06/11] memcg: add kernel calls for memcg dirty p ..., Greg Thelen, (Mon Oct 18, 5:39 pm)
[PATCH v3 07/11] memcg: add dirty limits to mem_cgroup, Greg Thelen, (Mon Oct 18, 5:39 pm)
Re: [PATCH v3 04/11] memcg: add lock to synchronize page a ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 5:45 pm)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 5:46 pm)
Re: [PATCH v3 03/11] memcg: create extensible page stat up ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 5:47 pm)
Re: [PATCH v3 05/11] memcg: add dirty page accounting infr ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 5:49 pm)
Re: [PATCH v3 06/11] memcg: add kernel calls for memcg dir ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 5:51 pm)
Re: [PATCH v3 07/11] memcg: add dirty limits to mem_cgroup, KAMEZAWA Hiroyuki, (Mon Oct 18, 5:53 pm)
Re: [PATCH v3 08/11] memcg: CPU hotplug lockdep warning fix, KAMEZAWA Hiroyuki, (Mon Oct 18, 5:54 pm)
Re: [PATCH v3 09/11] memcg: add cgroupfs interface to memc ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 5:56 pm)
Re: [PATCH v3 10/11] writeback: make determine_dirtyable_m ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 5:57 pm)
Re: [PATCH v3 11/11] memcg: check memcg dirty limits in pa ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 6:00 pm)
Re: [PATCH v3 01/11] memcg: add page_cgroup flags for dirt ..., Daisuke Nishimura, (Mon Oct 18, 9:31 pm)
[RFC][PATCH 1/2] memcg: move_account optimization by redu ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 9:43 pm)
[RFC][PATCH 2/2] memcg: move_account optimization by redu ..., KAMEZAWA Hiroyuki, (Mon Oct 18, 9:45 pm)
Re: [PATCH v3 03/11] memcg: create extensible page stat up ..., Daisuke Nishimura, (Mon Oct 18, 9:52 pm)
Re: [PATCH v3 04/11] memcg: add lock to synchronize page a ..., Daisuke Nishimura, (Mon Oct 18, 10:03 pm)
Re: [PATCH v3 06/11] memcg: add kernel calls for memcg dir ..., Daisuke Nishimura, (Tue Oct 19, 12:03 am)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., Daisuke Nishimura, (Tue Oct 19, 1:27 am)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 5:11 pm)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., Daisuke Nishimura, (Tue Oct 19, 5:48 pm)
Re: [PATCH v3 07/11] memcg: add dirty limits to mem_cgroup, Daisuke Nishimura, (Tue Oct 19, 5:50 pm)
Re: [PATCH v3 05/11] memcg: add dirty page accounting infr ..., Daisuke Nishimura, (Tue Oct 19, 5:53 pm)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 6:14 pm)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 7:24 pm)
[PATCH][memcg+dirtylimit] Fix overwriting global vm dirty ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 8:21 pm)
Re: [PATCH v3 09/11] memcg: add cgroupfs interface to memc ..., Daisuke Nishimura, (Tue Oct 19, 8:31 pm)
Re: [PATCH v3 09/11] memcg: add cgroupfs interface to memc ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 8:44 pm)
Re: [PATCH v3 09/11] memcg: add cgroupfs interface to memc ..., Daisuke Nishimura, (Tue Oct 19, 8:46 pm)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., Daisuke Nishimura, (Tue Oct 19, 8:47 pm)
Re: [PATCH v3 10/11] writeback: make determine_dirtyable_m ..., Daisuke Nishimura, (Tue Oct 19, 8:47 pm)
Re: [PATCH v3 08/11] memcg: CPU hotplug lockdep warning fix, Daisuke Nishimura, (Tue Oct 19, 8:47 pm)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 9:06 pm)
Re: [PATCH][memcg+dirtylimit] Fix overwriting global vm d ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 9:14 pm)
Re: [PATCH v3 11/11] memcg: check memcg dirty limits in pa ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 9:18 pm)
Re: [PATCH v3 02/11] memcg: document cgroup dirty memory i ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 9:26 pm)
Re: [PATCH v3 11/11] memcg: check memcg dirty limits in pa ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 9:33 pm)
Re: [PATCH v3 11/11] memcg: check memcg dirty limits in pa ..., Daisuke Nishimura, (Tue Oct 19, 9:34 pm)
[PATCH v2][memcg+dirtylimit] Fix overwriting global vm di ..., KAMEZAWA Hiroyuki, (Tue Oct 19, 10:02 pm)
Re: [PATCH v3 11/11] memcg: check memcg dirty limits in pa ..., Daisuke Nishimura, (Tue Oct 19, 10:25 pm)
Re: [PATCH v2][memcg+dirtylimit] Fix overwriting global v ..., Daisuke Nishimura, (Tue Oct 19, 11:09 pm)
Re: [PATCH v2][memcg+dirtylimit] Fix overwriting global v ..., KAMEZAWA Hiroyuki, (Wed Oct 20, 5:10 pm)
Re: [PATCH v2][memcg+dirtylimit] Fix overwriting global v ..., KAMEZAWA Hiroyuki, (Sun Oct 24, 5:24 pm)
Re: [PATCH v2][memcg+dirtylimit] Fix overwriting global v ..., Daisuke Nishimura, (Sun Oct 24, 7:00 pm)
Re: [PATCH v2][memcg+dirtylimit] Fix overwriting global v ..., KAMEZAWA Hiroyuki, (Mon Oct 25, 12:08 am)