diff options
Diffstat (limited to 'arch/x86/mm/fault.c')
-rw-r--r-- | arch/x86/mm/fault.c | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 6c46095cd0d9..9ceacd1156db 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -177,13 +177,14 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) | |||
177 | 177 | ||
178 | pmd = pmd_offset(pud, address); | 178 | pmd = pmd_offset(pud, address); |
179 | pmd_k = pmd_offset(pud_k, address); | 179 | pmd_k = pmd_offset(pud_k, address); |
180 | if (!pmd_present(*pmd_k)) | ||
181 | return NULL; | ||
182 | 180 | ||
183 | if (!pmd_present(*pmd)) | 181 | if (pmd_present(*pmd) != pmd_present(*pmd_k)) |
184 | set_pmd(pmd, *pmd_k); | 182 | set_pmd(pmd, *pmd_k); |
183 | |||
184 | if (!pmd_present(*pmd_k)) | ||
185 | return NULL; | ||
185 | else | 186 | else |
186 | BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k)); | 187 | BUG_ON(pmd_pfn(*pmd) != pmd_pfn(*pmd_k)); |
187 | 188 | ||
188 | return pmd_k; | 189 | return pmd_k; |
189 | } | 190 | } |
@@ -203,17 +204,13 @@ void vmalloc_sync_all(void) | |||
203 | spin_lock(&pgd_lock); | 204 | spin_lock(&pgd_lock); |
204 | list_for_each_entry(page, &pgd_list, lru) { | 205 | list_for_each_entry(page, &pgd_list, lru) { |
205 | spinlock_t *pgt_lock; | 206 | spinlock_t *pgt_lock; |
206 | pmd_t *ret; | ||
207 | 207 | ||
208 | /* the pgt_lock only for Xen */ | 208 | /* the pgt_lock only for Xen */ |
209 | pgt_lock = &pgd_page_get_mm(page)->page_table_lock; | 209 | pgt_lock = &pgd_page_get_mm(page)->page_table_lock; |
210 | 210 | ||
211 | spin_lock(pgt_lock); | 211 | spin_lock(pgt_lock); |
212 | ret = vmalloc_sync_one(page_address(page), address); | 212 | vmalloc_sync_one(page_address(page), address); |
213 | spin_unlock(pgt_lock); | 213 | spin_unlock(pgt_lock); |
214 | |||
215 | if (!ret) | ||
216 | break; | ||
217 | } | 214 | } |
218 | spin_unlock(&pgd_lock); | 215 | spin_unlock(&pgd_lock); |
219 | } | 216 | } |