diff options
| author | Janosch Frank <frankja@linux.vnet.ibm.com> | 2017-03-18 11:24:32 +0000 |
|---|---|---|
| committer | android-build-merger <android-build-merger@google.com> | 2017-03-18 11:24:32 +0000 |
| commit | d73e47204a115993c5a4e178ce09d0245dcb15f6 (patch) | |
| tree | 4cc827716a616d2918c22efef074e342f06cd30f /arch | |
| parent | 03c7b939b1feccb9ef56bad2d491dadeeb0875cf (diff) | |
| parent | b0e85701a7766341618d5e924f29f359431f9c91 (diff) | |
KVM: s390: Fix guest migration for huge guests resulting in panic
am: b0e85701a7
Change-Id: I12bd03d14c3bf2c1e5d2c70e1765eba1d6d202b9
Diffstat (limited to 'arch')
| -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); */ bool gmap_test_and_clear_dirty(unsigned long address, struct gmap *gmap) { + pgd_t *pgd; + pud_t *pud; + pmd_t *pmd; pte_t *pte; spinlock_t *ptl; bool dirty = false; - pte = get_locked_pte(gmap->mm, address, &ptl); + pgd = pgd_offset(gmap->mm, address); + pud = pud_alloc(gmap->mm, pgd, address); + if (!pud) + return false; + pmd = pmd_alloc(gmap->mm, pud, address); + if (!pmd) + return false; + /* We can't run guests backed by huge pages, but userspace can + * still set them up and then try to migrate them without any + * migration support. + */ + if (pmd_large(*pmd)) + return true; + + pte = pte_alloc_map_lock(gmap->mm, pmd, address, &ptl); if (unlikely(!pte)) return false; |
