aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/mm/pgtable.c')
-rw-r--r--arch/s390/mm/pgtable.c19
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 */
1238bool gmap_test_and_clear_dirty(unsigned long address, struct gmap *gmap) 1238bool 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