@@ -1516,6 +1516,59 @@ static void slot_rmap_walk_next(struct slot_rmap_walk_iterator *iterator)
1516
1516
slot_rmap_walk_okay(_iter_); \
1517
1517
slot_rmap_walk_next(_iter_))
1518
1518
1519
+ /* The return value indicates if tlb flush on all vcpus is needed. */
1520
+ typedef bool (* slot_rmaps_handler ) (struct kvm * kvm ,
1521
+ struct kvm_rmap_head * rmap_head ,
1522
+ const struct kvm_memory_slot * slot );
1523
+
1524
+ static __always_inline bool __walk_slot_rmaps (struct kvm * kvm ,
1525
+ const struct kvm_memory_slot * slot ,
1526
+ slot_rmaps_handler fn ,
1527
+ int start_level , int end_level ,
1528
+ gfn_t start_gfn , gfn_t end_gfn ,
1529
+ bool flush_on_yield , bool flush )
1530
+ {
1531
+ struct slot_rmap_walk_iterator iterator ;
1532
+
1533
+ lockdep_assert_held_write (& kvm -> mmu_lock );
1534
+
1535
+ for_each_slot_rmap_range (slot , start_level , end_level , start_gfn ,
1536
+ end_gfn , & iterator ) {
1537
+ if (iterator .rmap )
1538
+ flush |= fn (kvm , iterator .rmap , slot );
1539
+
1540
+ if (need_resched () || rwlock_needbreak (& kvm -> mmu_lock )) {
1541
+ if (flush && flush_on_yield ) {
1542
+ kvm_flush_remote_tlbs_range (kvm , start_gfn ,
1543
+ iterator .gfn - start_gfn + 1 );
1544
+ flush = false;
1545
+ }
1546
+ cond_resched_rwlock_write (& kvm -> mmu_lock );
1547
+ }
1548
+ }
1549
+
1550
+ return flush ;
1551
+ }
1552
+
1553
+ static __always_inline bool walk_slot_rmaps (struct kvm * kvm ,
1554
+ const struct kvm_memory_slot * slot ,
1555
+ slot_rmaps_handler fn ,
1556
+ int start_level , int end_level ,
1557
+ bool flush_on_yield )
1558
+ {
1559
+ return __walk_slot_rmaps (kvm , slot , fn , start_level , end_level ,
1560
+ slot -> base_gfn , slot -> base_gfn + slot -> npages - 1 ,
1561
+ flush_on_yield , false);
1562
+ }
1563
+
1564
+ static __always_inline bool walk_slot_rmaps_4k (struct kvm * kvm ,
1565
+ const struct kvm_memory_slot * slot ,
1566
+ slot_rmaps_handler fn ,
1567
+ bool flush_on_yield )
1568
+ {
1569
+ return walk_slot_rmaps (kvm , slot , fn , PG_LEVEL_4K , PG_LEVEL_4K , flush_on_yield );
1570
+ }
1571
+
1519
1572
typedef bool (* rmap_handler_t )(struct kvm * kvm , struct kvm_rmap_head * rmap_head ,
1520
1573
struct kvm_memory_slot * slot , gfn_t gfn ,
1521
1574
int level );
@@ -6272,59 +6325,6 @@ void kvm_configure_mmu(bool enable_tdp, int tdp_forced_root_level,
6272
6325
}
6273
6326
EXPORT_SYMBOL_GPL (kvm_configure_mmu );
6274
6327
6275
- /* The return value indicates if tlb flush on all vcpus is needed. */
6276
- typedef bool (* slot_rmaps_handler ) (struct kvm * kvm ,
6277
- struct kvm_rmap_head * rmap_head ,
6278
- const struct kvm_memory_slot * slot );
6279
-
6280
- static __always_inline bool __walk_slot_rmaps (struct kvm * kvm ,
6281
- const struct kvm_memory_slot * slot ,
6282
- slot_rmaps_handler fn ,
6283
- int start_level , int end_level ,
6284
- gfn_t start_gfn , gfn_t end_gfn ,
6285
- bool flush_on_yield , bool flush )
6286
- {
6287
- struct slot_rmap_walk_iterator iterator ;
6288
-
6289
- lockdep_assert_held_write (& kvm -> mmu_lock );
6290
-
6291
- for_each_slot_rmap_range (slot , start_level , end_level , start_gfn ,
6292
- end_gfn , & iterator ) {
6293
- if (iterator .rmap )
6294
- flush |= fn (kvm , iterator .rmap , slot );
6295
-
6296
- if (need_resched () || rwlock_needbreak (& kvm -> mmu_lock )) {
6297
- if (flush && flush_on_yield ) {
6298
- kvm_flush_remote_tlbs_range (kvm , start_gfn ,
6299
- iterator .gfn - start_gfn + 1 );
6300
- flush = false;
6301
- }
6302
- cond_resched_rwlock_write (& kvm -> mmu_lock );
6303
- }
6304
- }
6305
-
6306
- return flush ;
6307
- }
6308
-
6309
- static __always_inline bool walk_slot_rmaps (struct kvm * kvm ,
6310
- const struct kvm_memory_slot * slot ,
6311
- slot_rmaps_handler fn ,
6312
- int start_level , int end_level ,
6313
- bool flush_on_yield )
6314
- {
6315
- return __walk_slot_rmaps (kvm , slot , fn , start_level , end_level ,
6316
- slot -> base_gfn , slot -> base_gfn + slot -> npages - 1 ,
6317
- flush_on_yield , false);
6318
- }
6319
-
6320
- static __always_inline bool walk_slot_rmaps_4k (struct kvm * kvm ,
6321
- const struct kvm_memory_slot * slot ,
6322
- slot_rmaps_handler fn ,
6323
- bool flush_on_yield )
6324
- {
6325
- return walk_slot_rmaps (kvm , slot , fn , PG_LEVEL_4K , PG_LEVEL_4K , flush_on_yield );
6326
- }
6327
-
6328
6328
static void free_mmu_pages (struct kvm_mmu * mmu )
6329
6329
{
6330
6330
if (!tdp_enabled && mmu -> pae_root )
0 commit comments