Skip to content

Commit de1bf90

Browse files
committed
KVM: x86/tdp_mmu: Propagate attr_filter to MMU notifier callbacks
Teach the MMU notifier callbacks how to check kvm_gfn_range.process to filter which KVM MMU root types to operate on. The private GPAs are backed by guest memfd. Such memory is not subjected to MMU notifier callbacks because it can't be mapped into the host user address space. Now kvm_gfn_range conveys info about which root to operate on. Enhance the callback to filter the root page table type. The KVM MMU notifier comes down to two functions. kvm_tdp_mmu_unmap_gfn_range() and __kvm_tdp_mmu_age_gfn_range(): - invalidate_range_start() calls kvm_tdp_mmu_unmap_gfn_range() - invalidate_range_end() doesn't call into arch code - the other callbacks call __kvm_tdp_mmu_age_gfn_range() For VM's without a private/shared split in the EPT, all operations should target the normal(direct) root. With the switch from for_each_tdp_mmu_root() to __for_each_tdp_mmu_root() in kvm_tdp_mmu_handle_gfn(), there are no longer any users of for_each_tdp_mmu_root(). Remove it. Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com> Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com> Message-ID: <20240718211230.1492011-14-rick.p.edgecombe@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent fabaa76 commit de1bf90

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

arch/x86/kvm/mmu/tdp_mmu.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,6 @@ static struct kvm_mmu_page *tdp_mmu_next_root(struct kvm *kvm,
193193
!tdp_mmu_root_match((_root), (_types)))) { \
194194
} else
195195

196-
#define for_each_tdp_mmu_root(_kvm, _root, _as_id) \
197-
__for_each_tdp_mmu_root(_kvm, _root, _as_id, KVM_ALL_ROOTS)
198-
199196
#define for_each_valid_tdp_mmu_root(_kvm, _root, _as_id) \
200197
__for_each_tdp_mmu_root(_kvm, _root, _as_id, KVM_VALID_ROOTS)
201198

@@ -1177,12 +1174,16 @@ int kvm_tdp_mmu_map(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault)
11771174
return ret;
11781175
}
11791176

1177+
/* Used by mmu notifier via kvm_unmap_gfn_range() */
11801178
bool kvm_tdp_mmu_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range,
11811179
bool flush)
11821180
{
1181+
enum kvm_tdp_mmu_root_types types;
11831182
struct kvm_mmu_page *root;
11841183

1185-
__for_each_tdp_mmu_root_yield_safe(kvm, root, range->slot->as_id, KVM_ALL_ROOTS)
1184+
types = kvm_gfn_range_filter_to_root_types(kvm, range->attr_filter) | KVM_INVALID_ROOTS;
1185+
1186+
__for_each_tdp_mmu_root_yield_safe(kvm, root, range->slot->as_id, types)
11861187
flush = tdp_mmu_zap_leafs(kvm, root, range->start, range->end,
11871188
range->may_block, flush);
11881189

@@ -1222,17 +1223,21 @@ static bool __kvm_tdp_mmu_age_gfn_range(struct kvm *kvm,
12221223
struct kvm_gfn_range *range,
12231224
bool test_only)
12241225
{
1226+
enum kvm_tdp_mmu_root_types types;
12251227
struct kvm_mmu_page *root;
12261228
struct tdp_iter iter;
12271229
bool ret = false;
12281230

1231+
types = kvm_gfn_range_filter_to_root_types(kvm, range->attr_filter);
1232+
12291233
/*
12301234
* Don't support rescheduling, none of the MMU notifiers that funnel
12311235
* into this helper allow blocking; it'd be dead, wasteful code. Note,
12321236
* this helper must NOT be used to unmap GFNs, as it processes only
12331237
* valid roots!
12341238
*/
1235-
for_each_valid_tdp_mmu_root(kvm, root, range->slot->as_id) {
1239+
WARN_ON(types & ~KVM_VALID_ROOTS);
1240+
__for_each_tdp_mmu_root(kvm, root, range->slot->as_id, types) {
12361241
guard(rcu)();
12371242

12381243
tdp_root_for_each_leaf_pte(iter, kvm, root, range->start, range->end) {

0 commit comments

Comments
 (0)