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 from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to