]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - mm/filemap.c
mm: postpone page table allocation until we have page to map
[karo-tx-linux.git] / mm / filemap.c
index 54d5318f8d3fecaa962357e16295784d894f3b7d..1efd2994dccfaf9afe781c00a4f9eb761b7a3c0e 100644 (file)
@@ -2144,11 +2144,6 @@ void filemap_map_pages(struct fault_env *fe,
                        start_pgoff) {
                if (iter.index > end_pgoff)
                        break;
-               fe->pte += iter.index - last_pgoff;
-               fe->address += (iter.index - last_pgoff) << PAGE_SHIFT;
-               last_pgoff = iter.index;
-               if (!pte_none(*fe->pte))
-                       goto next;
 repeat:
                page = radix_tree_deref_slot(slot);
                if (unlikely(!page))
@@ -2186,7 +2181,13 @@ repeat:
 
                if (file->f_ra.mmap_miss > 0)
                        file->f_ra.mmap_miss--;
-               do_set_pte(fe, page);
+
+               fe->address += (iter.index - last_pgoff) << PAGE_SHIFT;
+               if (fe->pte)
+                       fe->pte += iter.index - last_pgoff;
+               last_pgoff = iter.index;
+               if (alloc_set_pte(fe, NULL, page))
+                       goto unlock;
                unlock_page(page);
                goto next;
 unlock:
@@ -2194,6 +2195,9 @@ unlock:
 skip:
                put_page(page);
 next:
+               /* Huge page is mapped? No need to proceed. */
+               if (pmd_trans_huge(*fe->pmd))
+                       break;
                if (iter.index == end_pgoff)
                        break;
        }