From 184c8a6e96ad04fa5d414038938770c5cae6f7a1 Mon Sep 17 00:00:00 2001 From: Nick Piggin Date: Fri, 22 Dec 2006 01:09:33 -0800 Subject: [PATCH] --- yaml --- r: 44893 b: refs/heads/master c: 7de6b8057976584e5a422574cae4dd21c677b4d4 h: refs/heads/master i: 44891: 624ab1ae0c081af6e8269504b7fa9661162e5033 v: v3 --- [refs] | 2 +- trunk/include/linux/rmap.h | 2 +- trunk/mm/filemap_xip.c | 2 +- trunk/mm/fremap.c | 2 +- trunk/mm/memory.c | 4 ++-- trunk/mm/rmap.c | 13 ++++++++++--- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 58a4a1007ef3..a2c4d924b243 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 19900cdee29c812857ce938ab449e1053d516252 +refs/heads/master: 7de6b8057976584e5a422574cae4dd21c677b4d4 diff --git a/trunk/include/linux/rmap.h b/trunk/include/linux/rmap.h index 36f850373d2c..bdd277223af0 100644 --- a/trunk/include/linux/rmap.h +++ b/trunk/include/linux/rmap.h @@ -72,7 +72,7 @@ void __anon_vma_link(struct vm_area_struct *); void page_add_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); void page_add_new_anon_rmap(struct page *, struct vm_area_struct *, unsigned long); void page_add_file_rmap(struct page *); -void page_remove_rmap(struct page *); +void page_remove_rmap(struct page *, struct vm_area_struct *); /** * page_dup_rmap - duplicate pte mapping to a page diff --git a/trunk/mm/filemap_xip.c b/trunk/mm/filemap_xip.c index 8d667617f558..45b3553865cf 100644 --- a/trunk/mm/filemap_xip.c +++ b/trunk/mm/filemap_xip.c @@ -189,7 +189,7 @@ __xip_unmap (struct address_space * mapping, /* Nuke the page table entry. */ flush_cache_page(vma, address, pte_pfn(*pte)); pteval = ptep_clear_flush(vma, address, pte); - page_remove_rmap(page); + page_remove_rmap(page, vma); dec_mm_counter(mm, file_rss); BUG_ON(pte_dirty(pteval)); pte_unmap_unlock(pte, ptl); diff --git a/trunk/mm/fremap.c b/trunk/mm/fremap.c index b77a002c3352..4e3f53dd5fd4 100644 --- a/trunk/mm/fremap.c +++ b/trunk/mm/fremap.c @@ -33,7 +33,7 @@ static int zap_pte(struct mm_struct *mm, struct vm_area_struct *vma, if (page) { if (pte_dirty(pte)) set_page_dirty(page); - page_remove_rmap(page); + page_remove_rmap(page, vma); page_cache_release(page); } } else { diff --git a/trunk/mm/memory.c b/trunk/mm/memory.c index c00bac66ce9f..563792f4f687 100644 --- a/trunk/mm/memory.c +++ b/trunk/mm/memory.c @@ -681,7 +681,7 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb, mark_page_accessed(page); file_rss--; } - page_remove_rmap(page); + page_remove_rmap(page, vma); tlb_remove_page(tlb, page); continue; } @@ -1586,7 +1586,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, page_table = pte_offset_map_lock(mm, pmd, address, &ptl); if (likely(pte_same(*page_table, orig_pte))) { if (old_page) { - page_remove_rmap(old_page); + page_remove_rmap(old_page, vma); if (!PageAnon(old_page)) { dec_mm_counter(mm, file_rss); inc_mm_counter(mm, anon_rss); diff --git a/trunk/mm/rmap.c b/trunk/mm/rmap.c index d8a842a586db..b3deda8b5019 100644 --- a/trunk/mm/rmap.c +++ b/trunk/mm/rmap.c @@ -47,6 +47,7 @@ #include #include #include +#include #include @@ -567,14 +568,20 @@ void page_add_file_rmap(struct page *page) * * The caller needs to hold the pte lock. */ -void page_remove_rmap(struct page *page) +void page_remove_rmap(struct page *page, struct vm_area_struct *vma) { if (atomic_add_negative(-1, &page->_mapcount)) { if (unlikely(page_mapcount(page) < 0)) { printk (KERN_EMERG "Eeek! page_mapcount(page) went negative! (%d)\n", page_mapcount(page)); + printk (KERN_EMERG " page pfn = %lx\n", page_to_pfn(page)); printk (KERN_EMERG " page->flags = %lx\n", page->flags); printk (KERN_EMERG " page->count = %x\n", page_count(page)); printk (KERN_EMERG " page->mapping = %p\n", page->mapping); + print_symbol (KERN_EMERG " vma->vm_ops = %s\n", (unsigned long)vma->vm_ops); + if (vma->vm_ops) + print_symbol (KERN_EMERG " vma->vm_ops->nopage = %s\n", (unsigned long)vma->vm_ops->nopage); + if (vma->vm_file && vma->vm_file->f_op) + print_symbol (KERN_EMERG " vma->vm_file->f_op->mmap = %s\n", (unsigned long)vma->vm_file->f_op->mmap); BUG(); } @@ -679,7 +686,7 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, dec_mm_counter(mm, file_rss); - page_remove_rmap(page); + page_remove_rmap(page, vma); page_cache_release(page); out_unmap: @@ -769,7 +776,7 @@ static void try_to_unmap_cluster(unsigned long cursor, if (pte_dirty(pteval)) set_page_dirty(page); - page_remove_rmap(page); + page_remove_rmap(page, vma); page_cache_release(page); dec_mm_counter(mm, file_rss); (*mapcount)--;