Hi, Tim, Tim Chen <tim.c.chen@xxxxxxxxxxxxxxx> writes: > On Tue, Mar 14, 2017 at 05:25:29PM +0800, Huang, Ying wrote: >> +struct page *do_swap_page_readahead(struct vm_fault *vmf, >> + struct vma_swap_readahead *swap_ra, >> + swp_entry_t fentry, >> + struct page *fpage) >> +{ >> + struct blk_plug plug; >> + struct vm_area_struct *vma = vmf->vma; >> + struct page *page; >> + unsigned long addr; >> + pte_t *pte, pentry; >> + gfp_t gfp_mask; >> + swp_entry_t entry; >> + int i, alloc = 0, count; >> + bool page_allocated; >> + >> + addr = vmf->address & PAGE_MASK; >> + blk_start_plug(&plug); >> + if (!fpage) { >> + fpage = __read_swap_cache_async(fentry, GFP_HIGHUSER_MOVABLE, >> + vma, addr, &page_allocated); >> + if (!fpage) { >> + blk_finish_plug(&plug); >> + return NULL; >> + } >> + if (page_allocated) { >> + alloc++; >> + swap_readpage(fpage); >> + } > > Do you need to add here a put_page as there's a get_page > in __read-swap_cache_async? I don't call put_page() here because the page will be mapped to process page table. > put_page(fpage); > > I think there is no put_page on the returned page when you return from > do_swap_page_readahead. In the original swapin_readahead(), the read_swap_cache_async() will be called for the fault swap entry again in the end of the function, and pug_page() is not called there. Best Regards, Huang, Ying > Thanks. > > Tim > >> + } >> + /* fault page has been checked */ >> + count = 1; >> + addr += PAGE_SIZE * swap_ra->direction; >> + pte = swap_ra->ptes; >> + if (swap_ra->direction < 0) >> + pte += swap_ra->nr_pte - 1; -- 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=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>