Change page reference handling semantic of page cache
Subsystems (7)
cover Change page reference handling semantic of page cache
Now we increases page reference on add_to_page_cache but doesn't decrease it in remove_from_page_cache. Such asymmetric makes confusing about page reference so that caller should notice it and comment why they release page reference. It's not good API.
Long time ago, Hugh tried it[1] but gave up of reason which reiser4's drop_page had to unlock the page between removing it from page cache and doing the page_cache_release. But now the situation is changed. I think at least things in current mainline doesn't have any obstacles. The problem is fs or somethings out of mainline. If it has done such thing like reiser4, this patch could be a problem but they found it when compile time since we remove remove_from_page_cache.
[1] http://lkml.org/lkml/2004/10/24/140
The series configuration is following as.
[1/7] : This patch introduces new API delete_from_page_cache. [2,3,4,5/7] : Change remove_from_page_cache with delete_from_page_cache. Intentionally I divide patch per file since someone might have a concern about releasing page reference of delete_from_page_cache in somecase (ex, truncate.c)
[6/7] : Remove old API so out of fs can meet compile error when build time and can notice it.
[7/7] : Change __remove_from_page_cache with __delete_from_page_cache, too. In this time, I made all-in-one patch because it doesn't change old behavior so it has no concern. Just clean up patch.
Minchan Kim (7):
[1/7] Introduce delete_from_page_cache
[2/7] fuse: Change remove_from_page_cache
[3/7] tlbfs: Change remove_from_page_cache
[4/7] swap: Change remove_from_page_cache
[5/7] truncate: Change remove_from_page_cache
[6/7] Good bye remove_from_page_cache
[7/7] Change __remove_from_page_cache
fs/fuse/dev.c | 3 +-- fs/hugetlbfs/inode.c | 3 +-- include/linux/pagemap.h | 4 ++-- mm/filemap.c | 22 +++++++++++++++++----- mm/shmem.c | 3 +-- mm/truncate.c | 5 ++--- mm/vmscan.c | 2 +- 7 files changed, 25 insertions(+), 17 deletions(-)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 1/7 Introduce delete_from_page_cache
This function works as just wrapper remove_from_page_cache. The difference is that it decreases page references in itself. So caller have to make sure it has a page reference before calling.
This patch is ready for removing remove_from_page_cache.
--- include/linux/pagemap.h | 1 + mm/filemap.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-)
include/linux/pagemap.h +1 -0
@@ -457,6 +457,7 @@ int add_to_page_cache_lru(struct page *page, struct address_space *mapping, pgoff_t index, gfp_t gfp_mask);extern void remove_from_page_cache (struct page *page);extern void __remove_from_page_cache (struct page *page); +extern void delete_from_page_cache (struct page *page);/* * Like add_to_page_cache_locked, but used to add newly allocated pages:
mm/filemap.c +17 -0
@@ -166,6 +166,23 @@ void remove_from_page_cache(struct page *page) }EXPORT_SYMBOL (remove_from_page_cache); +/** +* delete_from_page_cache - delete page from page cache +* +* @page: the page which the kernel is trying to remove from page cache +* +* This must be called only on pages that have +* been verified to be in the page cache and locked. +* It will never put the page into the free list, +* the caller has a reference on the page. +*/ +void delete_from_page_cache (struct page *page) +{ +remove_from_page_cache (page); +page_cache_release (page); +} +EXPORT_SYMBOL (delete_from_page_cache); +static int sync_page (void *word) {struct address_space *mapping;
Signature · 8 lines
1.7.0.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 2/7 fuse: Change remove_from_page_cache
In reply to Minchan KimThis patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in delete_from_page_cache. So we don't need decreasing page reference by caller.
--- fs/fuse/dev.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
fs/fuse/dev.c +1 -2
@@ -737,8 +737,7 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep)if (WARN_ON (PageMlocked (oldpage))) goto out_fallback_unlock; -remove_from_page_cache (oldpage); -page_cache_release (oldpage); +delete_from_page_cache (oldpage); err =add_to_page_cache_locked (newpage, mapping, index,GFP_KERNEL );if (err) {
Signature · 1 line
1.7.0.4
Re: [PATCH 2/7] fuse: Change remove_from_page_cache
Quoted 8 lines · Minchan Kim
This patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in
delete_from_page_cache. So we don't need decreasing page reference by caller.Cc Miklos Szeredi <[email protected]>Signed-off-by Minchan Kim <[email protected]>Reviewed-by KAMEZAWA Hiroyuki <[email protected]>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 3/7 tlbfs: Change remove_from_page_cache
In reply to Minchan KimThis patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in delete_from_page_cache. So we don't need decreasing page reference by caller.
--- fs/hugetlbfs/inode.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
fs/hugetlbfs/inode.c +1 -2
@@ -332,8 +332,7 @@ static void truncate_huge_page(struct page *page) {cancel_dirty_page (page,/* No IO accounting for huge pages? */ 0 );ClearPageUptodate (page); -remove_from_page_cache (page); -put_page (page); +delete_from_page_cache (page); }static void truncate_hugepages (struct inode *inode,loff_t lstart)
Signature · 1 line
1.7.0.4
Re: [PATCH 3/7] tlbfs: Change remove_from_page_cache
Quoted 7 lines · Minchan Kim
This patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in
delete_from_page_cache. So we don't need decreasing page reference by caller.Cc William Irwin <[email protected]>Signed-off-by Minchan Kim <[email protected]>Reviewed-by KAMEZAWA Hiroyuki <[email protected]>
As Mel pointed out, that should be hugetlbfs in the subject. Otherwise, the patch looks good.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 4/7 swap: Change remove_from_page_cache
In reply to Minchan KimThis patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in delete_from_page_cache. So we don't need decreasing page reference by caller.
--- mm/shmem.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
mm/shmem.c +1 -2
@@ -1081,7 +1081,7 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)shmem_recalc_inode (inode);if (swap.val &&add_to_swap_cache (page, swap,GFP_ATOMIC ) ==0 ) { -remove_from_page_cache (page); +delete_from_page_cache (page);shmem_swp_set (info, entry, swap.val);shmem_swp_unmap (entry);if (list_empty (&info->swaplist))
@@ -1091,7 +1091,6 @@ static int shmem_writepage(struct page *page, struct writeback_control *wbc)spin_unlock (&info->lock);swap_shmem_alloc (swap);BUG_ON (page_mapped (page)); -page_cache_release (page);/* pagecache ref */ swap_writepage (page, wbc);if (inode) {mutex_lock (&shmem_swaplist_mutex);
Signature · 8 lines
1.7.0.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 4/7] swap: Change remove_from_page_cache
Quoted 9 lines · Minchan Kim
This patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in
delete_from_page_cache. So we don't need decreasing page reference by caller.Cc Hugh Dickins <[email protected]>Signed-off-by Minchan Kim <[email protected]>Reviewed-by KAMEZAWA Hiroyuki <[email protected]>--- mm/shmem.c | 3 +--
Patch subject should probably say 'shmem' instead of 'swap'.
Otherwise,
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 4/7] swap: Change remove_from_page_cache
Quoted 5 lines · Johannes Weiner
Quoted 4 lines · Minchan Kim
This patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in
delete_from_page_cache. So we don't need decreasing page reference by caller.
Quoted 7 lines
Quoted 5 lines
Cc Hugh Dickins <[email protected]>Signed-off-by Minchan Kim <[email protected]>Reviewed-by KAMEZAWA Hiroyuki <[email protected]>---
mm/shmem.c | 3 +--Patch subject should probably say 'shmem' instead of 'swap'.
Thanks, Hannes.
Will fix.
Quoted 4 lines
Otherwise,
Reviewed-by Johannes Weiner <[email protected]>
Signature · 2 lines
Kind regards, Minchan Kim
PATCH 5/7 truncate: Change remove_from_page_cache
In reply to Minchan KimThis patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in delete_from_page_cache. So we don't need decreasing page reference by caller.
--- mm/truncate.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
mm/truncate.c +1 -2
@@ -108,13 +108,12 @@ truncate_complete_page(struct address_space *mapping, struct page *page)cancel_dirty_page (page,PAGE_CACHE_SIZE );clear_page_mlock (page); -remove_from_page_cache (page); +delete_from_page_cache (page);ClearPageMappedToDisk (page);/* this must be after the remove_from_page_cache which * calls cleancache_put_page (and note page->mapping is now NULL) */ cleancache_flush_page (mapping, page); -page_cache_release (page);/* pagecache ref */ return 0 ; }
Signature · 8 lines
1.7.0.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 5/7] truncate: Change remove_from_page_cache
Quoted 11 lines · Minchan Kim
This patch series changes remove_from_page_cache's page ref counting rule. Page cache ref count is decreased in
delete_from_page_cache. So we don't need decreasing page reference by caller.Cc Dan Magenheimer <[email protected]>Cc Andi Kleen <[email protected]>Cc Nick Piggin <[email protected]>Cc Al Viro <[email protected]>Signed-off-by Minchan Kim <[email protected]>Reviewed-by KAMEZAWA Hiroyuki <[email protected]>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 6/7 Good bye remove_from_page_cache
In reply to Minchan KimNow delete_from_page_cache replaces remove_from_page_cache. So we remove remove_from_page_cache so fs or something out of mainline will notice it when compile time and can fix it.
--- include/linux/pagemap.h | 1 - mm/filemap.c | 27 +++++++++++---------------- 2 files changed, 11 insertions(+), 17 deletions(-)
include/linux/pagemap.h +0 -1
@@ -455,7 +455,6 @@ int add_to_page_cache_locked(struct page *page, struct address_space *mapping, pgoff_t index, gfp_t gfp_mask);int add_to_page_cache_lru (struct page *page,struct address_space *mapping,pgoff_t index,gfp_t gfp_mask); -extern void remove_from_page_cache (struct page *page);extern void __remove_from_page_cache (struct page *page);extern void delete_from_page_cache (struct page *page);
mm/filemap.c +11 -16
@@ -148,7 +148,17 @@ void __remove_from_page_cache(struct page *page) } } -void remove_from_page_cache (struct page *page) +/** +* delete_from_page_cache - delete page from page cache +* +* @page: the page which the kernel is trying to remove from page cache +* +* This must be called only on pages that have +* been verified to be in the page cache and locked. +* It will never put the page into the free list, +* the caller has a reference on the page. +*/ +void delete_from_page_cache (struct page *page) {struct address_space *mapping = page->mapping;void (*freepage)(struct page *);
@@ -163,22 +173,7 @@ void remove_from_page_cache(struct page *page)if (freepage)freepage (page); -} -EXPORT_SYMBOL (remove_from_page_cache); -/** -* delete_from_page_cache - delete page from page cache -* -* @page: the page which the kernel is trying to remove from page cache -* -* This must be called only on pages that have -* been verified to be in the page cache and locked. -* It will never put the page into the free list, -* the caller has a reference on the page. -*/ -void delete_from_page_cache (struct page *page) -{ -remove_from_page_cache (page);page_cache_release (page); }EXPORT_SYMBOL (delete_from_page_cache);
Signature · 8 lines
1.7.0.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 6/7] Good bye remove_from_page_cache
Quoted 7 lines · Minchan Kim
Now
delete_from_page_cachereplacesremove_from_page_cache. So we removeremove_from_page_cacheso fs or something out of mainline will notice it when compile time and can fix it.Cc Christoph Hellwig <[email protected]>Cc Hugh Dickins <[email protected]>Signed-off-by Minchan Kim <[email protected]>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH 7/7 Change __remove_from_page_cache
In reply to Minchan KimNow we renamed remove_from_page_cache with delete_from_page_cache. As consistency of __remove_from_swap_cache and remove_from_swap_cache, We change internal page cache handling function name, too.
--- include/linux/pagemap.h | 2 +- mm/filemap.c | 6 +++--- mm/truncate.c | 2 +- mm/vmscan.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-)
include/linux/pagemap.h +1 -1
@@ -455,7 +455,7 @@ int add_to_page_cache_locked(struct page *page, struct address_space *mapping, pgoff_t index, gfp_t gfp_mask);int add_to_page_cache_lru (struct page *page,struct address_space *mapping,pgoff_t index,gfp_t gfp_mask); -extern void __remove_from_page_cache (struct page *page); +extern void __delete_from_page_cache (struct page *page);extern void delete_from_page_cache (struct page *page);/*
mm/filemap.c +3 -3
@@ -109,11 +109,11 @@*/ /* -* Remove a page from the page cache and free it. Caller has to make +* Delete a page from the page cache and free it. Caller has to make * sure the page is locked and that nobody else uses it - or that usage * is safe. The caller must hold the mapping's tree_lock. */ -void __remove_from_page_cache (struct page *page) +void __delete_from_page_cache (struct page *page) {struct address_space *mapping = page->mapping;
@@ -167,7 +167,7 @@ void delete_from_page_cache(struct page *page) freepage = mapping->a_ops->freepage;spin_lock_irq (&mapping->tree_lock); -__remove_from_page_cache (page); +__delete_from_page_cache (page);spin_unlock_irq (&mapping->tree_lock);mem_cgroup_uncharge_cache_page (page);
mm/truncate.c +1 -1
@@ -402,7 +402,7 @@ invalidate_complete_page2(struct address_space *mapping, struct page *page)clear_page_mlock (page);BUG_ON (page_has_private (page)); -__remove_from_page_cache (page); +__delete_from_page_cache (page);spin_unlock_irq (&mapping->tree_lock);mem_cgroup_uncharge_cache_page (page);
mm/vmscan.c +1 -1
@@ -515,7 +515,7 @@ static int __remove_mapping(struct address_space *mapping, struct page *page) freepage = mapping->a_ops->freepage; -__remove_from_page_cache (page); +__delete_from_page_cache (page);spin_unlock_irq (&mapping->tree_lock);mem_cgroup_uncharge_cache_page (page);
Signature · 8 lines
1.7.0.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Re: [PATCH 7/7] Change __remove_from_page_cache
Quoted 7 lines · Minchan Kim
Now we renamed
remove_from_page_cachewithdelete_from_page_cache. As consistency of__remove_from_swap_cacheandremove_from_swap_cache, We change internal page cache handling function name, too.Cc Christoph Hellwig <[email protected]>Cc Hugh Dickins <[email protected]>Signed-off-by Minchan Kim <[email protected]>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 37 lines · Minchan Kim
Now we increases page reference on
add_to_page_cachebut doesn't decrease it inremove_from_page_cache. Such asymmetric makes confusing about page reference so that caller should notice it and comment why they release page reference. It's not good API.Long time ago, Hugh tried it[1] but gave up of reason which reiser4's
drop_pagehad to unlock the page between removing it from page cache and doing thepage_cache_release. But now the situation is changed. I think at least things in current mainline doesn't have any obstacles. The problem is fs or somethings out of mainline. If it has done such thing like reiser4, this patch could be a problem but they found it when compile time since we removeremove_from_page_cache.[1] http://lkml.org/lkml/2004/10/24/140
The series configuration is following as.
[1/7] : This patch introduces new API
delete_from_page_cache. [2,3,4,5/7] : Changeremove_from_page_cachewithdelete_from_page_cache. Intentionally I divide patch per file since someone might have a concern about releasing page reference ofdelete_from_page_cachein somecase (ex,truncate.c)
[6/7] : Remove old API so out of fs can meet compile error when build time and can notice it.
[7/7] : Change__remove_from_page_cachewith__delete_from_page_cache, too. In this time, I made all-in-one patch because it doesn't change old behavior so it has no concern. Just clean up patch.Minchan Kim (7):
[1/7] Introducedelete_from_page_cache
[2/7] fuse: Changeremove_from_page_cache
[3/7] tlbfs: Changeremove_from_page_cache
[4/7] swap: Changeremove_from_page_cache
[5/7] truncate: Changeremove_from_page_cache
[6/7] Good byeremove_from_page_cache
[7/7] Change__remove_from_page_cache
Quoted 8 lines
fs/fuse/dev.c | 3 +-- fs/hugetlbfs/inode.c | 3 +-- include/linux/pagemap.h | 4 ++-- mm/filemap.c | 22 +++++++++++++++++----- mm/shmem.c | 3 +-- mm/truncate.c | 5 ++--- mm/vmscan.c | 2 +- 7 files changed, 25 insertions(+), 17 deletions(-)
for all seven: thanks.
Quoted 17 lines · Minchan Kim
Now we increases page reference on
add_to_page_cachebut doesn't decrease it inremove_from_page_cache. Such asymmetric makes confusing about page reference so that caller should notice it and comment why they release page reference. It's not good API.Long time ago, Hugh tried it[1] but gave up of reason which reiser4's
drop_pagehad to unlock the page between removing it from page cache and doing thepage_cache_release. But now the situation is changed. I think at least things in current mainline doesn't have any obstacles. The problem is fs or somethings out of mainline. If it has done such thing like reiser4, this patch could be a problem but they found it when compile time since we removeremove_from_page_cache.[1] http://lkml.org/lkml/2004/10/24/140
The series configuration is following as.
Quoted 11 lines
[1/7] : This patch introduces new API
delete_from_page_cache. [2,3,4,5/7] : Changeremove_from_page_cachewithdelete_from_page_cache. Intentionally I divide patch per file since someone might have a concern about releasing page reference ofdelete_from_page_cachein somecase (ex,truncate.c)
[6/7] : Remove old API so out of fs can meet compile error when build time and can notice it.
[7/7] : Change__remove_from_page_cachewith__delete_from_page_cache, too. In this time, I made all-in-one patch because it doesn't change old behavior so it has no concern. Just clean up patch.
Other than hugetlbfs being called tlbfs in patch 3/7;
Signature · 3 lines
Mel Gorman Part-time Phd Student Linux Technology Center University of Limerick IBM Dublin Software Lab