rmap_remove() would remove the sptep after locating the correct rmap_head. While in several cases, the caller has already known the correct rmap_head. This patch introduce drop_spte_fast() which remove sptep directly from rmap_head by pte_list_remove(). Signed-off-by: Wei Yang <richard.weiyang@xxxxxxxxx> --- arch/x86/kvm/mmu.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 371d200ffd4a..9fa77aa24fc7 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c @@ -1412,6 +1412,13 @@ static u64 *rmap_get_next(struct rmap_iterator *iter) for (_spte_ = rmap_get_first(_rmap_head_, _iter_); \ _spte_; _spte_ = rmap_get_next(_iter_)) +/* In case caller knows the rmap_head, just remove it by pte_list_remove() */ +static void drop_spte_fast(struct kvm_rmap_head *rmap_head, u64 *sptep) +{ + if (mmu_spte_clear_track_bits(sptep)) + pte_list_remove(sptep, rmap_head); +} + static void drop_spte(struct kvm *kvm, u64 *sptep) { if (mmu_spte_clear_track_bits(sptep)) @@ -1669,7 +1676,7 @@ static bool kvm_zap_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head) while ((sptep = rmap_get_first(rmap_head, &iter))) { rmap_printk("%s: spte %p %llx.\n", __func__, sptep, *sptep); - drop_spte(kvm, sptep); + drop_spte_fast(rmap_head, sptep); flush = true; } @@ -1705,7 +1712,7 @@ static int kvm_set_pte_rmapp(struct kvm *kvm, struct kvm_rmap_head *rmap_head, need_flush = 1; if (pte_write(*ptep)) { - drop_spte(kvm, sptep); + drop_spte_fast(rmap_head, sptep); goto restart; } else { new_spte = *sptep & ~PT64_BASE_ADDR_MASK; @@ -5598,7 +5605,7 @@ static bool kvm_mmu_zap_collapsible_spte(struct kvm *kvm, if (sp->role.direct && !kvm_is_reserved_pfn(pfn) && PageTransCompoundMap(pfn_to_page(pfn))) { - drop_spte(kvm, sptep); + drop_spte_fast(rmap_head, sptep); need_tlb_flush = 1; goto restart; } -- 2.15.1