diff options
Diffstat (limited to 'arch/s390/mm/pgtable.c')
-rw-r--r-- | arch/s390/mm/pgtable.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 8345ae1f117d..05ae254f84cf 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -1237,11 +1237,28 @@ EXPORT_SYMBOL_GPL(s390_reset_cmma); | |||
1237 | */ | 1237 | */ |
1238 | bool gmap_test_and_clear_dirty(unsigned long address, struct gmap *gmap) | 1238 | bool gmap_test_and_clear_dirty(unsigned long address, struct gmap *gmap) |
1239 | { | 1239 | { |
1240 | pgd_t *pgd; | ||
1241 | pud_t *pud; | ||
1242 | pmd_t *pmd; | ||
1240 | pte_t *pte; | 1243 | pte_t *pte; |
1241 | spinlock_t *ptl; | 1244 | spinlock_t *ptl; |
1242 | bool dirty = false; | 1245 | bool dirty = false; |
1243 | 1246 | ||
1244 | pte = get_locked_pte(gmap->mm, address, &ptl); | 1247 | pgd = pgd_offset(gmap->mm, address); |
1248 | pud = pud_alloc(gmap->mm, pgd, address); | ||
1249 | if (!pud) | ||
1250 | return false; | ||
1251 | pmd = pmd_alloc(gmap->mm, pud, address); | ||
1252 | if (!pmd) | ||
1253 | return false; | ||
1254 | /* We can't run guests backed by huge pages, but userspace can | ||
1255 | * still set them up and then try to migrate them without any | ||
1256 | * migration support. | ||
1257 | */ | ||
1258 | if (pmd_large(*pmd)) | ||
1259 | return true; | ||
1260 | |||
1261 | pte = pte_alloc_map_lock(gmap->mm, pmd, address, &ptl); | ||
1245 | if (unlikely(!pte)) | 1262 | if (unlikely(!pte)) |
1246 | return false; | 1263 | return false; |
1247 | 1264 | ||