Skip to content

Commit 21fa324

Browse files
sean-jcbonzini
authored andcommitted
KVM: x86/mmu: Extract zapping of rmaps for gfn range to separate helper
Extract the zapping of rmaps, a.k.a. legacy MMU, for a gfn range to a separate helper to clean up the unholy mess that kvm_zap_gfn_range() has become. In addition to deep nesting, the rmaps zapping spreads out the declaration of several variables and is generally a mess. Clean up the mess now so that future work to improve the memslots implementation doesn't need to deal with it. Cc: Maciej S. Szmigiero <[email protected]> Signed-off-by: Sean Christopherson <[email protected]> Message-Id: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent e8be2a5 commit 21fa324

File tree

1 file changed

+30
-22
lines changed

1 file changed

+30
-22
lines changed

arch/x86/kvm/mmu/mmu.c

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5710,40 +5710,48 @@ void kvm_mmu_uninit_vm(struct kvm *kvm)
57105710
kvm_mmu_uninit_tdp_mmu(kvm);
57115711
}
57125712

5713+
static bool __kvm_zap_rmaps(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end)
5714+
{
5715+
const struct kvm_memory_slot *memslot;
5716+
struct kvm_memslots *slots;
5717+
bool flush = false;
5718+
gfn_t start, end;
5719+
int i;
5720+
5721+
if (!kvm_memslots_have_rmaps(kvm))
5722+
return flush;
5723+
5724+
for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) {
5725+
slots = __kvm_memslots(kvm, i);
5726+
kvm_for_each_memslot(memslot, slots) {
5727+
start = max(gfn_start, memslot->base_gfn);
5728+
end = min(gfn_end, memslot->base_gfn + memslot->npages);
5729+
if (start >= end)
5730+
continue;
5731+
5732+
flush = slot_handle_level_range(kvm, memslot, kvm_zap_rmapp,
5733+
PG_LEVEL_4K, KVM_MAX_HUGEPAGE_LEVEL,
5734+
start, end - 1, true, flush);
5735+
}
5736+
}
5737+
5738+
return flush;
5739+
}
5740+
57135741
/*
57145742
* Invalidate (zap) SPTEs that cover GFNs from gfn_start and up to gfn_end
57155743
* (not including it)
57165744
*/
57175745
void kvm_zap_gfn_range(struct kvm *kvm, gfn_t gfn_start, gfn_t gfn_end)
57185746
{
5719-
struct kvm_memslots *slots;
5720-
struct kvm_memory_slot *memslot;
5747+
bool flush;
57215748
int i;
5722-
bool flush = false;
57235749

57245750
write_lock(&kvm->mmu_lock);
57255751

57265752
kvm_inc_notifier_count(kvm, gfn_start, gfn_end);
57275753

5728-
if (kvm_memslots_have_rmaps(kvm)) {
5729-
for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++) {
5730-
slots = __kvm_memslots(kvm, i);
5731-
kvm_for_each_memslot(memslot, slots) {
5732-
gfn_t start, end;
5733-
5734-
start = max(gfn_start, memslot->base_gfn);
5735-
end = min(gfn_end, memslot->base_gfn + memslot->npages);
5736-
if (start >= end)
5737-
continue;
5738-
5739-
flush = slot_handle_level_range(kvm,
5740-
(const struct kvm_memory_slot *) memslot,
5741-
kvm_zap_rmapp, PG_LEVEL_4K,
5742-
KVM_MAX_HUGEPAGE_LEVEL, start,
5743-
end - 1, true, flush);
5744-
}
5745-
}
5746-
}
5754+
flush = __kvm_zap_rmaps(kvm, gfn_start, gfn_end);
57475755

57485756
if (is_tdp_mmu_enabled(kvm)) {
57495757
for (i = 0; i < KVM_ADDRESS_SPACE_NUM; i++)

0 commit comments

Comments
 (0)