On Fri, Mar 26, 2010 at 9:58 AM, KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> wrote: > On Fri, 26 Mar 2010 00:29:01 +0900 > Minchan Kim <minchan.kim@xxxxxxxxx> wrote: > >> Hi, Kame. > <snip> > >> Which case do we have PageAnon && (page_mapcount == 0) && PageSwapCache ? >> With looking over code which add_to_swap_cache, I found somewhere. >> >> 1) shrink_page_list >> I think this case doesn't matter by isolate_lru_xxx. >> >> 2) shmem_swapin >> It seems to be !PageAnon >> >> 3) shmem_writepage >> It seems to be !PageAnon. >> >> 4) do_swap_page >> page_add_anon_rmap increases _mapcount before setting page->mapping to anon_vma. >> So It doesn't matter. > >> >> >> I think following codes in unmap_and_move seems to handle 3) case. >> >> --- >> * Corner case handling: >> * 1. When a new swap-cache page is read into, it is added to the LRU >> * and treated as swapcache but it has no rmap yet. >> ... >> if (!page->mapping) { >> if (!PageAnon(page) && page_has_private(page)) { >> .... >> } >> goto skip_unmap; >> } >> >> --- >> >> Do we really check PageSwapCache in there? >> Do I miss any case? >> > > When a page is fully unmapped, page->mapping is not cleared. > > from rmap.c > == > 734 void page_remove_rmap(struct page *page) > 735 { > .... > 758 /* > 759 * It would be tidy to reset the PageAnon mapping here, > 760 * but that might overwrite a racing page_add_anon_rmap > 761 * which increments mapcount after us but sets mapping > 762 * before us: so leave the reset to free_hot_cold_page, > 763 * and remember that it's only reliable while mapped. > 764 * Leaving it set also helps swapoff to reinstate ptes > 765 * faster for those pages still in swapcache. > 766 */ > 767 } > == > > What happens at memory reclaim is... > > the first vmscan > 1. isolate a page from LRU. > 2. add_to_swap_cache it. > 3. try_to_unmap it > 4. pageout it (PG_reclaim && PG_writeback) > 5. move page to the tail of LRU. > .....<after some time> > 6. I/O ends and PG_writeback is cleared. > > Here, in above cycle, the page is not freed. Still in LRU list. > next vmscan > 7. isolate a page from LRU. > 8. finds a unmapped clean SwapCache > 9. drop it. > > So, to _free_ unmapped SwapCache, sequence 7-9 should happen. > If enough memory is freed by the first itelation of vmscan before I/O end, > next vmscan doesn't happen. Then, we have "unmmaped clean Swapcache which has > anon_vma pointer on page->mapping" on LRU. Thanks for open my eye. Kame. :) -- Kind regards, Minchan Kim -- 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