summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorJanosch Frank <frankja@linux.vnet.ibm.com>2017-03-18 11:24:32 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-03-18 11:24:32 +0000
commitd73e47204a115993c5a4e178ce09d0245dcb15f6 (patch)
tree4cc827716a616d2918c22efef074e342f06cd30f /arch
parent03c7b939b1feccb9ef56bad2d491dadeeb0875cf (diff)
parentb0e85701a7766341618d5e924f29f359431f9c91 (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.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);
*/
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;