diff -prauN pgcl-2.6.0-test11-3/arch/i386/mm/hugetlbpage.c pgcl-2.6.0-test11-4/arch/i386/mm/hugetlbpage.c --- pgcl-2.6.0-test11-3/arch/i386/mm/hugetlbpage.c 2003-11-26 12:45:35.000000000 -0800 +++ pgcl-2.6.0-test11-4/arch/i386/mm/hugetlbpage.c 2003-11-28 21:09:12.000000000 -0800 @@ -54,7 +54,7 @@ static struct page *alloc_fresh_huge_pag { static int nid = 0; struct page *page; - page = alloc_pages_node(nid, GFP_HIGHUSER, HUGETLB_PAGE_ORDER); + page = alloc_pages_node(nid, GFP_HIGHUSER, HPAGE_ORDER); nid = (nid + 1) % numnodes; return page; } @@ -76,7 +76,7 @@ static struct page *alloc_hugetlb_page(v spin_unlock(&htlbpage_lock); set_page_count(page, 1); page->lru.prev = (void *)free_huge_page; - for (i = 0; i < (HPAGE_SIZE/PAGE_SIZE); ++i) + for (i = 0; i < HPAGE_COUNT; ++i) clear_highpage(&page[i]); return page; } @@ -105,7 +105,7 @@ static void set_huge_pte(struct mm_struc { pte_t entry; - mm->rss += (HPAGE_SIZE / PAGE_SIZE); + mm->rss += HPAGE_MMUCOUNT; if (write_access) { entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot))); @@ -145,7 +145,7 @@ int copy_hugetlb_page_range(struct mm_st ptepage = pte_page(entry); get_page(ptepage); set_pte(dst_pte, entry); - dst->rss += (HPAGE_SIZE / PAGE_SIZE); + dst->rss += HPAGE_MMUCOUNT; addr += HPAGE_SIZE; } return 0; @@ -156,7 +156,7 @@ nomem: int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, - struct page **pages, struct vm_area_struct **vmas, + unsigned long *pfns, struct vm_area_struct **vmas, unsigned long *position, int *length, int i) { unsigned long vpfn, vaddr = *position; @@ -164,30 +164,38 @@ follow_hugetlb_page(struct mm_struct *mm WARN_ON(!is_vm_hugetlb_page(vma)); - vpfn = vaddr/PAGE_SIZE; + vpfn = vaddr/MMUPAGE_SIZE; while (vaddr < vma->vm_end && remainder) { - if (pages) { + if (pfns) { pte_t *pte; - struct page *page; + unsigned long pfn; pte = huge_pte_offset(mm, vaddr); /* hugetlb should be locked, and hence, prefaulted */ WARN_ON(!pte || pte_none(*pte)); - page = &pte_page(*pte)[vpfn % (HPAGE_SIZE/PAGE_SIZE)]; + /* + * Here pte_pfn() returns the pfn of the head of + * the hugepage; we need to return the correct + * pfn by calculating an offset into the hugepage + * in units of MMUPAGE_SIZE. The simple division + * above suffices because hugepages are required + * to be virtually HPAGE_SIZE -aligned. + */ + pfn = pte_pfn(*pte) + (vpfn % HPAGE_MMUCOUNT); - WARN_ON(!PageCompound(page)); + WARN_ON(!PageCompound(pfn_to_page(pfn))); - get_page(page); - pages[i] = page; + get_page(pfn_to_page(pfn)); + pfns[i] = pfn; } if (vmas) vmas[i] = vma; - vaddr += PAGE_SIZE; + vaddr += MMUPAGE_SIZE; ++vpfn; --remainder; ++i; @@ -199,60 +207,40 @@ follow_hugetlb_page(struct mm_struct *mm return i; } -#if 0 /* This is just for testing */ -struct page * +/* + * Not sure if I was actually supposed to implement these. + */ +unsigned long follow_huge_addr(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, int write) { - unsigned long start = address; - int length = 1; - int nr; - struct page *page; + unsigned long pfn; + pte_t *pte; - nr = follow_hugetlb_page(mm, vma, &page, NULL, &start, &length, 0); - if (nr == 1) - return page; - return NULL; + pte = huge_pte_offset(mm, address); + WARN_ON(!pte || pte_none(*pte)); + if (pte_none(*pte)) + return 0; + + pfn = pte_pfn(*pte) + (address & ~HPAGE_MASK)/MMUPAGE_SIZE; + if (pfn) + get_page(pfn_to_page(pfn)); + return pfn; } -/* - * If virtual address `addr' lies within a huge page, return its controlling - * VMA, else NULL. - */ struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long addr) { - if (mm->used_hugetlb) { - struct vm_area_struct *vma = find_vma(mm, addr); - if (vma && is_vm_hugetlb_page(vma)) - return vma; - } - return NULL; -} - -int pmd_huge(pmd_t pmd) -{ - return 0; -} + struct vm_area_struct *vma; -struct page * -follow_huge_pmd(struct mm_struct *mm, unsigned long address, - pmd_t *pmd, int write) -{ - return NULL; -} - -#else - -struct page * -follow_huge_addr(struct mm_struct *mm, - struct vm_area_struct *vma, unsigned long address, int write) -{ - return NULL; -} + if (!mm->used_hugetlb) + return NULL; + else + vma = find_vma(mm, addr); -struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long addr) -{ - return NULL; + if (is_vm_hugetlb_page(vma)) + return vma; + else + return NULL; } int pmd_huge(pmd_t pmd) @@ -260,20 +248,27 @@ int pmd_huge(pmd_t pmd) return !!(pmd_val(pmd) & _PAGE_PSE); } -struct page * +unsigned long follow_huge_pmd(struct mm_struct *mm, unsigned long address, pmd_t *pmd, int write) { - struct page *page; + pte_t *pte; + unsigned long pfn; - page = pte_page(*(pte_t *)pmd); - if (page) { - page += ((address & ~HPAGE_MASK) >> PAGE_SHIFT); - get_page(page); - } - return page; + pte = (pte_t *)pmd; + + WARN_ON(!pte || pte_none(*pte)); + if (pte_none(*pte)) + return 0; + /* + * pte_page() gives us the head of the hugepage, into which we + * have an offset, determined in units of MMUPAGE_SIZE below. + */ + pfn = pte_pfn(*pte) + (address & ~HPAGE_MASK)/MMUPAGE_SIZE; + if (pfn) + get_page(pfn_to_page(pfn)); + return pfn; } -#endif static void free_huge_page(struct page *page) { @@ -304,8 +299,8 @@ void unmap_hugepage_range(struct vm_area pte_t *pte; struct page *page; - BUG_ON(start & (HPAGE_SIZE - 1)); - BUG_ON(end & (HPAGE_SIZE - 1)); + BUG_ON(start & ~HPAGE_MASK); + BUG_ON(end & ~HPAGE_MASK); for (address = start; address < end; address += HPAGE_SIZE) { pte = huge_pte_offset(mm, address); @@ -315,7 +310,7 @@ void unmap_hugepage_range(struct vm_area huge_page_release(page); pte_clear(pte); } - mm->rss -= (end - start) >> PAGE_SHIFT; + mm->rss -= (end - start) >> MMUPAGE_SHIFT; flush_tlb_range(vma, start, end); } @@ -352,7 +347,7 @@ int hugetlb_prefault(struct address_spac continue; idx = ((addr - vma->vm_start) >> HPAGE_SHIFT) - + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT)); + + (vma->vm_pgoff >> HPAGE_MMUSHIFT); page = find_get_page(mapping, idx); if (!page) { /* charge the fs quota first */ @@ -388,15 +383,20 @@ static void update_and_free_page(struct map = page; htlbzone_pages--; - for (j = 0; j < (HPAGE_SIZE / PAGE_SIZE); j++) { - map->flags &= ~(1 << PG_locked | 1 << PG_error | 1 << PG_referenced | - 1 << PG_dirty | 1 << PG_active | 1 << PG_reserved | - 1 << PG_private | 1<< PG_writeback); + for (j = 0; j < HPAGE_COUNT; j++) { + map->flags &= ~(1 << PG_locked | + 1 << PG_error | + 1 << PG_referenced | + 1 << PG_dirty | + 1 << PG_active | + 1 << PG_reserved | + 1 << PG_private | + 1 << PG_writeback); set_page_count(map, 0); map++; } set_page_count(page, 1); - __free_pages(page, HUGETLB_PAGE_ORDER); + __free_pages(page, HPAGE_ORDER); } static int try_to_free_low(int count) @@ -524,7 +524,7 @@ int hugetlb_report_meminfo(char *buf) int is_hugepage_mem_enough(size_t size) { - return (size + ~HPAGE_MASK)/HPAGE_SIZE <= htlbpagemem; + return HPAGE_ALIGN(size) <= htlbpagemem; } /* diff -prauN pgcl-2.6.0-test11-3/drivers/char/drm/drmP.h pgcl-2.6.0-test11-4/drivers/char/drm/drmP.h --- pgcl-2.6.0-test11-3/drivers/char/drm/drmP.h 2003-11-26 12:44:58.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/char/drm/drmP.h 2003-11-28 19:47:47.000000000 -0800 @@ -203,7 +203,7 @@ static inline struct page * vmalloc_to_p #define DRM_RPR_ARG(vma) vma, #endif -#define VM_OFFSET(vma) ((vma)->vm_pgoff << PAGE_SHIFT) +#define VM_OFFSET(vma) ((vma)->vm_pgoff << MMUPAGE_SHIFT) /*@}*/ diff -prauN pgcl-2.6.0-test11-3/drivers/char/drm/drm_memory.h pgcl-2.6.0-test11-4/drivers/char/drm/drm_memory.h --- pgcl-2.6.0-test11-3/drivers/char/drm/drm_memory.h 2003-11-26 12:43:09.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/char/drm/drm_memory.h 2003-11-28 19:54:12.000000000 -0800 @@ -114,7 +114,7 @@ agp_remap (unsigned long offset, unsigne phys_addr_map = agpmem->memory->memory + (offset - agpmem->bound) / PAGE_SIZE; for (i = 0; i < num_pages; ++i) - page_map[i] = pfn_to_page(phys_addr_map[i] >> PAGE_SHIFT); + page_map[i] = pfn_to_page(phys_addr_map[i] >> MMUPAGE_SHIFT); addr = vmap(page_map, num_pages, VM_IOREMAP, PAGE_AGP); vfree(page_map); @@ -127,7 +127,7 @@ drm_follow_page (void *vaddr) pgd_t *pgd = pgd_offset_k((unsigned long) vaddr); pmd_t *pmd = pmd_offset(pgd, (unsigned long) vaddr); pte_t *ptep = pte_offset_kernel(pmd, (unsigned long) vaddr); - return pte_pfn(*ptep) << PAGE_SHIFT; + return pte_pfn(*ptep) << MMUPAGE_SHIFT; } #endif /* __REALLY_HAVE_AGP */ @@ -175,7 +175,7 @@ static inline void drm_ioremapfree(void unsigned long offset; drm_map_t *map; - offset = drm_follow_page(pt) | ((unsigned long) pt & ~PAGE_MASK); + offset = drm_follow_page(pt) | ((unsigned long) pt & ~MMUPAGE_MASK); map = drm_lookup_map(offset, size, dev); if (map && map->type == _DRM_AGP) { vunmap(pt); diff -prauN pgcl-2.6.0-test11-3/drivers/media/video/video-buf.c pgcl-2.6.0-test11-4/drivers/media/video/video-buf.c --- pgcl-2.6.0-test11-3/drivers/media/video/video-buf.c 2003-11-26 12:44:08.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/media/video/video-buf.c 2003-11-28 21:39:45.000000000 -0800 @@ -1172,12 +1172,12 @@ int videobuf_mmap_mapper(struct vm_area_ continue; if (V4L2_MEMORY_MMAP != q->bufs[first]->memory) continue; - if (q->bufs[first]->boff == (vma->vm_pgoff << PAGE_SHIFT)) + if (q->bufs[first]->boff == (vma->vm_pgoff << MMUPAGE_SHIFT)) break; } if (VIDEO_MAX_FRAME == first) { dprintk(1,"mmap app bug: offset invalid [offset=0x%lx]\n", - (vma->vm_pgoff << PAGE_SHIFT)); + (vma->vm_pgoff << MMUPAGE_SHIFT)); goto done; } diff -prauN pgcl-2.6.0-test11-3/drivers/media/video/zoran_driver.c pgcl-2.6.0-test11-4/drivers/media/video/zoran_driver.c --- pgcl-2.6.0-test11-3/drivers/media/video/zoran_driver.c 2003-11-26 12:44:59.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/media/video/zoran_driver.c 2003-11-28 21:59:25.000000000 -0800 @@ -4465,7 +4465,7 @@ zoran_mmap (struct file *file, struct zoran_fh *fh = file->private_data; struct zoran *zr = fh->zr; unsigned long size = (vma->vm_end - vma->vm_start); - unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; + unsigned long offset = vma->vm_pgoff << MMUPAGE_SHIFT; int i, j; unsigned long page, start = vma->vm_start, todo, pos, fraglen; int first, last; diff -prauN pgcl-2.6.0-test11-3/drivers/sbus/char/flash.c pgcl-2.6.0-test11-4/drivers/sbus/char/flash.c --- pgcl-2.6.0-test11-3/drivers/sbus/char/flash.c 2003-11-26 12:44:18.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/sbus/char/flash.c 2003-11-28 22:03:46.000000000 -0800 @@ -63,12 +63,12 @@ flash_mmap(struct file *file, struct vm_ } spin_unlock(&flash_lock); - if ((vma->vm_pgoff << PAGE_SHIFT) > size) + if ((vma->vm_pgoff << MMUPAGE_SHIFT) > size) return -ENXIO; - addr += (vma->vm_pgoff << PAGE_SHIFT); + addr += (vma->vm_pgoff << MMUPAGE_SHIFT); - if (vma->vm_end - (vma->vm_start + (vma->vm_pgoff << PAGE_SHIFT)) > size) - size = vma->vm_end - (vma->vm_start + (vma->vm_pgoff << PAGE_SHIFT)); + if (vma->vm_end - (vma->vm_start + (vma->vm_pgoff << MMUPAGE_SHIFT)) > size) + size = vma->vm_end - (vma->vm_start + (vma->vm_pgoff << MMUPAGE_SHIFT)); pgprot_val(vma->vm_page_prot) &= ~(_PAGE_CACHE); pgprot_val(vma->vm_page_prot) |= _PAGE_E; diff -prauN pgcl-2.6.0-test11-3/drivers/video/acornfb.c pgcl-2.6.0-test11-4/drivers/video/acornfb.c --- pgcl-2.6.0-test11-3/drivers/video/acornfb.c 2003-11-26 12:45:41.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/video/acornfb.c 2003-11-28 22:02:53.000000000 -0800 @@ -856,7 +856,7 @@ acornfb_mmap(struct fb_info *info, struc unsigned long off, start; u32 len; - off = vma->vm_pgoff << PAGE_SHIFT; + off = vma->vm_pgoff << MMUPAGE_SHIFT; start = info->fix.smem_start; len = PAGE_ALIGN(start & ~PAGE_MASK) + info->fix.smem_len; @@ -864,7 +864,7 @@ acornfb_mmap(struct fb_info *info, struc if ((vma->vm_end - vma->vm_start + off) > len) return -EINVAL; off += start; - vma->vm_pgoff = off >> PAGE_SHIFT; + vma->vm_pgoff = off >> MMUPAGE_SHIFT; /* This is an IO map - tell maydump to skip this VMA */ vma->vm_flags |= VM_IO; diff -prauN pgcl-2.6.0-test11-3/drivers/video/aty/atyfb_base.c pgcl-2.6.0-test11-4/drivers/video/aty/atyfb_base.c --- pgcl-2.6.0-test11-3/drivers/video/aty/atyfb_base.c 2003-11-26 12:44:51.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/video/aty/atyfb_base.c 2003-11-28 22:01:10.000000000 -0800 @@ -1130,10 +1130,10 @@ static int atyfb_mmap(struct fb_info *in if (!par->mmap_map) return -ENXIO; - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) + if (vma->vm_pgoff > (~0UL >> MMUPAGE_SHIFT)) return -EINVAL; - off = vma->vm_pgoff << PAGE_SHIFT; + off = vma->vm_pgoff << MMUPAGE_SHIFT; size = vma->vm_end - vma->vm_start; /* To stop the swapper from even considering these pages. */ @@ -1143,7 +1143,7 @@ static int atyfb_mmap(struct fb_info *in ((off == info->fix.smem_len) && (size == PAGE_SIZE))) off += 0x8000000000000000UL; - vma->vm_pgoff = off >> PAGE_SHIFT; /* propagate off changes */ + vma->vm_pgoff = off >> MMUPAGE_SHIFT; /* propagate off changes */ /* Each page, see which map applies */ for (page = 0; page < size;) { diff -prauN pgcl-2.6.0-test11-3/drivers/video/controlfb.c pgcl-2.6.0-test11-4/drivers/video/controlfb.c --- pgcl-2.6.0-test11-3/drivers/video/controlfb.c 2003-11-26 12:43:24.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/video/controlfb.c 2003-11-28 22:01:37.000000000 -0800 @@ -293,7 +293,7 @@ static int controlfb_mmap(struct fb_info unsigned long off, start; u32 len; - off = vma->vm_pgoff << PAGE_SHIFT; + off = vma->vm_pgoff << MMUPAGE_SHIFT; /* frame buffer memory */ start = info->fix.smem_start; @@ -314,7 +314,7 @@ static int controlfb_mmap(struct fb_info if ((vma->vm_end - vma->vm_start + off) > len) return -EINVAL; off += start; - vma->vm_pgoff = off >> PAGE_SHIFT; + vma->vm_pgoff = off >> MMUPAGE_SHIFT; if (io_remap_page_range(vma, vma->vm_start, off, vma->vm_end - vma->vm_start, vma->vm_page_prot)) return -EAGAIN; diff -prauN pgcl-2.6.0-test11-3/drivers/video/fbmem.c pgcl-2.6.0-test11-4/drivers/video/fbmem.c --- pgcl-2.6.0-test11-3/drivers/video/fbmem.c 2003-11-26 12:42:37.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/video/fbmem.c 2003-11-28 21:59:54.000000000 -0800 @@ -1059,9 +1059,9 @@ fb_mmap(struct file *file, struct vm_are u32 len; #endif - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) + if (vma->vm_pgoff > (~0UL >> MMUPAGE_SHIFT)) return -EINVAL; - off = vma->vm_pgoff << PAGE_SHIFT; + off = vma->vm_pgoff << MMUPAGE_SHIFT; if (!fb) return -ENODEV; if (fb->fb_mmap) { @@ -1098,7 +1098,7 @@ fb_mmap(struct file *file, struct vm_are if ((vma->vm_end - vma->vm_start + off) > len) return -EINVAL; off += start; - vma->vm_pgoff = off >> PAGE_SHIFT; + vma->vm_pgoff = off >> MMUPAGE_SHIFT; /* This is an IO map - tell maydump to skip this VMA */ vma->vm_flags |= VM_IO; #if defined(__sparc_v9__) diff -prauN pgcl-2.6.0-test11-3/drivers/video/igafb.c pgcl-2.6.0-test11-4/drivers/video/igafb.c --- pgcl-2.6.0-test11-3/drivers/video/igafb.c 2003-11-26 12:44:20.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/video/igafb.c 2003-11-28 22:02:26.000000000 -0800 @@ -241,7 +241,7 @@ static int igafb_mmap(struct fb_info *in for (i = 0; par->mmap_map[i].size; i++) { unsigned long start = par->mmap_map[i].voff; unsigned long end = start + par->mmap_map[i].size; - unsigned long offset = (vma->vm_pgoff << PAGE_SHIFT) + page; + unsigned long offset = (vma->vm_pgoff << MMUPAGE_SHIFT) + page; if (start > offset) continue; diff -prauN pgcl-2.6.0-test11-3/drivers/video/sbuslib.c pgcl-2.6.0-test11-4/drivers/video/sbuslib.c --- pgcl-2.6.0-test11-3/drivers/video/sbuslib.c 2003-11-26 12:43:30.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/video/sbuslib.c 2003-11-28 22:01:51.000000000 -0800 @@ -46,10 +46,10 @@ int sbusfb_mmap_helper(struct sbus_mmap_ int i; size = vma->vm_end - vma->vm_start; - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) + if (vma->vm_pgoff > (~0UL >> MMUPAGE_SHIFT)) return -EINVAL; - off = vma->vm_pgoff << PAGE_SHIFT; + off = vma->vm_pgoff << MMUPAGE_SHIFT; /* To stop the swapper from even considering these pages */ vma->vm_flags |= (VM_SHM | VM_IO | VM_LOCKED); diff -prauN pgcl-2.6.0-test11-3/drivers/video/sgivwfb.c pgcl-2.6.0-test11-4/drivers/video/sgivwfb.c --- pgcl-2.6.0-test11-3/drivers/video/sgivwfb.c 2003-11-26 12:44:07.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/video/sgivwfb.c 2003-11-28 22:02:12.000000000 -0800 @@ -712,9 +712,9 @@ static int sgivwfb_mmap(struct fb_info * struct vm_area_struct *vma) { unsigned long size = vma->vm_end - vma->vm_start; - unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; + unsigned long offset = vma->vm_pgoff << MMUPAGE_SHIFT; - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) + if (vma->vm_pgoff > (~0UL >> MMUPAGE_SHIFT)) return -EINVAL; if (offset + size > sgivwfb_mem_size) return -EINVAL; diff -prauN pgcl-2.6.0-test11-3/drivers/video/sis/sis_main.c pgcl-2.6.0-test11-4/drivers/video/sis/sis_main.c --- pgcl-2.6.0-test11-3/drivers/video/sis/sis_main.c 2003-11-26 12:44:47.000000000 -0800 +++ pgcl-2.6.0-test11-4/drivers/video/sis/sis_main.c 2003-11-28 22:00:43.000000000 -0800 @@ -1317,9 +1317,10 @@ static int sisfb_mmap(struct fb_info *in u32 len, mmio_off; TWDEBUG("inside mmap"); - if(vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) return -EINVAL; + if (vma->vm_pgoff > (~0UL >> MMUPAGE_SHIFT)) + return -EINVAL; - off = vma->vm_pgoff << PAGE_SHIFT; + off = vma->vm_pgoff << MMUPAGE_SHIFT; start = (unsigned long) ivideo.video_base; len = PAGE_ALIGN((start & ~PAGE_MASK) + ivideo.video_size); @@ -1344,7 +1345,7 @@ static int sisfb_mmap(struct fb_info *in if((vma->vm_end - vma->vm_start + off) > len) return -EINVAL; off += start; - vma->vm_pgoff = off >> PAGE_SHIFT; + vma->vm_pgoff = off >> MMUPAGE_SHIFT; vma->vm_flags |= VM_IO; /* by Jake Page; is that really needed? */ #if defined(__i386__) || defined(__x86_64__) @@ -1807,9 +1808,10 @@ static int sisfb_mmap(struct fb_info *in u32 len, mmio_off; TWDEBUG("inside mmap"); - if(vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) return -EINVAL; + if (vma->vm_pgoff > (~0UL >> MMUPAGE_SHIFT)) + return -EINVAL; - off = vma->vm_pgoff << PAGE_SHIFT; + off = vma->vm_pgoff << MMUPAGE_SHIFT; start = (unsigned long) ivideo.video_base; len = PAGE_ALIGN((start & ~PAGE_MASK) + ivideo.video_size); @@ -1833,7 +1835,7 @@ static int sisfb_mmap(struct fb_info *in if((vma->vm_end - vma->vm_start + off) > len) return -EINVAL; off += start; - vma->vm_pgoff = off >> PAGE_SHIFT; + vma->vm_pgoff = off >> MMUPAGE_SHIFT; vma->vm_flags |= VM_IO; /* by Jake Page; is that really needed? */ #if defined(__i386__) || defined(__x86_64__) diff -prauN pgcl-2.6.0-test11-3/fs/hugetlbfs/inode.c pgcl-2.6.0-test11-4/fs/hugetlbfs/inode.c --- pgcl-2.6.0-test11-3/fs/hugetlbfs/inode.c 2003-11-26 12:45:31.000000000 -0800 +++ pgcl-2.6.0-test11-4/fs/hugetlbfs/inode.c 2003-11-28 20:17:05.000000000 -0800 @@ -66,7 +66,7 @@ static int hugetlbfs_file_mmap(struct fi vma->vm_flags |= VM_HUGETLB | VM_RESERVED; vma->vm_ops = &hugetlb_vm_ops; ret = hugetlb_prefault(mapping, vma); - len = vma_len + ((loff_t)vma->vm_pgoff << PAGE_SHIFT); + len = vma_len + ((loff_t)vma->vm_pgoff << MMUPAGE_SHIFT); if (ret == 0 && inode->i_size < len) inode->i_size = len; up(&inode->i_sem); @@ -262,7 +262,7 @@ static void hugetlbfs_drop_inode(struct /* * h_pgoff is in HPAGE_SIZE units. - * vma->vm_pgoff is in PAGE_SIZE units. + * vma->vm_pgoff is in MMUPAGE_SIZE units. */ static void hugetlb_vmtruncate_list(struct list_head *list, unsigned long h_pgoff) @@ -275,7 +275,7 @@ hugetlb_vmtruncate_list(struct list_head unsigned long h_length; unsigned long v_offset; - h_vm_pgoff = vma->vm_pgoff << (HPAGE_SHIFT - PAGE_SHIFT); + h_vm_pgoff = vma->vm_pgoff >> HPAGE_MMUSHIFT; v_length = vma->vm_end - vma->vm_start; h_length = v_length >> HPAGE_SHIFT; v_offset = (h_pgoff - h_vm_pgoff) << HPAGE_SHIFT; diff -prauN pgcl-2.6.0-test11-3/include/linux/hugetlb.h pgcl-2.6.0-test11-4/include/linux/hugetlb.h --- pgcl-2.6.0-test11-3/include/linux/hugetlb.h 2003-11-26 12:44:08.000000000 -0800 +++ pgcl-2.6.0-test11-4/include/linux/hugetlb.h 2003-11-28 20:53:04.000000000 -0800 @@ -3,6 +3,14 @@ #ifdef CONFIG_HUGETLB_PAGE +#define HPAGE_MMUSHIFT (HPAGE_SHIFT - MMUPAGE_SHIFT) +#define HPAGE_MMUCOUNT (1 << HPAGE_MMUSHIFT) +#define HPAGE_CACHE_SHIFT (HPAGE_SHIFT - PAGE_CACHE_SHIFT) +#define HPAGE_CACHE_COUNT (1 << HPAGE_CACHE_SHIFT) +#define HPAGE_ORDER HUGETLB_PAGE_ORDER +#define HPAGE_COUNT (1 << HUGETLB_PAGE_ORDER) +#define HPAGE_ALIGN(x) (((x) + HPAGE_SIZE - 1) & ~HPAGE_MASK) + struct ctl_table; static inline int is_vm_hugetlb_page(struct vm_area_struct *vma) @@ -12,18 +20,18 @@ static inline int is_vm_hugetlb_page(str int hugetlb_sysctl_handler(struct ctl_table *, int, struct file *, void *, size_t *); int copy_hugetlb_page_range(struct mm_struct *, struct mm_struct *, struct vm_area_struct *); -int follow_hugetlb_page(struct mm_struct *, struct vm_area_struct *, struct page **, struct vm_area_struct **, unsigned long *, int *, int); +int follow_hugetlb_page(struct mm_struct *, struct vm_area_struct *, unsigned long *, struct vm_area_struct **, unsigned long *, int *, int); void zap_hugepage_range(struct vm_area_struct *, unsigned long, unsigned long); void unmap_hugepage_range(struct vm_area_struct *, unsigned long, unsigned long); int hugetlb_prefault(struct address_space *, struct vm_area_struct *); void huge_page_release(struct page *); int hugetlb_report_meminfo(char *); int is_hugepage_mem_enough(size_t); -struct page *follow_huge_addr(struct mm_struct *mm, struct vm_area_struct *vma, +unsigned long follow_huge_addr(struct mm_struct *mm, struct vm_area_struct *vma, unsigned long address, int write); struct vm_area_struct *hugepage_vma(struct mm_struct *mm, unsigned long address); -struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, +unsigned long follow_huge_pmd(struct mm_struct *mm, unsigned long address, pmd_t *pmd, int write); int is_aligned_hugepage_range(unsigned long addr, unsigned long len); int pmd_huge(pmd_t pmd); @@ -57,7 +65,7 @@ static inline int is_vm_hugetlb_page(str #define huge_page_release(page) BUG() #define is_hugepage_mem_enough(size) 0 #define hugetlb_report_meminfo(buf) 0 -#define hugepage_vma(mm, addr) 0 +#define hugepage_vma(mm, addr) NULL #define mark_mm_hugetlb(mm, vma) do { } while (0) #define follow_huge_pmd(mm, addr, pmd, write) 0 #define is_aligned_hugepage_range(addr, len) 0 diff -prauN pgcl-2.6.0-test11-3/mm/memory.c pgcl-2.6.0-test11-4/mm/memory.c --- pgcl-2.6.0-test11-3/mm/memory.c 2003-11-28 01:27:03.000000000 -0800 +++ pgcl-2.6.0-test11-4/mm/memory.c 2003-11-28 20:52:50.000000000 -0800 @@ -618,13 +618,12 @@ unsigned long follow_page(struct mm_stru pmd_t *pmd; pte_t *ptep, pte; unsigned long pfn; - -#if 0 struct vm_area_struct *vma; + vma = hugepage_vma(mm, address); + if (vma) return follow_huge_addr(mm, vma, address, write); -#endif pgd = pgd_offset(mm, address); if (pgd_none(*pgd) || pgd_bad(*pgd)) @@ -633,10 +632,10 @@ unsigned long follow_page(struct mm_stru pmd = pmd_offset(pgd, address); if (pmd_none(*pmd)) goto out; -#if 0 + if (pmd_huge(*pmd)) return follow_huge_pmd(mm, address, pmd, write); -#endif + if (pmd_bad(*pmd)) goto out; @@ -738,13 +737,12 @@ int get_user_pages(task_t *task, struct || !(flags & vma->vm_flags)) return i ? : -EFAULT; -#if 0 if (is_vm_hugetlb_page(vma)) { - i = follow_hugetlb_page(mm, vma, pages, vmas, + i = follow_hugetlb_page(mm, vma, pfns, vmas, &start, &len, i); continue; } -#endif + spin_lock(&mm->page_table_lock); do { unsigned long map_pfn;