diff options
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 54d5318f8d3f..1efd2994dccf 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -2144,11 +2144,6 @@ void filemap_map_pages(struct fault_env *fe, | |||
2144 | start_pgoff) { | 2144 | start_pgoff) { |
2145 | if (iter.index > end_pgoff) | 2145 | if (iter.index > end_pgoff) |
2146 | break; | 2146 | break; |
2147 | fe->pte += iter.index - last_pgoff; | ||
2148 | fe->address += (iter.index - last_pgoff) << PAGE_SHIFT; | ||
2149 | last_pgoff = iter.index; | ||
2150 | if (!pte_none(*fe->pte)) | ||
2151 | goto next; | ||
2152 | repeat: | 2147 | repeat: |
2153 | page = radix_tree_deref_slot(slot); | 2148 | page = radix_tree_deref_slot(slot); |
2154 | if (unlikely(!page)) | 2149 | if (unlikely(!page)) |
@@ -2186,7 +2181,13 @@ repeat: | |||
2186 | 2181 | ||
2187 | if (file->f_ra.mmap_miss > 0) | 2182 | if (file->f_ra.mmap_miss > 0) |
2188 | file->f_ra.mmap_miss--; | 2183 | file->f_ra.mmap_miss--; |
2189 | do_set_pte(fe, page); | 2184 | |
2185 | fe->address += (iter.index - last_pgoff) << PAGE_SHIFT; | ||
2186 | if (fe->pte) | ||
2187 | fe->pte += iter.index - last_pgoff; | ||
2188 | last_pgoff = iter.index; | ||
2189 | if (alloc_set_pte(fe, NULL, page)) | ||
2190 | goto unlock; | ||
2190 | unlock_page(page); | 2191 | unlock_page(page); |
2191 | goto next; | 2192 | goto next; |
2192 | unlock: | 2193 | unlock: |
@@ -2194,6 +2195,9 @@ unlock: | |||
2194 | skip: | 2195 | skip: |
2195 | put_page(page); | 2196 | put_page(page); |
2196 | next: | 2197 | next: |
2198 | /* Huge page is mapped? No need to proceed. */ | ||
2199 | if (pmd_trans_huge(*fe->pmd)) | ||
2200 | break; | ||
2197 | if (iter.index == end_pgoff) | 2201 | if (iter.index == end_pgoff) |
2198 | break; | 2202 | break; |
2199 | } | 2203 | } |