@@ -73,11 +73,8 @@ static void tdp_mmu_free_sp_rcu_callback(struct rcu_head *head)
73
73
tdp_mmu_free_sp (sp );
74
74
}
75
75
76
- void kvm_tdp_mmu_put_root (struct kvm * kvm , struct kvm_mmu_page * root ,
77
- bool shared )
76
+ void kvm_tdp_mmu_put_root (struct kvm * kvm , struct kvm_mmu_page * root )
78
77
{
79
- kvm_lockdep_assert_mmu_lock_held (kvm , shared );
80
-
81
78
if (!refcount_dec_and_test (& root -> tdp_mmu_root_count ))
82
79
return ;
83
80
@@ -106,10 +103,16 @@ void kvm_tdp_mmu_put_root(struct kvm *kvm, struct kvm_mmu_page *root,
106
103
*/
107
104
static struct kvm_mmu_page * tdp_mmu_next_root (struct kvm * kvm ,
108
105
struct kvm_mmu_page * prev_root ,
109
- bool shared , bool only_valid )
106
+ bool only_valid )
110
107
{
111
108
struct kvm_mmu_page * next_root ;
112
109
110
+ /*
111
+ * While the roots themselves are RCU-protected, fields such as
112
+ * role.invalid are protected by mmu_lock.
113
+ */
114
+ lockdep_assert_held (& kvm -> mmu_lock );
115
+
113
116
rcu_read_lock ();
114
117
115
118
if (prev_root )
@@ -132,7 +135,7 @@ static struct kvm_mmu_page *tdp_mmu_next_root(struct kvm *kvm,
132
135
rcu_read_unlock ();
133
136
134
137
if (prev_root )
135
- kvm_tdp_mmu_put_root (kvm , prev_root , shared );
138
+ kvm_tdp_mmu_put_root (kvm , prev_root );
136
139
137
140
return next_root ;
138
141
}
@@ -144,26 +147,22 @@ static struct kvm_mmu_page *tdp_mmu_next_root(struct kvm *kvm,
144
147
* recent root. (Unless keeping a live reference is desirable.)
145
148
*
146
149
* If shared is set, this function is operating under the MMU lock in read
147
- * mode. In the unlikely event that this thread must free a root, the lock
148
- * will be temporarily dropped and reacquired in write mode.
150
+ * mode.
149
151
*/
150
- #define __for_each_tdp_mmu_root_yield_safe (_kvm , _root , _as_id , _shared , _only_valid )\
151
- for (_root = tdp_mmu_next_root(_kvm, NULL, _shared, _only_valid); \
152
- _root; \
153
- _root = tdp_mmu_next_root(_kvm, _root, _shared, _only_valid)) \
154
- if (kvm_lockdep_assert_mmu_lock_held(_kvm, _shared) && \
155
- kvm_mmu_page_as_id(_root) != _as_id) { \
152
+ #define __for_each_tdp_mmu_root_yield_safe (_kvm , _root , _as_id , _only_valid )\
153
+ for (_root = tdp_mmu_next_root(_kvm, NULL, _only_valid); \
154
+ ({ lockdep_assert_held(&(_kvm)->mmu_lock); }), _root; \
155
+ _root = tdp_mmu_next_root(_kvm, _root, _only_valid)) \
156
+ if (kvm_mmu_page_as_id(_root) != _as_id) { \
156
157
} else
157
158
158
- #define for_each_valid_tdp_mmu_root_yield_safe (_kvm , _root , _as_id , _shared ) \
159
- __for_each_tdp_mmu_root_yield_safe(_kvm, _root, _as_id, _shared, true)
159
+ #define for_each_valid_tdp_mmu_root_yield_safe (_kvm , _root , _as_id ) \
160
+ __for_each_tdp_mmu_root_yield_safe(_kvm, _root, _as_id, true)
160
161
161
- #define for_each_tdp_mmu_root_yield_safe (_kvm , _root , _shared ) \
162
- for (_root = tdp_mmu_next_root(_kvm, NULL, _shared, false); \
163
- _root; \
164
- _root = tdp_mmu_next_root(_kvm, _root, _shared, false)) \
165
- if (!kvm_lockdep_assert_mmu_lock_held(_kvm, _shared)) { \
166
- } else
162
+ #define for_each_tdp_mmu_root_yield_safe (_kvm , _root ) \
163
+ for (_root = tdp_mmu_next_root(_kvm, NULL, false); \
164
+ ({ lockdep_assert_held(&(_kvm)->mmu_lock); }), _root; \
165
+ _root = tdp_mmu_next_root(_kvm, _root, false))
167
166
168
167
/*
169
168
* Iterate over all TDP MMU roots. Requires that mmu_lock be held for write,
@@ -276,28 +275,18 @@ static void tdp_unaccount_mmu_page(struct kvm *kvm, struct kvm_mmu_page *sp)
276
275
*
277
276
* @kvm: kvm instance
278
277
* @sp: the page to be removed
279
- * @shared: This operation may not be running under the exclusive use of
280
- * the MMU lock and the operation must synchronize with other
281
- * threads that might be adding or removing pages.
282
278
*/
283
- static void tdp_mmu_unlink_sp (struct kvm * kvm , struct kvm_mmu_page * sp ,
284
- bool shared )
279
+ static void tdp_mmu_unlink_sp (struct kvm * kvm , struct kvm_mmu_page * sp )
285
280
{
286
281
tdp_unaccount_mmu_page (kvm , sp );
287
282
288
283
if (!sp -> nx_huge_page_disallowed )
289
284
return ;
290
285
291
- if (shared )
292
- spin_lock (& kvm -> arch .tdp_mmu_pages_lock );
293
- else
294
- lockdep_assert_held_write (& kvm -> mmu_lock );
295
-
286
+ spin_lock (& kvm -> arch .tdp_mmu_pages_lock );
296
287
sp -> nx_huge_page_disallowed = false;
297
288
untrack_possible_nx_huge_page (kvm , sp );
298
-
299
- if (shared )
300
- spin_unlock (& kvm -> arch .tdp_mmu_pages_lock );
289
+ spin_unlock (& kvm -> arch .tdp_mmu_pages_lock );
301
290
}
302
291
303
292
/**
@@ -326,7 +315,7 @@ static void handle_removed_pt(struct kvm *kvm, tdp_ptep_t pt, bool shared)
326
315
327
316
trace_kvm_mmu_prepare_zap_page (sp );
328
317
329
- tdp_mmu_unlink_sp (kvm , sp , shared );
318
+ tdp_mmu_unlink_sp (kvm , sp );
330
319
331
320
for (i = 0 ; i < SPTE_ENT_PER_PAGE ; i ++ ) {
332
321
tdp_ptep_t sptep = pt + i ;
@@ -832,7 +821,8 @@ bool kvm_tdp_mmu_zap_leafs(struct kvm *kvm, gfn_t start, gfn_t end, bool flush)
832
821
{
833
822
struct kvm_mmu_page * root ;
834
823
835
- for_each_tdp_mmu_root_yield_safe (kvm , root , false)
824
+ lockdep_assert_held_write (& kvm -> mmu_lock );
825
+ for_each_tdp_mmu_root_yield_safe (kvm , root )
836
826
flush = tdp_mmu_zap_leafs (kvm , root , start , end , true, flush );
837
827
838
828
return flush ;
@@ -854,7 +844,8 @@ void kvm_tdp_mmu_zap_all(struct kvm *kvm)
854
844
* is being destroyed or the userspace VMM has exited. In both cases,
855
845
* KVM_RUN is unreachable, i.e. no vCPUs will ever service the request.
856
846
*/
857
- for_each_tdp_mmu_root_yield_safe (kvm , root , false)
847
+ lockdep_assert_held_write (& kvm -> mmu_lock );
848
+ for_each_tdp_mmu_root_yield_safe (kvm , root )
858
849
tdp_mmu_zap_root (kvm , root , false);
859
850
}
860
851
@@ -868,7 +859,7 @@ void kvm_tdp_mmu_zap_invalidated_roots(struct kvm *kvm)
868
859
869
860
read_lock (& kvm -> mmu_lock );
870
861
871
- for_each_tdp_mmu_root_yield_safe (kvm , root , true ) {
862
+ for_each_tdp_mmu_root_yield_safe (kvm , root ) {
872
863
if (!root -> tdp_mmu_scheduled_root_to_zap )
873
864
continue ;
874
865
@@ -891,7 +882,7 @@ void kvm_tdp_mmu_zap_invalidated_roots(struct kvm *kvm)
891
882
* the root must be reachable by mmu_notifiers while it's being
892
883
* zapped
893
884
*/
894
- kvm_tdp_mmu_put_root (kvm , root , true );
885
+ kvm_tdp_mmu_put_root (kvm , root );
895
886
}
896
887
897
888
read_unlock (& kvm -> mmu_lock );
@@ -1125,7 +1116,7 @@ bool kvm_tdp_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range,
1125
1116
{
1126
1117
struct kvm_mmu_page * root ;
1127
1118
1128
- __for_each_tdp_mmu_root_yield_safe (kvm , root , range -> slot -> as_id , false, false )
1119
+ __for_each_tdp_mmu_root_yield_safe (kvm , root , range -> slot -> as_id , false)
1129
1120
flush = tdp_mmu_zap_leafs (kvm , root , range -> start , range -> end ,
1130
1121
range -> may_block , flush );
1131
1122
@@ -1314,7 +1305,7 @@ bool kvm_tdp_mmu_wrprot_slot(struct kvm *kvm,
1314
1305
1315
1306
lockdep_assert_held_read (& kvm -> mmu_lock );
1316
1307
1317
- for_each_valid_tdp_mmu_root_yield_safe (kvm , root , slot -> as_id , true )
1308
+ for_each_valid_tdp_mmu_root_yield_safe (kvm , root , slot -> as_id )
1318
1309
spte_set |= wrprot_gfn_range (kvm , root , slot -> base_gfn ,
1319
1310
slot -> base_gfn + slot -> npages , min_level );
1320
1311
@@ -1346,6 +1337,8 @@ static struct kvm_mmu_page *tdp_mmu_alloc_sp_for_split(struct kvm *kvm,
1346
1337
{
1347
1338
struct kvm_mmu_page * sp ;
1348
1339
1340
+ kvm_lockdep_assert_mmu_lock_held (kvm , shared );
1341
+
1349
1342
/*
1350
1343
* Since we are allocating while under the MMU lock we have to be
1351
1344
* careful about GFP flags. Use GFP_NOWAIT to avoid blocking on direct
@@ -1496,11 +1489,10 @@ void kvm_tdp_mmu_try_split_huge_pages(struct kvm *kvm,
1496
1489
int r = 0 ;
1497
1490
1498
1491
kvm_lockdep_assert_mmu_lock_held (kvm , shared );
1499
-
1500
- for_each_valid_tdp_mmu_root_yield_safe (kvm , root , slot -> as_id , shared ) {
1492
+ for_each_valid_tdp_mmu_root_yield_safe (kvm , root , slot -> as_id ) {
1501
1493
r = tdp_mmu_split_huge_pages_root (kvm , root , start , end , target_level , shared );
1502
1494
if (r ) {
1503
- kvm_tdp_mmu_put_root (kvm , root , shared );
1495
+ kvm_tdp_mmu_put_root (kvm , root );
1504
1496
break ;
1505
1497
}
1506
1498
}
@@ -1522,12 +1514,13 @@ static bool clear_dirty_gfn_range(struct kvm *kvm, struct kvm_mmu_page *root,
1522
1514
1523
1515
rcu_read_lock ();
1524
1516
1525
- tdp_root_for_each_leaf_pte (iter , root , start , end ) {
1517
+ tdp_root_for_each_pte (iter , root , start , end ) {
1526
1518
retry :
1527
- if (tdp_mmu_iter_cond_resched (kvm , & iter , false, true))
1519
+ if (!is_shadow_present_pte (iter .old_spte ) ||
1520
+ !is_last_spte (iter .old_spte , iter .level ))
1528
1521
continue ;
1529
1522
1530
- if (! is_shadow_present_pte ( iter . old_spte ))
1523
+ if (tdp_mmu_iter_cond_resched ( kvm , & iter , false, true ))
1531
1524
continue ;
1532
1525
1533
1526
KVM_MMU_WARN_ON (kvm_ad_enabled () &&
@@ -1560,8 +1553,7 @@ bool kvm_tdp_mmu_clear_dirty_slot(struct kvm *kvm,
1560
1553
bool spte_set = false;
1561
1554
1562
1555
lockdep_assert_held_read (& kvm -> mmu_lock );
1563
-
1564
- for_each_valid_tdp_mmu_root_yield_safe (kvm , root , slot -> as_id , true)
1556
+ for_each_valid_tdp_mmu_root_yield_safe (kvm , root , slot -> as_id )
1565
1557
spte_set |= clear_dirty_gfn_range (kvm , root , slot -> base_gfn ,
1566
1558
slot -> base_gfn + slot -> npages );
1567
1559
@@ -1695,8 +1687,7 @@ void kvm_tdp_mmu_zap_collapsible_sptes(struct kvm *kvm,
1695
1687
struct kvm_mmu_page * root ;
1696
1688
1697
1689
lockdep_assert_held_read (& kvm -> mmu_lock );
1698
-
1699
- for_each_valid_tdp_mmu_root_yield_safe (kvm , root , slot -> as_id , true)
1690
+ for_each_valid_tdp_mmu_root_yield_safe (kvm , root , slot -> as_id )
1700
1691
zap_collapsible_spte_range (kvm , root , slot );
1701
1692
}
1702
1693
0 commit comments