[PATCH] nonlinear oddities

From: Hugh Dickins (hugh@veritas.com)
Date: Thu Mar 06 2003 - 11:53:56 EST


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.

Hugh

--- 2.5.64-mm1/include/asm-i386/mman.h Thu Mar 6 08:24:23 2003
+++ linux/include/asm-i386/mman.h Thu Mar 6 15:59:49 2003
@@ -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 */
--- 2.5.64-mm1/include/asm-ppc64/mman.h Thu Mar 6 08:24:23 2003
+++ linux/include/asm-ppc64/mman.h Thu Mar 6 15:59:49 2003
@@ -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 */
--- 2.5.64-mm1/include/linux/mm.h Thu Mar 6 08:24:24 2003
+++ linux/include/linux/mm.h Thu Mar 6 15:59:49 2003
@@ -107,7 +107,6 @@
 #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)
--- 2.5.64-mm1/mm/fremap.c Thu Mar 6 08:24:24 2003
+++ linux/mm/fremap.c Thu Mar 6 15:59:49 2003
@@ -1,5 +1,5 @@
 /*
- * linux/mm/mpopulate.c
+ * linux/mm/fremap.c
  *
  * Explicit pagetable population and nonlinear (random) mappings support.
  *
@@ -57,6 +57,7 @@
         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 @@
         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 @@
          * 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)
--- 2.5.64-mm1/mm/mmap.c Thu Mar 6 08:24:24 2003
+++ linux/mm/mmap.c Thu Mar 6 15:59:49 2003
@@ -219,7 +219,6 @@
         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
--- 2.5.64-mm1/mm/rmap.c Thu Mar 6 08:24:24 2003
+++ linux/mm/rmap.c Thu Mar 6 15:59:49 2003
@@ -598,6 +598,8 @@
                  * 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));

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Fri Mar 07 2003 - 22:00:32 EST