Yes, I can try. The code is pretty much similar with some minor difference. One thing I can do is to move the spin lock part (together with the corresponding err handling into a common function. The only problem I can see right now is we need the following additional line for shm: __mod_zone_page_state(page_zone(page), NR_SHMEM, nr); Which means we need to tell if it's coming from shm or not, is that OK to add additional parameter just for that? Or is there any other better way we can infer that information? Thanks! Best wishes, -- Ning Qu (曲宁) | Software Engineer | quning@xxxxxxxxxx | +1-408-418-6066 On Tue, Oct 15, 2013 at 3:02 AM, Kirill A. Shutemov <kirill.shutemov@xxxxxxxxxxxxxxx> wrote: > Ning Qu wrote: >> For replacing a page inside page cache, we assume the huge page >> has been splitted before getting here. >> >> For adding a new page to page cache, huge page support has been added. >> >> Also refactor the shm_add_to_page_cache function. >> >> Signed-off-by: Ning Qu <quning@xxxxxxxxx> >> --- >> mm/shmem.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ >> 1 file changed, 88 insertions(+), 9 deletions(-) >> >> diff --git a/mm/shmem.c b/mm/shmem.c >> index a857ba8..447bd14 100644 >> --- a/mm/shmem.c >> +++ b/mm/shmem.c >> @@ -277,27 +277,23 @@ static bool shmem_confirm_swap(struct address_space *mapping, >> } >> >> /* >> - * Like add_to_page_cache_locked, but error if expected item has gone. >> + * Replace the swap entry with page cache entry >> */ >> -static int shmem_add_to_page_cache(struct page *page, >> +static int shmem_replace_page_page_cache(struct page *page, >> struct address_space *mapping, >> pgoff_t index, gfp_t gfp, void *expected) >> { >> int error; >> >> - VM_BUG_ON(!PageLocked(page)); >> - VM_BUG_ON(!PageSwapBacked(page)); >> + BUG_ON(PageTransHugeCache(page)); >> >> page_cache_get(page); >> page->mapping = mapping; >> page->index = index; >> >> spin_lock_irq(&mapping->tree_lock); >> - if (!expected) >> - error = radix_tree_insert(&mapping->page_tree, index, page); >> - else >> - error = shmem_radix_tree_replace(mapping, index, expected, >> - page); >> + >> + error = shmem_radix_tree_replace(mapping, index, expected, page); >> if (!error) { >> mapping->nrpages++; >> __inc_zone_page_state(page, NR_FILE_PAGES); >> @@ -312,6 +308,87 @@ static int shmem_add_to_page_cache(struct page *page, >> } >> >> /* >> + * Insert new page into with page cache >> + */ >> +static int shmem_insert_page_page_cache(struct page *page, >> + struct address_space *mapping, >> + pgoff_t index, gfp_t gfp) >> +{ > > You copy-paste most of add_to_page_cache_locked() code here. Is there a > way to share the code? Move common part into __add_to_page_cache_locked() > or something. > > -- > Kirill A. Shutemov -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href