aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/mm/pgtable.c
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 b48dc5f1900b..463e5ef02304 100644
--- a/arch/s390/mm/pgtable.c
+++ b/arch/s390/mm/pgtable.c
@@ -608,12 +608,29 @@ void ptep_zap_key(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
608bool test_and_clear_guest_dirty(struct mm_struct *mm, unsigned long addr) 608bool test_and_clear_guest_dirty(struct mm_struct *mm, unsigned long addr)
609{ 609{
610 spinlock_t *ptl; 610 spinlock_t *ptl;
611 pgd_t *pgd;
612 pud_t *pud;
613 pmd_t *pmd;
611 pgste_t pgste; 614 pgste_t pgste;
612 pte_t *ptep; 615 pte_t *ptep;
613 pte_t pte; 616 pte_t pte;
614 bool dirty; 617 bool dirty;
615 618
616 ptep = get_locked_pte(mm, addr, &ptl); 619 pgd = pgd_offset(mm, addr);
620 pud = pud_alloc(mm, pgd, addr);
621 if (!pud)
622 return false;
623 pmd = pmd_alloc(mm, pud, addr);
624 if (!pmd)
625 return false;
626 /* We can't run guests backed by huge pages, but userspace can
627 * still set them up and then try to migrate them without any
628 * migration support.
629 */
630 if (pmd_large(*pmd))
631 return true;
632
633 ptep = pte_alloc_map_lock(mm, pmd, addr, &ptl);
617 if (unlikely(!ptep)) 634 if (unlikely(!ptep))
618 return false; 635 return false;
619 636