Patch from Hugh Dickins 1. Revert MAP_NONLINEAR and VM_NONLINEAR: I can easily imagine wanting VM_NONLINEAR in future, warning that vma is unusual, but currently it's not useful: install_page just needs to SetPageAnon if the page is put somewhere try_to_unmap_obj_one wouldn't be able to find it. 2. filemap_populate and shmem_populate expect an absolute pgoff, but try_to_unmap_one is forgetting to add in vm_pgoff when doing set_pte. Could be done the other way round, with relative pgoff in the pte? No, that would make splitting a vma tedious. 3. No patch included, but I believe 2.5.64-mm1 is testing Ingo's file-offset-in-pte very much less than you imagine (I've yet to hit a breakpoint on do_file_page, and I don't think that's down to the patches above): Dave's work means that the file pages don't arrive at Ingo's code to set the pte with file offset (unless you actually use Ingo's syscall) - difficult to test both at once, I think. include/asm-i386/mman.h | 1 - include/asm-ppc64/mman.h | 1 - include/linux/mm.h | 1 - mm/fremap.c | 9 ++++++--- mm/mmap.c | 1 - mm/rmap.c | 2 ++ 6 files changed, 8 insertions(+), 7 deletions(-) diff -puN include/asm-i386/mman.h~hugh-nonlinear-fixes include/asm-i386/mman.h --- 25/include/asm-i386/mman.h~hugh-nonlinear-fixes 2003-03-06 18:41:47.000000000 -0800 +++ 25-akpm/include/asm-i386/mman.h 2003-03-06 18:41:47.000000000 -0800 @@ -20,7 +20,6 @@ #define MAP_NORESERVE 0x4000 /* don't check for reservations */ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ -#define MAP_NONLINEAR 0x20000 /* will be used for remap_file_pages */ #define MS_ASYNC 1 /* sync memory asynchronously */ #define MS_INVALIDATE 2 /* invalidate the caches */ diff -puN include/asm-ppc64/mman.h~hugh-nonlinear-fixes include/asm-ppc64/mman.h --- 25/include/asm-ppc64/mman.h~hugh-nonlinear-fixes 2003-03-06 18:41:47.000000000 -0800 +++ 25-akpm/include/asm-ppc64/mman.h 2003-03-06 18:41:47.000000000 -0800 @@ -36,7 +36,6 @@ #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ #define MAP_NONBLOCK 0x10000 /* do not block on IO */ -#define MAP_NONLINEAR 0x20000 /* Mapping may use remap_file_pages */ #define MADV_NORMAL 0x0 /* default page-in behavior */ #define MADV_RANDOM 0x1 /* page-in minimum required */ diff -puN include/linux/mm.h~hugh-nonlinear-fixes include/linux/mm.h --- 25/include/linux/mm.h~hugh-nonlinear-fixes 2003-03-06 18:41:47.000000000 -0800 +++ 25-akpm/include/linux/mm.h 2003-03-06 18:41:47.000000000 -0800 @@ -107,7 +107,6 @@ struct vm_area_struct { #define VM_RESERVED 0x00080000 /* Don't unmap it from swap_out */ #define VM_ACCOUNT 0x00100000 /* Is a VM accounted object */ #define VM_HUGETLB 0x00400000 /* Huge TLB Page VM */ -#define VM_NONLINEAR 0x00800000 /* Nonlinear area */ #ifdef CONFIG_STACK_GROWSUP #define VM_STACK_FLAGS (VM_GROWSUP | VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT) diff -puN mm/fremap.c~hugh-nonlinear-fixes mm/fremap.c --- 25/mm/fremap.c~hugh-nonlinear-fixes 2003-03-06 18:41:47.000000000 -0800 +++ 25-akpm/mm/fremap.c 2003-03-06 18:41:51.000000000 -0800 @@ -57,6 +57,7 @@ int install_page(struct mm_struct *mm, s pgd_t *pgd; pmd_t *pmd; struct pte_chain *pte_chain; + unsigned long pgidx; pte_chain = pte_chain_alloc(GFP_KERNEL); if (!pte_chain) @@ -79,7 +80,10 @@ int install_page(struct mm_struct *mm, s flush_icache_page(vma, page); entry = mk_pte(page, prot); set_pte(pte, entry); - if (vma->vm_flags & VM_NONLINEAR) + pgidx = (addr - vma->vm_start) >> PAGE_SHIFT; + pgidx += vma->vm_pgoff; + pgidx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT; + if (page->index != pgidx) SetPageAnon(page); pte_chain = page_add_rmap(page, pte, pte_chain); pte_unmap(pte); @@ -139,8 +143,7 @@ int sys_remap_file_pages(unsigned long s * and that the remapped range is valid and fully within * the single existing vma: */ - if (vma && - ((vma->vm_flags & (VM_SHARED|VM_NONLINEAR)) == (VM_SHARED|VM_NONLINEAR)) && + if (vma && (vma->vm_flags & VM_SHARED) && vma->vm_ops && vma->vm_ops->populate && end > start && start >= vma->vm_start && end <= vma->vm_end) diff -puN mm/mmap.c~hugh-nonlinear-fixes mm/mmap.c --- 25/mm/mmap.c~hugh-nonlinear-fixes 2003-03-06 18:41:47.000000000 -0800 +++ 25-akpm/mm/mmap.c 2003-03-06 18:41:51.000000000 -0800 @@ -219,7 +219,6 @@ calc_vm_flags(unsigned long prot, unsign flag_bits = _trans(flags, MAP_GROWSDOWN, VM_GROWSDOWN) | _trans(flags, MAP_DENYWRITE, VM_DENYWRITE) | - _trans(flags, MAP_NONLINEAR, VM_NONLINEAR) | _trans(flags, MAP_EXECUTABLE, VM_EXECUTABLE); return prot_bits | flag_bits; #undef _trans diff -puN mm/rmap.c~hugh-nonlinear-fixes mm/rmap.c --- 25/mm/rmap.c~hugh-nonlinear-fixes 2003-03-06 18:41:47.000000000 -0800 +++ 25-akpm/mm/rmap.c 2003-03-06 18:41:51.000000000 -0800 @@ -598,6 +598,8 @@ static int try_to_unmap_one(struct page * in the pte. */ pgidx = (address - vma->vm_start) >> PAGE_SHIFT; + pgidx += vma->vm_pgoff; + pgidx >>= PAGE_CACHE_SHIFT - PAGE_SHIFT; if (1 || page->index != pgidx) { set_pte(ptep, pgoff_to_pte(page->index)); BUG_ON(!pte_file(*ptep)); _