Introduce page_cgroup flags to keep track of file cache pages. Signed-off-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> Signed-off-by: Andrea Righi <arighi@xxxxxxxxxxx> --- include/linux/page_cgroup.h | 45 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-) diff --git a/include/linux/page_cgroup.h b/include/linux/page_cgroup.h index 30b0813..dc66bee 100644 --- a/include/linux/page_cgroup.h +++ b/include/linux/page_cgroup.h @@ -39,6 +39,12 @@ enum { PCG_CACHE, /* charged as cache */ PCG_USED, /* this object is in use. */ PCG_ACCT_LRU, /* page has been accounted for */ + PCG_MIGRATE_LOCK, /* used for mutual execution of account migration */ + PCG_ACCT_FILE_MAPPED, /* page is accounted as file rss*/ + PCG_ACCT_DIRTY, /* page is dirty */ + PCG_ACCT_WRITEBACK, /* page is being written back to disk */ + PCG_ACCT_WRITEBACK_TEMP, /* page is used as temporary buffer for FUSE */ + PCG_ACCT_UNSTABLE_NFS, /* NFS page not yet committed to the server */ }; #define TESTPCGFLAG(uname, lname) \ @@ -73,6 +79,27 @@ CLEARPCGFLAG(AcctLRU, ACCT_LRU) TESTPCGFLAG(AcctLRU, ACCT_LRU) TESTCLEARPCGFLAG(AcctLRU, ACCT_LRU) +/* File cache and dirty memory flags */ +TESTPCGFLAG(FileMapped, ACCT_FILE_MAPPED) +SETPCGFLAG(FileMapped, ACCT_FILE_MAPPED) +CLEARPCGFLAG(FileMapped, ACCT_FILE_MAPPED) + +TESTPCGFLAG(Dirty, ACCT_DIRTY) +SETPCGFLAG(Dirty, ACCT_DIRTY) +CLEARPCGFLAG(Dirty, ACCT_DIRTY) + +TESTPCGFLAG(Writeback, ACCT_WRITEBACK) +SETPCGFLAG(Writeback, ACCT_WRITEBACK) +CLEARPCGFLAG(Writeback, ACCT_WRITEBACK) + +TESTPCGFLAG(WritebackTemp, ACCT_WRITEBACK_TEMP) +SETPCGFLAG(WritebackTemp, ACCT_WRITEBACK_TEMP) +CLEARPCGFLAG(WritebackTemp, ACCT_WRITEBACK_TEMP) + +TESTPCGFLAG(UnstableNFS, ACCT_UNSTABLE_NFS) +SETPCGFLAG(UnstableNFS, ACCT_UNSTABLE_NFS) +CLEARPCGFLAG(UnstableNFS, ACCT_UNSTABLE_NFS) + static inline int page_cgroup_nid(struct page_cgroup *pc) { return page_to_nid(pc->page); @@ -83,6 +110,9 @@ static inline enum zone_type page_cgroup_zid(struct page_cgroup *pc) return page_zonenum(pc->page); } +/* + * lock_page_cgroup() should not be held under mapping->tree_lock + */ static inline void lock_page_cgroup(struct page_cgroup *pc) { bit_spin_lock(PCG_LOCK, &pc->flags); @@ -93,6 +123,21 @@ static inline void unlock_page_cgroup(struct page_cgroup *pc) bit_spin_unlock(PCG_LOCK, &pc->flags); } +/* + * This lock is not be lock for charge/uncharge but for account moving. + * i.e. overwrite pc->mem_cgroup. The lock owner should guarantee by itself + * the page is uncharged while we hold this. + */ +static inline void lock_page_cgroup_migrate(struct page_cgroup *pc) +{ + bit_spin_lock(PCG_MIGRATE_LOCK, &pc->flags); +} + +static inline void unlock_page_cgroup_migrate(struct page_cgroup *pc) +{ + bit_spin_unlock(PCG_MIGRATE_LOCK, &pc->flags); +} + #else /* CONFIG_CGROUP_MEM_RES_CTLR */ struct page_cgroup; -- 1.6.3.3 -- 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>