diff -prauN pgcl-2.6.0-test5-bk3-11/include/asm-generic/rmap.h pgcl-2.6.0-test5-bk3-12/include/asm-generic/rmap.h --- pgcl-2.6.0-test5-bk3-11/include/asm-generic/rmap.h 2003-11-25 08:30:46.000000000 -0800 +++ pgcl-2.6.0-test5-bk3-12/include/asm-generic/rmap.h 2003-11-26 05:39:15.000000000 -0800 @@ -80,19 +80,31 @@ static inline void pgtable_remove_rmap(s dec_page_state(nr_page_table_pages); } +#ifdef CONFIG_HIGHPTE static inline struct mm_struct *pte_paddr_to_mm(pte_addr_t paddr) { - struct page *page = pfn_to_page(paddr/MMUPAGE_SIZE); - return (struct mm_struct *)page->mapping; + return (struct mm_struct *)pfn_to_page(paddr/MMUPAGE_SIZE)->mapping; } -static inline struct mm_struct * ptep_to_mm(pte_t * ptep) +static inline struct mm_struct *ptep_to_mm(pte_t *pte) { pte_addr_t pfn = kmap_atomic_to_pfn(ptep); return pte_paddr_to_mm(MMUPAGE_SIZE*pfn); } +#else +static inline struct mm_struct *pte_paddr_to_mm(pte_addr_t paddr) +{ + return (struct mm_struct *)virt_to_page(paddr)->mapping; +} + +static inline struct mm_struct *ptep_to_mm(pte_t *ptep) +{ + return pte_paddr_to_mm((pte_addr_t)ptep); +} +#endif -static inline unsigned long ptep_to_address(pte_t * ptep) +#ifdef CONFIG_HIGHPTE +static inline unsigned long ptep_to_address(pte_t *ptep) { unsigned long kvaddr = (unsigned long)ptep; unsigned long swpage_voff = kvaddr/sizeof(pte_t); @@ -122,7 +134,6 @@ static inline unsigned long ptep_to_addr } } -#ifdef CONFIG_HIGHPTE static inline pte_addr_t ptep_to_paddr(pte_t *ptep) { unsigned long pfn, vaddr = (unsigned long)ptep; @@ -134,6 +145,12 @@ static inline pte_addr_t ptep_to_paddr(p { return (pte_addr_t)ptep; } + +static inline unsigned long ptep_to_address(pte_t *pte) +{ + unsigned long offset = ((unsigned long)pte & ~PAGE_MASK)/sizeof(pte_t); + return virt_to_page(pte)->index + MMUPAGE_SIZE*offset; +} #endif #ifndef CONFIG_HIGHPTE diff -prauN pgcl-2.6.0-test5-bk3-11/include/asm-i386/pgtable.h pgcl-2.6.0-test5-bk3-12/include/asm-i386/pgtable.h --- pgcl-2.6.0-test5-bk3-11/include/asm-i386/pgtable.h 2003-11-26 04:25:28.000000000 -0800 +++ pgcl-2.6.0-test5-bk3-12/include/asm-i386/pgtable.h 2003-11-26 05:55:57.000000000 -0800 @@ -373,21 +373,21 @@ do { \ #define pte_unmap_nested(pte) do { } while (0) #endif +#ifdef CONFIG_HIGHPTE #define pte_offset_phys(pmd, addr) \ ({ \ (pte_addr_t)(pmd_val(*(pmd)) & MMUPAGE_MASK) \ + pte_index(addr)*sizeof(pte_t); \ }) -#if defined(CONFIG_HIGHPTE) && defined(CONFIG_HIGHMEM4G) -typedef u32 pte_addr_t; +#else +#define pte_offset_phys(pmd, addr) \ + ((pte_addr_t)pte_offset_kernel(pmd, addr)) #endif -#if defined(CONFIG_HIGHPTE) && defined(CONFIG_HIGHMEM64G) +#if defined(CONFIG_HIGHMEM64) && defined(CONFIG_HIGHPTE) typedef u64 pte_addr_t; -#endif - -#if !defined(CONFIG_HIGHPTE) -typedef pte_t *pte_addr_t; +#else +typedef u32 pte_addr_t; #endif /* diff -prauN pgcl-2.6.0-test5-bk3-11/include/linux/highmem.h pgcl-2.6.0-test5-bk3-12/include/linux/highmem.h --- pgcl-2.6.0-test5-bk3-11/include/linux/highmem.h 2003-09-14 23:49:20.000000000 -0700 +++ pgcl-2.6.0-test5-bk3-12/include/linux/highmem.h 2003-11-26 05:05:47.000000000 -0800 @@ -31,6 +31,11 @@ static inline void *kmap(struct page *pa #define kmap_atomic(page, idx) page_address(page) #define kunmap_atomic(addr, idx) do { } while (0) #define kmap_atomic_to_page(ptr) virt_to_page(ptr) +#define kmap_atomic_to_pfn(ptr) (__pa(ptr)/MMUPAGE_SIZE) + +#define kmap_atomic_sg(ptes, addrs, type) \ + memcpy(ptes,addrs,PAGE_MMUCOUNT*sizeof(pte_t)) +#define kunmap_atomic_sg(ptes, type) do { } while (0) #endif /* CONFIG_HIGHMEM */ diff -prauN pgcl-2.6.0-test5-bk3-11/mm/memory.c pgcl-2.6.0-test5-bk3-12/mm/memory.c --- pgcl-2.6.0-test5-bk3-11/mm/memory.c 2003-11-26 03:20:49.000000000 -0800 +++ pgcl-2.6.0-test5-bk3-12/mm/memory.c 2003-11-26 05:12:46.000000000 -0800 @@ -69,31 +69,6 @@ struct page *highmem_start_page; struct pte_chain *rmap_add_folio(struct page *, pte_addr_t [], struct pte_chain *); /* - * We special-case the C-O-W ZERO_PAGE, because it's such - * a common occurrence (no need to read the page to know - * that it's zero - better for the cache and memory subsystem). - */ -static inline void copy_cow_page(unsigned long src[], struct page *dst, pte_t *ptes[]) -{ - int k; - char *srcaddr, *dstaddr; - dstaddr = kmap_atomic(dst, KM_USER0); - srcaddr = kmap_atomic_pfns(src, KM_USER1); - for (k = 0; k < PAGE_MMUCOUNT; ++k) { - if (!src[k] || !ptes[k]) - continue; - if (pfn_to_page(src[k]) == ZERO_PAGE((unsigned long)ptes[k])) - memset(&dstaddr[MMUPAGE_SIZE*k], 0, MMUPAGE_SIZE); - else - memcpy(&dstaddr[MMUPAGE_SIZE*k], - &srcaddr[MMUPAGE_SIZE*k], - MMUPAGE_SIZE); - } - kunmap_atomic(dst, KM_USER0); - kunmap_atomic_pfns(src, KM_USER1); -} - -/* * Note: this doesn't free the actual pages themselves. That * has been handled earlier when unmapping all the memory regions. */ @@ -1553,17 +1528,6 @@ retry: } prepare_folio(folio, vma, address, ptep_to_paddr(page_table), !!new_page); - if (0) { - int k; - - for (k = 0; k < PAGE_MMUCOUNT; ++k) { - if ((((u64)folio[k] >> 24) & 0xff) != 0x67) - continue; - printk("bad folio[%d] = 0x%Lx\n", k, (u64)folio[k]); - WARN_ON(1); - break; - } - } if (new_page) { new_page = private_folio_page_xchg(folio, new_page); restrict_folio(folio, vma, address, page_table);