Skip to content

Commit 0a8a5f2

Browse files
committed
KVM: x86: Use standard mmu_notifier invalidate hooks for APIC access page
Now that KVM honors past and in-progress mmu_notifier invalidations when reloading the APIC-access page, use KVM's "standard" invalidation hooks to trigger a reload and delete the one-off usage of invalidate_range(). Aside from eliminating one-off code in KVM, dropping KVM's use of invalidate_range() will allow common mmu_notifier to redefine the API to be more strictly focused on invalidating secondary TLBs that share the primary MMU's page tables. Suggested-by: Jason Gunthorpe <jgg@nvidia.com> Cc: Alistair Popple <apopple@nvidia.com> Cc: Robin Murphy <robin.murphy@arm.com> Reviewed-by: Alistair Popple <apopple@nvidia.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Link: https://lore.kernel.org/r/20230602011518.787006-3-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 878940b commit 0a8a5f2

4 files changed

Lines changed: 3 additions & 35 deletions

File tree

arch/x86/kvm/mmu/mmu.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,6 +1600,9 @@ bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range)
16001600
if (tdp_mmu_enabled)
16011601
flush = kvm_tdp_mmu_unmap_gfn_range(kvm, range, flush);
16021602

1603+
if (range->slot->id == APIC_ACCESS_PAGE_PRIVATE_MEMSLOT)
1604+
kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD);
1605+
16031606
return flush;
16041607
}
16051608

arch/x86/kvm/x86.c

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10435,20 +10435,6 @@ static void vcpu_load_eoi_exitmap(struct kvm_vcpu *vcpu)
1043510435
vcpu, (u64 *)vcpu->arch.ioapic_handled_vectors);
1043610436
}
1043710437

10438-
void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
10439-
unsigned long start, unsigned long end)
10440-
{
10441-
unsigned long apic_address;
10442-
10443-
/*
10444-
* The physical address of apic access page is stored in the VMCS.
10445-
* Update it when it becomes invalid.
10446-
*/
10447-
apic_address = gfn_to_hva(kvm, APIC_DEFAULT_PHYS_BASE >> PAGE_SHIFT);
10448-
if (start <= apic_address && apic_address < end)
10449-
kvm_make_all_cpus_request(kvm, KVM_REQ_APIC_PAGE_RELOAD);
10450-
}
10451-
1045210438
void kvm_arch_guest_memory_reclaimed(struct kvm *kvm)
1045310439
{
1045410440
static_call_cond(kvm_x86_guest_memory_reclaimed)(kvm);

include/linux/kvm_host.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2237,9 +2237,6 @@ static inline long kvm_arch_vcpu_async_ioctl(struct file *filp,
22372237
}
22382238
#endif /* CONFIG_HAVE_KVM_VCPU_ASYNC_IOCTL */
22392239

2240-
void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
2241-
unsigned long start, unsigned long end);
2242-
22432240
void kvm_arch_guest_memory_reclaimed(struct kvm *kvm);
22442241

22452242
#ifdef CONFIG_HAVE_KVM_VCPU_RUN_PID_CHANGE

virt/kvm/kvm_main.c

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,6 @@ static unsigned long long kvm_active_vms;
154154

155155
static DEFINE_PER_CPU(cpumask_var_t, cpu_kick_mask);
156156

157-
__weak void kvm_arch_mmu_notifier_invalidate_range(struct kvm *kvm,
158-
unsigned long start, unsigned long end)
159-
{
160-
}
161-
162157
__weak void kvm_arch_guest_memory_reclaimed(struct kvm *kvm)
163158
{
164159
}
@@ -521,18 +516,6 @@ static inline struct kvm *mmu_notifier_to_kvm(struct mmu_notifier *mn)
521516
return container_of(mn, struct kvm, mmu_notifier);
522517
}
523518

524-
static void kvm_mmu_notifier_invalidate_range(struct mmu_notifier *mn,
525-
struct mm_struct *mm,
526-
unsigned long start, unsigned long end)
527-
{
528-
struct kvm *kvm = mmu_notifier_to_kvm(mn);
529-
int idx;
530-
531-
idx = srcu_read_lock(&kvm->srcu);
532-
kvm_arch_mmu_notifier_invalidate_range(kvm, start, end);
533-
srcu_read_unlock(&kvm->srcu, idx);
534-
}
535-
536519
typedef bool (*hva_handler_t)(struct kvm *kvm, struct kvm_gfn_range *range);
537520

538521
typedef void (*on_lock_fn_t)(struct kvm *kvm, unsigned long start,
@@ -892,7 +875,6 @@ static void kvm_mmu_notifier_release(struct mmu_notifier *mn,
892875
}
893876

894877
static const struct mmu_notifier_ops kvm_mmu_notifier_ops = {
895-
.invalidate_range = kvm_mmu_notifier_invalidate_range,
896878
.invalidate_range_start = kvm_mmu_notifier_invalidate_range_start,
897879
.invalidate_range_end = kvm_mmu_notifier_invalidate_range_end,
898880
.clear_flush_young = kvm_mmu_notifier_clear_flush_young,

0 commit comments

Comments
 (0)