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 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) | |||
608 | bool test_and_clear_guest_dirty(struct mm_struct *mm, unsigned long addr) | 608 | bool 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 | ||