Skip to content

Commit 9ed3bf4

Browse files
committed
KVM: x86/mmu: Move filling of Hyper-V's TLB range struct into Hyper-V code
Refactor Hyper-V's range-based TLB flushing API to take a gfn+nr_pages pair instead of a struct, and bury said struct in Hyper-V specific code. Passing along two params generates much better code for the common case where KVM is _not_ running on Hyper-V, as forwarding the flush on to Hyper-V's hv_flush_remote_tlbs_range() from kvm_flush_remote_tlbs_range() becomes a tail call. Cc: David Matlack <dmatlack@google.com> Reviewed-by: David Matlack <dmatlack@google.com> Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com> Link: https://lore.kernel.org/r/20230405003133.419177-3-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 8a1300f commit 9ed3bf4

4 files changed

Lines changed: 25 additions & 18 deletions

File tree

arch/x86/include/asm/kvm_host.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -482,11 +482,6 @@ struct kvm_mmu {
482482
u64 pdptrs[4]; /* pae */
483483
};
484484

485-
struct kvm_tlb_range {
486-
u64 start_gfn;
487-
u64 pages;
488-
};
489-
490485
enum pmc_type {
491486
KVM_PMC_GP = 0,
492487
KVM_PMC_FIXED,
@@ -1589,8 +1584,8 @@ struct kvm_x86_ops {
15891584
void (*flush_tlb_all)(struct kvm_vcpu *vcpu);
15901585
void (*flush_tlb_current)(struct kvm_vcpu *vcpu);
15911586
int (*flush_remote_tlbs)(struct kvm *kvm);
1592-
int (*flush_remote_tlbs_range)(struct kvm *kvm,
1593-
struct kvm_tlb_range *range);
1587+
int (*flush_remote_tlbs_range)(struct kvm *kvm, gfn_t gfn,
1588+
gfn_t nr_pages);
15941589

15951590
/*
15961591
* Flush any TLB entries associated with the given GVA.

arch/x86/kvm/kvm_onhyperv.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,22 @@
1010
#include "hyperv.h"
1111
#include "kvm_onhyperv.h"
1212

13+
struct kvm_hv_tlb_range {
14+
u64 start_gfn;
15+
u64 pages;
16+
};
17+
1318
static int kvm_fill_hv_flush_list_func(struct hv_guest_mapping_flush_list *flush,
1419
void *data)
1520
{
16-
struct kvm_tlb_range *range = data;
21+
struct kvm_hv_tlb_range *range = data;
1722

1823
return hyperv_fill_flush_guest_mapping_list(flush, range->start_gfn,
1924
range->pages);
2025
}
2126

2227
static inline int hv_remote_flush_root_tdp(hpa_t root_tdp,
23-
struct kvm_tlb_range *range)
28+
struct kvm_hv_tlb_range *range)
2429
{
2530
if (range)
2631
return hyperv_flush_guest_mapping_range(root_tdp,
@@ -29,7 +34,8 @@ static inline int hv_remote_flush_root_tdp(hpa_t root_tdp,
2934
return hyperv_flush_guest_mapping(root_tdp);
3035
}
3136

32-
int hv_flush_remote_tlbs_range(struct kvm *kvm, struct kvm_tlb_range *range)
37+
static int __hv_flush_remote_tlbs_range(struct kvm *kvm,
38+
struct kvm_hv_tlb_range *range)
3339
{
3440
struct kvm_arch *kvm_arch = &kvm->arch;
3541
struct kvm_vcpu *vcpu;
@@ -85,11 +91,21 @@ int hv_flush_remote_tlbs_range(struct kvm *kvm, struct kvm_tlb_range *range)
8591
spin_unlock(&kvm_arch->hv_root_tdp_lock);
8692
return ret;
8793
}
94+
95+
int hv_flush_remote_tlbs_range(struct kvm *kvm, gfn_t start_gfn, gfn_t nr_pages)
96+
{
97+
struct kvm_hv_tlb_range range = {
98+
.start_gfn = start_gfn,
99+
.pages = nr_pages,
100+
};
101+
102+
return __hv_flush_remote_tlbs_range(kvm, &range);
103+
}
88104
EXPORT_SYMBOL_GPL(hv_flush_remote_tlbs_range);
89105

90106
int hv_flush_remote_tlbs(struct kvm *kvm)
91107
{
92-
return hv_flush_remote_tlbs_range(kvm, NULL);
108+
return __hv_flush_remote_tlbs_range(kvm, NULL);
93109
}
94110
EXPORT_SYMBOL_GPL(hv_flush_remote_tlbs);
95111

arch/x86/kvm/kvm_onhyperv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#define __ARCH_X86_KVM_KVM_ONHYPERV_H__
88

99
#if IS_ENABLED(CONFIG_HYPERV)
10-
int hv_flush_remote_tlbs_range(struct kvm *kvm, struct kvm_tlb_range *range);
10+
int hv_flush_remote_tlbs_range(struct kvm *kvm, gfn_t gfn, gfn_t nr_pages);
1111
int hv_flush_remote_tlbs(struct kvm *kvm);
1212
void hv_track_root_tdp(struct kvm_vcpu *vcpu, hpa_t root_tdp);
1313
#else /* !CONFIG_HYPERV */

arch/x86/kvm/mmu/mmu.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -278,15 +278,11 @@ static inline bool kvm_available_flush_remote_tlbs_range(void)
278278
void kvm_flush_remote_tlbs_range(struct kvm *kvm, gfn_t start_gfn,
279279
gfn_t nr_pages)
280280
{
281-
struct kvm_tlb_range range;
282281
int ret = -EOPNOTSUPP;
283282

284-
range.start_gfn = start_gfn;
285-
range.pages = nr_pages;
286-
287283
if (kvm_x86_ops.flush_remote_tlbs_range)
288-
ret = static_call(kvm_x86_flush_remote_tlbs_range)(kvm, &range);
289-
284+
ret = static_call(kvm_x86_flush_remote_tlbs_range)(kvm, start_gfn,
285+
nr_pages);
290286
if (ret)
291287
kvm_flush_remote_tlbs(kvm);
292288
}

0 commit comments

Comments
 (0)