diff options
author | Alex Shi <alex.shi@linaro.org> | 2016-06-14 17:06:48 +0800 |
---|---|---|
committer | Alex Shi <alex.shi@linaro.org> | 2016-06-14 17:06:48 +0800 |
commit | 1beb6ea36b283c1dc34812c6ef9bf56a1e494f8c (patch) | |
tree | 539dc6f4b8c68f385a6457ef7b9d15570a0a8dcc /arch/arm | |
parent | 6c1be3bf831c5b1f2ba51425315287df2c350633 (diff) | |
parent | b5076139991c6b12c62346d9880eec1d4227d99f (diff) |
Merge tag 'v3.18.35' into linux-linaro-lsk-v3.18
This is the 3.18.35 stable release
Diffstat (limited to 'arch/arm')
-rw-r--r-- | arch/arm/kvm/mmu.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 3535480e0e6b..0310b03697e0 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c @@ -841,11 +841,14 @@ static int stage2_set_pmd_huge(struct kvm *kvm, struct kvm_mmu_memory_cache VM_BUG_ON(pmd_present(*pmd) && pmd_pfn(*pmd) != pmd_pfn(*new_pmd)); old_pmd = *pmd; - kvm_set_pmd(pmd, *new_pmd); - if (pmd_present(old_pmd)) + if (pmd_present(old_pmd)) { + pmd_clear(pmd); kvm_tlb_flush_vmid_ipa(kvm, addr); - else + } else { get_page(virt_to_page(pmd)); + } + + kvm_set_pmd(pmd, *new_pmd); return 0; } @@ -882,12 +885,14 @@ static int stage2_set_pte(struct kvm *kvm, struct kvm_mmu_memory_cache *cache, /* Create 2nd stage page table mapping - Level 3 */ old_pte = *pte; - kvm_set_pte(pte, *new_pte); - if (pte_present(old_pte)) + if (pte_present(old_pte)) { + kvm_set_pte(pte, __pte(0)); kvm_tlb_flush_vmid_ipa(kvm, addr); - else + } else { get_page(virt_to_page(pte)); + } + kvm_set_pte(pte, *new_pte); return 0; } |