aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2011-03-22 19:30:52 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-03-22 20:44:02 -0400
commitef6a3c63112e865d632ff7c478ba7c7160cad0d1 (patch)
treed0bd3ee2b79674e22b8dd3f318814cd4789697b8 /include
parent318b275fbca1ab9ec0862de71420e0e92c3d1aa7 (diff)
mm: add replace_page_cache_page() function
This function basically does: remove_from_page_cache(old); page_cache_release(old); add_to_page_cache_locked(new); Except it does this atomically, so there's no possibility for the "add" to fail because of a race. If memory cgroups are enabled, then the memory cgroup charge is also moved from the old page to the new. This function is currently used by fuse to move pages into the page cache on read, instead of copying the page contents. [minchan.kim@gmail.com: add freepage() hook to replace_page_cache_page()] Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Acked-by: Rik van Riel <riel@redhat.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Mel Gorman <mel@csn.ul.ie> Signed-off-by: Minchan Kim <minchan.kim@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/memcontrol.h4
-rw-r--r--include/linux/pagemap.h1
2 files changed, 3 insertions, 2 deletions
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index f512e189be5a..a1a1e5384f6e 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -96,7 +96,7 @@ extern struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem);
96 96
97extern int 97extern int
98mem_cgroup_prepare_migration(struct page *page, 98mem_cgroup_prepare_migration(struct page *page,
99 struct page *newpage, struct mem_cgroup **ptr); 99 struct page *newpage, struct mem_cgroup **ptr, gfp_t gfp_mask);
100extern void mem_cgroup_end_migration(struct mem_cgroup *mem, 100extern void mem_cgroup_end_migration(struct mem_cgroup *mem,
101 struct page *oldpage, struct page *newpage, bool migration_ok); 101 struct page *oldpage, struct page *newpage, bool migration_ok);
102 102
@@ -249,7 +249,7 @@ static inline struct cgroup_subsys_state *mem_cgroup_css(struct mem_cgroup *mem)
249 249
250static inline int 250static inline int
251mem_cgroup_prepare_migration(struct page *page, struct page *newpage, 251mem_cgroup_prepare_migration(struct page *page, struct page *newpage,
252 struct mem_cgroup **ptr) 252 struct mem_cgroup **ptr, gfp_t gfp_mask)
253{ 253{
254 return 0; 254 return 0;
255} 255}
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 9c66e994540f..26946ad483bf 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -457,6 +457,7 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping,
457 pgoff_t index, gfp_t gfp_mask); 457 pgoff_t index, gfp_t gfp_mask);
458extern void remove_from_page_cache(struct page *page); 458extern void remove_from_page_cache(struct page *page);
459extern void __remove_from_page_cache(struct page *page); 459extern void __remove_from_page_cache(struct page *page);
460int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask);
460 461
461/* 462/*
462 * Like add_to_page_cache_locked, but used to add newly allocated pages: 463 * Like add_to_page_cache_locked, but used to add newly allocated pages: