Patch from Dave McCracken Convert page.pte.mapcount to an int, move its manipulation inside pte_chain_lock(). 25-akpm/include/linux/mm.h | 2 +- 25-akpm/mm/rmap.c | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff -puN include/linux/mm.h~objrmap-atomic_t-fix include/linux/mm.h --- 25/include/linux/mm.h~objrmap-atomic_t-fix Tue Mar 4 13:13:48 2003 +++ 25-akpm/include/linux/mm.h Tue Mar 4 13:13:48 2003 @@ -172,7 +172,7 @@ struct page { struct pte_chain *chain;/* Reverse pte mapping pointer. * protected by PG_chainlock */ pte_addr_t direct; - atomic_t mapcount; + int mapcount; } pte; unsigned long private; /* mapping-private opaque data */ diff -puN mm/rmap.c~objrmap-atomic_t-fix mm/rmap.c --- 25/mm/rmap.c~objrmap-atomic_t-fix Tue Mar 4 13:13:48 2003 +++ 25-akpm/mm/rmap.c Tue Mar 4 13:13:48 2003 @@ -144,7 +144,7 @@ page_referenced_obj(struct page *page) struct vm_area_struct *vma; int referenced = 0; - if (atomic_read(&page->pte.mapcount) == 0) + if (!page->pte.mapcount) return 0; if (!mapping) @@ -243,19 +243,20 @@ page_add_rmap(struct page *page, pte_t * if (!pfn_valid(page_to_pfn(page)) || PageReserved(page)) return pte_chain; + pte_chain_lock(page); + if (!PageAnon(page)) { if (!page->mapping) BUG(); if (PageSwapCache(page)) BUG(); - if (atomic_read(&page->pte.mapcount) == 0) + if (!page->pte.mapcount) inc_page_state(nr_mapped); - atomic_inc(&page->pte.mapcount); + page->pte.mapcount++; + pte_chain_unlock(page); return pte_chain; } - pte_chain_lock(page); - #ifdef DEBUG_RMAP /* * This stuff needs help to get up to highmem speed. @@ -342,20 +343,22 @@ void page_remove_rmap(struct page * page if (!page_mapped(page)) return; /* remap_page_range() from a driver? */ + pte_chain_lock(page); + if (!PageAnon(page)) { if (!page->mapping) BUG(); if (PageSwapCache(page)) BUG(); - if (atomic_read(&page->pte.mapcount) == 0) + if (!page->pte.mapcount) BUG(); - if (atomic_dec_and_test(&page->pte.mapcount)) + page->pte.mapcount--; + if (!page->pte.mapcount) dec_page_state(nr_mapped); + pte_chain_unlock(page); return; } - pte_chain_lock(page); - if (PageDirect(page)) { if (page->pte.direct == pte_paddr) { page->pte.direct = 0; @@ -471,11 +474,11 @@ try_to_unmap_obj_one(struct vm_area_stru if (pte_dirty(pteval)) set_page_dirty(page); - if (atomic_read(&page->pte.mapcount) == 0) + if (!page->pte.mapcount) BUG(); mm->rss--; - atomic_dec(&page->pte.mapcount); + page->pte.mapcount--; page_cache_release(page); out_unmap: @@ -516,7 +519,7 @@ try_to_unmap_obj(struct page *page) goto out; } - if (atomic_read(&page->pte.mapcount) != 0) + if (page->pte.mapcount) BUG(); out: _