On Wed 25-02-15 16:11:18, Minchan Kim wrote: [...] > diff --git a/mm/madvise.c b/mm/madvise.c > index 6d0fcb8921c2..d41ae76d3e54 100644 > --- a/mm/madvise.c > +++ b/mm/madvise.c > @@ -274,7 +274,9 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned long addr, > spinlock_t *ptl; > pte_t *pte, ptent; > struct page *page; > + swp_entry_t entry; > unsigned long next; > + int rss = 0; > > next = pmd_addr_end(addr, end); > if (pmd_trans_huge(*pmd)) { > @@ -293,9 +295,19 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned long addr, > for (; addr != end; pte++, addr += PAGE_SIZE) { > ptent = *pte; > > - if (!pte_present(ptent)) > + if (pte_none(ptent)) > continue; > > + if (!pte_present(ptent)) { > + entry = pte_to_swp_entry(ptent); > + if (non_swap_entry(entry)) > + continue; > + rss--; > + free_swap_and_cache(entry); > + pte_clear_not_present_full(mm, addr, pte, tlb->fullmm); > + continue; > + } Yes this makes sense. rss is a bit confusing because those pages are not resident. > + > page = vm_normal_page(vma, addr, ptent); > if (!page) > continue; > @@ -326,6 +338,14 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned long addr, > set_pte_at(mm, addr, pte, ptent); > tlb_remove_tlb_entry(tlb, pte, addr); > } > + > + if (rss) { > + if (current->mm == mm) > + sync_mm_rss(mm); > + > + add_mm_counter(mm, MM_SWAPENTS, rss); > + } > + > arch_leave_lazy_mmu_mode(); > pte_unmap_unlock(pte - 1, ptl); > next: > -- > 1.9.1 -- Michal Hocko SUSE Labs -- 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>