Don't bother with pte_chains for wired pages. --- page_remove_rmap-wli/fs/ramfs/inode.c | 2 ++ page_remove_rmap-wli/mm/rmap.c | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff -puN mm/rmap.c~wired_rmap mm/rmap.c --- page_remove_rmap/mm/rmap.c~wired_rmap 2004-05-17 15:31:35.000000000 -0700 +++ page_remove_rmap-wli/mm/rmap.c 2004-05-17 15:33:18.000000000 -0700 @@ -239,7 +239,7 @@ page_add_rmap(struct page * page, pte_t BUG(); #endif - if (!VALID_PAGE(page) || PageReserved(page)) + if (!VALID_PAGE(page) || PageReserved(page) || PageWired(page)) return pte_chain; pte_chain_lock(page); @@ -318,7 +318,7 @@ void page_remove_rmap(struct page * page if (!page || !ptep) BUG(); - if (!VALID_PAGE(page)) + if (!VALID_PAGE(page) || PageWired(page)) return; pte_chain_lock(page); @@ -491,6 +491,8 @@ int try_to_unmap(struct page * page) /* We need backing store to swap out a page. */ if (!page->mapping) BUG(); + if (PageWired(page)) + return SWAP_FAIL; if (PageDirect(page)) { ret = try_to_unmap_one(page, page->pte.direct); diff -puN fs/ramfs/inode.c~wired_rmap fs/ramfs/inode.c --- page_remove_rmap/fs/ramfs/inode.c~wired_rmap 2004-05-17 15:33:26.000000000 -0700 +++ page_remove_rmap-wli/fs/ramfs/inode.c 2004-05-17 15:36:18.000000000 -0700 @@ -70,6 +70,7 @@ static int ramfs_readpage(struct file *f kunmap(page); flush_dcache_page(page); SetPageUptodate(page); + SetPageWired(page); } UnlockPage(page); return 0; @@ -82,6 +83,7 @@ static int ramfs_prepare_write(struct fi memset(addr, 0, PAGE_CACHE_SIZE); flush_dcache_page(page); SetPageUptodate(page); + SetPageWired(page); } SetPageDirty(page); return 0; _