Commit e7912386 authored by Wei Yang's avatar Wei Yang Committed by Paolo Bonzini

KVM: x86: reintroduce pte_list_remove, but including mmu_spte_clear_track_bits

rmap_remove() removes the sptep after locating the correct rmap_head but,
in several cases, the caller has already known the correct rmap_head.

This patch introduces a new pte_list_remove(); because it is known that
the spte is present (or it would not have an rmap_head), it is safe
to remove the tracking bits without any previous check.
Signed-off-by: default avatarWei Yang <richard.weiyang@gmail.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 8daf3462
...@@ -1301,6 +1301,12 @@ static void __pte_list_remove(u64 *spte, struct kvm_rmap_head *rmap_head) ...@@ -1301,6 +1301,12 @@ static void __pte_list_remove(u64 *spte, struct kvm_rmap_head *rmap_head)
} }
} }
static void pte_list_remove(struct kvm_rmap_head *rmap_head, u64 *sptep)
{
mmu_spte_clear_track_bits(sptep);
__pte_list_remove(sptep, rmap_head);
}
static struct kvm_rmap_head *__gfn_to_rmap(gfn_t gfn, int level, static struct kvm_rmap_head *__gfn_to_rmap(gfn_t gfn, int level,
struct kvm_memory_slot *slot) struct kvm_memory_slot *slot)
{ {
...@@ -1685,7 +1691,7 @@ static bool kvm_zap_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head) ...@@ -1685,7 +1691,7 @@ static bool kvm_zap_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head)
while ((sptep = rmap_get_first(rmap_head, &iter))) { while ((sptep = rmap_get_first(rmap_head, &iter))) {
rmap_printk("%s: spte %p %llx.\n", __func__, sptep, *sptep); rmap_printk("%s: spte %p %llx.\n", __func__, sptep, *sptep);
drop_spte(kvm, sptep); pte_list_remove(rmap_head, sptep);
flush = true; flush = true;
} }
...@@ -1721,7 +1727,7 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head, ...@@ -1721,7 +1727,7 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head,
need_flush = 1; need_flush = 1;
if (pte_write(*ptep)) { if (pte_write(*ptep)) {
drop_spte(kvm, sptep); pte_list_remove(rmap_head, sptep);
goto restart; goto restart;
} else { } else {
new_spte = *sptep & ~PT64_BASE_ADDR_MASK; new_spte = *sptep & ~PT64_BASE_ADDR_MASK;
...@@ -5682,7 +5688,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm, ...@@ -5682,7 +5688,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm,
if (sp->role.direct && if (sp->role.direct &&
!kvm_is_reserved_pfn(pfn) && !kvm_is_reserved_pfn(pfn) &&
PageTransCompoundMap(pfn_to_page(pfn))) { PageTransCompoundMap(pfn_to_page(pfn))) {
drop_spte(kvm, sptep); pte_list_remove(rmap_head, sptep);
need_tlb_flush = 1; need_tlb_flush = 1;
goto restart; goto restart;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment