mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-07 02:19:54 +00:00
KVM: s390: Fix guest migration for huge guests resulting in panic
commit2e4d88009fupstream. While we can technically not run huge page guests right now, we can setup a guest with huge pages. Trying to migrate it will trigger a VM_BUG_ON and, if the kernel is not configured to panic on a BUG, it will happily try to work on non-existing page table entries. With this patch, we always return "dirty" if we encounter a large page when migrating. This at least fixes the immediate problem until we have proper handling for both kind of pages. Fixes:15f36eb("KVM: s390: Add proper dirty bitmap support to S390 kvm.") Signed-off-by: Janosch Frank <frankja@linux.vnet.ibm.com> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
45dc259a47
commit
1f9175b9ee
@@ -606,12 +606,29 @@ void ptep_zap_key(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
|
|||||||
bool test_and_clear_guest_dirty(struct mm_struct *mm, unsigned long addr)
|
bool test_and_clear_guest_dirty(struct mm_struct *mm, unsigned long addr)
|
||||||
{
|
{
|
||||||
spinlock_t *ptl;
|
spinlock_t *ptl;
|
||||||
|
pgd_t *pgd;
|
||||||
|
pud_t *pud;
|
||||||
|
pmd_t *pmd;
|
||||||
pgste_t pgste;
|
pgste_t pgste;
|
||||||
pte_t *ptep;
|
pte_t *ptep;
|
||||||
pte_t pte;
|
pte_t pte;
|
||||||
bool dirty;
|
bool dirty;
|
||||||
|
|
||||||
ptep = get_locked_pte(mm, addr, &ptl);
|
pgd = pgd_offset(mm, addr);
|
||||||
|
pud = pud_alloc(mm, pgd, addr);
|
||||||
|
if (!pud)
|
||||||
|
return false;
|
||||||
|
pmd = pmd_alloc(mm, pud, addr);
|
||||||
|
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;
|
||||||
|
|
||||||
|
ptep = pte_alloc_map_lock(mm, pmd, addr, &ptl);
|
||||||
if (unlikely(!ptep))
|
if (unlikely(!ptep))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user