@@ -43,6 +43,7 @@ void kvm_mmu_uninit_tdp_mmu(struct kvm *kvm)
43
43
if (!kvm -> arch .tdp_mmu_enabled )
44
44
return ;
45
45
46
+ WARN_ON (!list_empty (& kvm -> arch .tdp_mmu_pages ));
46
47
WARN_ON (!list_empty (& kvm -> arch .tdp_mmu_roots ));
47
48
48
49
/*
@@ -81,8 +82,6 @@ static void tdp_mmu_free_sp_rcu_callback(struct rcu_head *head)
81
82
void kvm_tdp_mmu_put_root (struct kvm * kvm , struct kvm_mmu_page * root ,
82
83
bool shared )
83
84
{
84
- gfn_t max_gfn = 1ULL << (shadow_phys_bits - PAGE_SHIFT );
85
-
86
85
kvm_lockdep_assert_mmu_lock_held (kvm , shared );
87
86
88
87
if (!refcount_dec_and_test (& root -> tdp_mmu_root_count ))
@@ -94,7 +93,7 @@ void kvm_tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root,
94
93
list_del_rcu (& root -> link );
95
94
spin_unlock (& kvm -> arch .tdp_mmu_pages_lock );
96
95
97
- zap_gfn_range (kvm , root , 0 , max_gfn , false, false, shared );
96
+ zap_gfn_range (kvm , root , 0 , -1ull , false, false, shared );
98
97
99
98
call_rcu (& root -> rcu_head , tdp_mmu_free_sp_rcu_callback );
100
99
}
@@ -724,13 +723,29 @@ static bool zap_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root,
724
723
gfn_t start , gfn_t end , bool can_yield , bool flush ,
725
724
bool shared )
726
725
{
726
+ gfn_t max_gfn_host = 1ULL << (shadow_phys_bits - PAGE_SHIFT );
727
+ bool zap_all = (start == 0 && end >= max_gfn_host );
727
728
struct tdp_iter iter ;
728
729
730
+ /*
731
+ * No need to try to step down in the iterator when zapping all SPTEs,
732
+ * zapping the top-level non-leaf SPTEs will recurse on their children.
733
+ */
734
+ int min_level = zap_all ? root -> role .level : PG_LEVEL_4K ;
735
+
736
+ /*
737
+ * Bound the walk at host.MAXPHYADDR, guest accesses beyond that will
738
+ * hit a #PF(RSVD) and never get to an EPT Violation/Misconfig / #NPF,
739
+ * and so KVM will never install a SPTE for such addresses.
740
+ */
741
+ end = min (end , max_gfn_host );
742
+
729
743
kvm_lockdep_assert_mmu_lock_held (kvm , shared );
730
744
731
745
rcu_read_lock ();
732
746
733
- tdp_root_for_each_pte (iter , root , start , end ) {
747
+ for_each_tdp_pte_min_level (iter , root -> spt , root -> role .level ,
748
+ min_level , start , end ) {
734
749
retry :
735
750
if (can_yield &&
736
751
tdp_mmu_iter_cond_resched (kvm , & iter , flush , shared )) {
@@ -744,9 +759,10 @@ static bool zap_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root,
744
759
/*
745
760
* If this is a non-last-level SPTE that covers a larger range
746
761
* than should be zapped, continue, and zap the mappings at a
747
- * lower level.
762
+ * lower level, except when zapping all SPTEs .
748
763
*/
749
- if ((iter .gfn < start ||
764
+ if (!zap_all &&
765
+ (iter .gfn < start ||
750
766
iter .gfn + KVM_PAGES_PER_HPAGE (iter .level ) > end ) &&
751
767
!is_last_spte (iter .old_spte , iter .level ))
752
768
continue ;
@@ -794,12 +810,11 @@ bool __kvm_tdp_mmu_zap_gfn_range(struct kvm *kvm, int as_id, gfn_t start,
794
810
795
811
void kvm_tdp_mmu_zap_all (struct kvm * kvm )
796
812
{
797
- gfn_t max_gfn = 1ULL << (shadow_phys_bits - PAGE_SHIFT );
798
813
bool flush = false;
799
814
int i ;
800
815
801
816
for (i = 0 ; i < KVM_ADDRESS_SPACE_NUM ; i ++ )
802
- flush = kvm_tdp_mmu_zap_gfn_range (kvm , i , 0 , max_gfn ,
817
+ flush = kvm_tdp_mmu_zap_gfn_range (kvm , i , 0 , -1ull ,
803
818
flush , false);
804
819
805
820
if (flush )
@@ -838,7 +853,6 @@ static struct kvm_mmu_page *next_invalidated_root(struct kvm *kvm,
838
853
*/
839
854
void kvm_tdp_mmu_zap_invalidated_roots (struct kvm * kvm )
840
855
{
841
- gfn_t max_gfn = 1ULL << (shadow_phys_bits - PAGE_SHIFT );
842
856
struct kvm_mmu_page * next_root ;
843
857
struct kvm_mmu_page * root ;
844
858
bool flush = false;
@@ -854,8 +868,7 @@ void kvm_tdp_mmu_zap_invalidated_roots(struct kvm *kvm)
854
868
855
869
rcu_read_unlock ();
856
870
857
- flush = zap_gfn_range (kvm , root , 0 , max_gfn , true, flush ,
858
- true);
871
+ flush = zap_gfn_range (kvm , root , 0 , -1ull , true, flush , true);
859
872
860
873
/*
861
874
* Put the reference acquired in
0 commit comments