@@ -1817,18 +1817,6 @@ static int kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, u64 size, void *dat
18171817 return 0 ;
18181818}
18191819
1820- int kvm_unmap_hva (struct kvm * kvm , unsigned long hva )
1821- {
1822- unsigned long end = hva + PAGE_SIZE ;
1823-
1824- if (!kvm -> arch .pgd )
1825- return 0 ;
1826-
1827- trace_kvm_unmap_hva (hva );
1828- handle_hva_to_gpa (kvm , hva , end , & kvm_unmap_hva_handler , NULL );
1829- return 0 ;
1830- }
1831-
18321820int kvm_unmap_hva_range (struct kvm * kvm ,
18331821 unsigned long start , unsigned long end )
18341822{
@@ -1860,13 +1848,20 @@ static int kvm_set_spte_handler(struct kvm *kvm, gpa_t gpa, u64 size, void *data
18601848void kvm_set_spte_hva (struct kvm * kvm , unsigned long hva , pte_t pte )
18611849{
18621850 unsigned long end = hva + PAGE_SIZE ;
1851+ kvm_pfn_t pfn = pte_pfn (pte );
18631852 pte_t stage2_pte ;
18641853
18651854 if (!kvm -> arch .pgd )
18661855 return ;
18671856
18681857 trace_kvm_set_spte_hva (hva );
1869- stage2_pte = pfn_pte (pte_pfn (pte ), PAGE_S2 );
1858+
1859+ /*
1860+ * We've moved a page around, probably through CoW, so let's treat it
1861+ * just like a translation fault and clean the cache to the PoC.
1862+ */
1863+ clean_dcache_guest_page (pfn , PAGE_SIZE );
1864+ stage2_pte = pfn_pte (pfn , PAGE_S2 );
18701865 handle_hva_to_gpa (kvm , hva , end , & kvm_set_spte_handler , & stage2_pte );
18711866}
18721867
0 commit comments