Skip to content

Commit 8db1a4a

Browse files
committed
Move host state save/restore routine to vmx arch code.
This is a perf optimization on Intel.
1 parent 071790e commit 8db1a4a

4 files changed

Lines changed: 10 additions & 14 deletions

File tree

arch/x86/include/asm/kvm_host.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -687,8 +687,6 @@ struct kvm_x86_ops {
687687
void (*vcpu_free)(struct kvm_vcpu *vcpu);
688688
void (*vcpu_reset)(struct kvm_vcpu *vcpu, bool init_event);
689689

690-
void (*save_host_state)(struct kvm_vcpu *vcpu);
691-
void (*load_host_state)(struct kvm_vcpu *vcpu);
692690
void (*vcpu_load)(struct kvm_vcpu *vcpu, int cpu);
693691
void (*vcpu_put)(struct kvm_vcpu *vcpu);
694692

arch/x86/kvm/svm.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,13 +1338,10 @@ static void svm_vcpu_put(struct kvm_vcpu *vcpu)
13381338
static void svm_save_host_state(struct kvm_vcpu *vcpu)
13391339
{
13401340
struct vcpu_svm *svm = to_svm(vcpu);
1341-
int cpu = smp_processor_id();
13421341
int i;
13431342

1344-
if (unlikely(cpu != vcpu->cpu)) {
1345-
svm->asid_generation = 0;
1346-
mark_all_dirty(svm->vmcb);
1347-
}
1343+
svm->asid_generation = 0;
1344+
mark_all_dirty(svm->vmcb);
13481345

13491346
#ifdef CONFIG_X86_64
13501347
rdmsrl(MSR_GS_BASE, to_svm(vcpu)->host.gs_base);
@@ -4249,6 +4246,8 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
42494246
if (unlikely(svm->nested.exit_required))
42504247
return;
42514248

4249+
svm_save_host_state(vcpu);
4250+
42524251
pre_svm_run(svm);
42534252

42544253
sync_lapic_to_cr8(vcpu);
@@ -4322,6 +4321,8 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
43224321
svm_handle_mce(svm);
43234322

43244323
mark_all_clean(svm->vmcb);
4324+
4325+
svm_load_host_state(vcpu);
43254326
}
43264327

43274328
static void svm_set_cr3(struct kvm_vcpu *vcpu, size_t root)
@@ -4676,8 +4677,6 @@ static struct kvm_x86_ops svm_x86_ops = {
46764677
.vm_init = avic_vm_init,
46774678
.vm_destroy = avic_vm_destroy,
46784679

4679-
.save_host_state = svm_save_host_state,
4680-
.load_host_state = svm_load_host_state,
46814680
.vcpu_load = svm_vcpu_load,
46824681
.vcpu_put = svm_vcpu_put,
46834682
.vcpu_blocking = svm_vcpu_blocking,

arch/x86/kvm/vmx.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7373,6 +7373,8 @@ static void __declspec(noinline) vmx_vcpu_run(struct kvm_vcpu *vcpu)
73737373

73747374
vmx_acquire(vcpu);
73757375

7376+
vmx_save_host_state(vcpu);
7377+
73767378
if (test_bit(VCPU_REGS_RSP, (size_t *)&vcpu->arch.regs_dirty))
73777379
vmcs_writel(vcpu, GUEST_RSP, vcpu->arch.regs[VCPU_REGS_RSP]);
73787380
if (test_bit(VCPU_REGS_RIP, (size_t *)&vcpu->arch.regs_dirty))
@@ -7457,6 +7459,8 @@ static void __declspec(noinline) vmx_vcpu_run(struct kvm_vcpu *vcpu)
74577459

74587460
vmx->exit_reason = vmcs_read32(vcpu, VM_EXIT_REASON);
74597461

7462+
vmx_load_host_state(vcpu);
7463+
74607464
vmx_release(vcpu);
74617465

74627466
/*
@@ -9186,8 +9190,6 @@ static struct kvm_x86_ops vmx_x86_ops = {
91869190
.vcpu_free = vmx_free_vcpu,
91879191
.vcpu_reset = vmx_vcpu_reset,
91889192

9189-
.save_host_state = vmx_save_host_state,
9190-
.load_host_state = vmx_load_host_state,
91919193
.vcpu_load = vmx_vcpu_load,
91929194
.vcpu_put = vmx_vcpu_put,
91939195

arch/x86/kvm/x86.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4577,7 +4577,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
45774577
#ifdef HOST_STAT_DEBUG
45784578
save_host_stat_full(enter);
45794579
#endif
4580-
kvm_x86_ops->save_host_state(vcpu);
45814580
vcpu->mode = IN_GUEST_MODE;
45824581
vcpu->cpu = smp_processor_id();
45834582

@@ -4593,7 +4592,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
45934592
if (vcpu->mode == EXITING_GUEST_MODE || vcpu->requests) {
45944593
vcpu->mode = OUTSIDE_GUEST_MODE;
45954594
smp_wmb();
4596-
kvm_x86_ops->load_host_state(vcpu);
45974595
local_irq_enable();
45984596
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
45994597
r = 1;
@@ -4655,7 +4653,6 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
46554653
smp_wmb();
46564654

46574655
kvm_put_guest_xcr0(vcpu);
4658-
kvm_x86_ops->load_host_state(vcpu);
46594656
kvm_x86_ops->vcpu_put(vcpu);
46604657

46614658
#ifdef HOST_STAT_DEBUG

0 commit comments

Comments
 (0)