Skip to content

Commit bb4ce2c

Browse files
committed
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull kvm fixes from Paolo Bonzini: "The main and larger change here is a workaround for AMD's lack of cache coherency for encrypted-memory guests. I have another patch pending, but it's waiting for review from the architecture maintainers. RISC-V: - Remove 's' & 'u' as valid ISA extension - Do not allow disabling the base extensions 'i'/'m'/'a'/'c' x86: - Fix NMI watchdog in guests on AMD - Fix for SEV cache incoherency issues - Don't re-acquire SRCU lock in complete_emulated_io() - Avoid NULL pointer deref if VM creation fails - Fix race conditions between APICv disabling and vCPU creation - Bugfixes for disabling of APICv - Preserve BSP MSR_KVM_POLL_CONTROL across suspend/resume selftests: - Do not use bitfields larger than 32-bits, they differ between GCC and clang" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: kvm: selftests: introduce and use more page size-related constants kvm: selftests: do not use bitfields larger than 32-bits for PTEs KVM: SEV: add cache flush to solve SEV cache incoherency issues KVM: SVM: Flush when freeing encrypted pages even on SME_COHERENT CPUs KVM: SVM: Simplify and harden helper to flush SEV guest page(s) KVM: selftests: Silence compiler warning in the kvm_page_table_test KVM: x86/pmu: Update AMD PMC sample period to fix guest NMI-watchdog x86/kvm: Preserve BSP MSR_KVM_POLL_CONTROL across suspend/resume KVM: SPDX style and spelling fixes KVM: x86: Skip KVM_GUESTDBG_BLOCKIRQ APICv update if APICv is disabled KVM: x86: Pend KVM_REQ_APICV_UPDATE during vCPU creation to fix a race KVM: nVMX: Defer APICv updates while L2 is active until L1 is active KVM: x86: Tag APICv DISABLE inhibit, not ABSENT, if APICv is disabled KVM: Initialize debugfs_dentry when a VM is created to avoid NULL deref KVM: Add helpers to wrap vcpu->srcu_idx and yell if it's abused KVM: RISC-V: Use kvm_vcpu.srcu_idx, drop RISC-V's unnecessary copy KVM: x86: Don't re-acquire SRCU lock in complete_emulated_io() RISC-V: KVM: Restrict the extensions that can be disabled RISC-V: KVM: Remove 's' & 'u' as valid ISA extension
2 parents 06fb4ec + e852be8 commit bb4ce2c

36 files changed

+316
-252
lines changed

arch/powerpc/kvm/book3s_64_mmu_radix.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,10 @@ int kvmppc_mmu_walk_radix_tree(struct kvm_vcpu *vcpu, gva_t eaddr,
168168
return -EINVAL;
169169
/* Read the entry from guest memory */
170170
addr = base + (index * sizeof(rpte));
171-
vcpu->srcu_idx = srcu_read_lock(&kvm->srcu);
171+
172+
kvm_vcpu_srcu_read_lock(vcpu);
172173
ret = kvm_read_guest(kvm, addr, &rpte, sizeof(rpte));
173-
srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx);
174+
kvm_vcpu_srcu_read_unlock(vcpu);
174175
if (ret) {
175176
if (pte_ret_p)
176177
*pte_ret_p = addr;
@@ -246,9 +247,9 @@ int kvmppc_mmu_radix_translate_table(struct kvm_vcpu *vcpu, gva_t eaddr,
246247

247248
/* Read the table to find the root of the radix tree */
248249
ptbl = (table & PRTB_MASK) + (table_index * sizeof(entry));
249-
vcpu->srcu_idx = srcu_read_lock(&kvm->srcu);
250+
kvm_vcpu_srcu_read_lock(vcpu);
250251
ret = kvm_read_guest(kvm, ptbl, &entry, sizeof(entry));
251-
srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx);
252+
kvm_vcpu_srcu_read_unlock(vcpu);
252253
if (ret)
253254
return ret;
254255

arch/powerpc/kvm/book3s_hv_nested.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -306,10 +306,10 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)
306306
/* copy parameters in */
307307
hv_ptr = kvmppc_get_gpr(vcpu, 4);
308308
regs_ptr = kvmppc_get_gpr(vcpu, 5);
309-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
309+
kvm_vcpu_srcu_read_lock(vcpu);
310310
err = kvmhv_read_guest_state_and_regs(vcpu, &l2_hv, &l2_regs,
311311
hv_ptr, regs_ptr);
312-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
312+
kvm_vcpu_srcu_read_unlock(vcpu);
313313
if (err)
314314
return H_PARAMETER;
315315

@@ -410,10 +410,10 @@ long kvmhv_enter_nested_guest(struct kvm_vcpu *vcpu)
410410
byteswap_hv_regs(&l2_hv);
411411
byteswap_pt_regs(&l2_regs);
412412
}
413-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
413+
kvm_vcpu_srcu_read_lock(vcpu);
414414
err = kvmhv_write_guest_state_and_regs(vcpu, &l2_hv, &l2_regs,
415415
hv_ptr, regs_ptr);
416-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
416+
kvm_vcpu_srcu_read_unlock(vcpu);
417417
if (err)
418418
return H_AUTHORITY;
419419

@@ -600,16 +600,16 @@ long kvmhv_copy_tofrom_guest_nested(struct kvm_vcpu *vcpu)
600600
goto not_found;
601601

602602
/* Write what was loaded into our buffer back to the L1 guest */
603-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
603+
kvm_vcpu_srcu_read_lock(vcpu);
604604
rc = kvm_vcpu_write_guest(vcpu, gp_to, buf, n);
605-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
605+
kvm_vcpu_srcu_read_unlock(vcpu);
606606
if (rc)
607607
goto not_found;
608608
} else {
609609
/* Load the data to be stored from the L1 guest into our buf */
610-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
610+
kvm_vcpu_srcu_read_lock(vcpu);
611611
rc = kvm_vcpu_read_guest(vcpu, gp_from, buf, n);
612-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
612+
kvm_vcpu_srcu_read_unlock(vcpu);
613613
if (rc)
614614
goto not_found;
615615

arch/powerpc/kvm/book3s_rtas.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,9 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
229229
*/
230230
args_phys = kvmppc_get_gpr(vcpu, 4) & KVM_PAM;
231231

232-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
232+
kvm_vcpu_srcu_read_lock(vcpu);
233233
rc = kvm_read_guest(vcpu->kvm, args_phys, &args, sizeof(args));
234-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
234+
kvm_vcpu_srcu_read_unlock(vcpu);
235235
if (rc)
236236
goto fail;
237237

arch/powerpc/kvm/powerpc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,9 +425,9 @@ int kvmppc_ld(struct kvm_vcpu *vcpu, ulong *eaddr, int size, void *ptr,
425425
return EMULATE_DONE;
426426
}
427427

428-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
428+
kvm_vcpu_srcu_read_lock(vcpu);
429429
rc = kvm_read_guest(vcpu->kvm, pte.raddr, ptr, size);
430-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
430+
kvm_vcpu_srcu_read_unlock(vcpu);
431431
if (rc)
432432
return EMULATE_DO_MMIO;
433433

arch/riscv/include/asm/kvm_host.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,6 @@ struct kvm_vcpu_arch {
193193

194194
/* Don't run the VCPU (blocked) */
195195
bool pause;
196-
197-
/* SRCU lock index for in-kernel run loop */
198-
int srcu_idx;
199196
};
200197

201198
static inline void kvm_arch_hardware_unsetup(void) {}

arch/riscv/kvm/vcpu.c

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,16 @@ const struct kvm_stats_header kvm_vcpu_stats_header = {
3838
sizeof(kvm_vcpu_stats_desc),
3939
};
4040

41-
#define KVM_RISCV_ISA_ALLOWED (riscv_isa_extension_mask(a) | \
42-
riscv_isa_extension_mask(c) | \
43-
riscv_isa_extension_mask(d) | \
44-
riscv_isa_extension_mask(f) | \
45-
riscv_isa_extension_mask(i) | \
46-
riscv_isa_extension_mask(m) | \
47-
riscv_isa_extension_mask(s) | \
48-
riscv_isa_extension_mask(u))
41+
#define KVM_RISCV_ISA_DISABLE_ALLOWED (riscv_isa_extension_mask(d) | \
42+
riscv_isa_extension_mask(f))
43+
44+
#define KVM_RISCV_ISA_DISABLE_NOT_ALLOWED (riscv_isa_extension_mask(a) | \
45+
riscv_isa_extension_mask(c) | \
46+
riscv_isa_extension_mask(i) | \
47+
riscv_isa_extension_mask(m))
48+
49+
#define KVM_RISCV_ISA_ALLOWED (KVM_RISCV_ISA_DISABLE_ALLOWED | \
50+
KVM_RISCV_ISA_DISABLE_NOT_ALLOWED)
4951

5052
static void kvm_riscv_reset_vcpu(struct kvm_vcpu *vcpu)
5153
{
@@ -219,7 +221,8 @@ static int kvm_riscv_vcpu_set_reg_config(struct kvm_vcpu *vcpu,
219221
switch (reg_num) {
220222
case KVM_REG_RISCV_CONFIG_REG(isa):
221223
if (!vcpu->arch.ran_atleast_once) {
222-
vcpu->arch.isa = reg_val;
224+
/* Ignore the disable request for these extensions */
225+
vcpu->arch.isa = reg_val | KVM_RISCV_ISA_DISABLE_NOT_ALLOWED;
223226
vcpu->arch.isa &= riscv_isa_extension_base(NULL);
224227
vcpu->arch.isa &= KVM_RISCV_ISA_ALLOWED;
225228
kvm_riscv_vcpu_fp_reset(vcpu);
@@ -724,13 +727,13 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
724727
/* Mark this VCPU ran at least once */
725728
vcpu->arch.ran_atleast_once = true;
726729

727-
vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
730+
kvm_vcpu_srcu_read_lock(vcpu);
728731

729732
/* Process MMIO value returned from user-space */
730733
if (run->exit_reason == KVM_EXIT_MMIO) {
731734
ret = kvm_riscv_vcpu_mmio_return(vcpu, vcpu->run);
732735
if (ret) {
733-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx);
736+
kvm_vcpu_srcu_read_unlock(vcpu);
734737
return ret;
735738
}
736739
}
@@ -739,13 +742,13 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
739742
if (run->exit_reason == KVM_EXIT_RISCV_SBI) {
740743
ret = kvm_riscv_vcpu_sbi_return(vcpu, vcpu->run);
741744
if (ret) {
742-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx);
745+
kvm_vcpu_srcu_read_unlock(vcpu);
743746
return ret;
744747
}
745748
}
746749

747750
if (run->immediate_exit) {
748-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx);
751+
kvm_vcpu_srcu_read_unlock(vcpu);
749752
return -EINTR;
750753
}
751754

@@ -784,7 +787,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
784787
*/
785788
vcpu->mode = IN_GUEST_MODE;
786789

787-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx);
790+
kvm_vcpu_srcu_read_unlock(vcpu);
788791
smp_mb__after_srcu_read_unlock();
789792

790793
/*
@@ -802,7 +805,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
802805
vcpu->mode = OUTSIDE_GUEST_MODE;
803806
local_irq_enable();
804807
preempt_enable();
805-
vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
808+
kvm_vcpu_srcu_read_lock(vcpu);
806809
continue;
807810
}
808811

@@ -846,7 +849,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
846849

847850
preempt_enable();
848851

849-
vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
852+
kvm_vcpu_srcu_read_lock(vcpu);
850853

851854
ret = kvm_riscv_vcpu_exit(vcpu, run, &trap);
852855
}
@@ -855,7 +858,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
855858

856859
vcpu_put(vcpu);
857860

858-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx);
861+
kvm_vcpu_srcu_read_unlock(vcpu);
859862

860863
return ret;
861864
}

arch/riscv/kvm/vcpu_exit.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -456,9 +456,9 @@ static int stage2_page_fault(struct kvm_vcpu *vcpu, struct kvm_run *run,
456456
void kvm_riscv_vcpu_wfi(struct kvm_vcpu *vcpu)
457457
{
458458
if (!kvm_arch_vcpu_runnable(vcpu)) {
459-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->arch.srcu_idx);
459+
kvm_vcpu_srcu_read_unlock(vcpu);
460460
kvm_vcpu_halt(vcpu);
461-
vcpu->arch.srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
461+
kvm_vcpu_srcu_read_lock(vcpu);
462462
kvm_clear_request(KVM_REQ_UNHALT, vcpu);
463463
}
464464
}

arch/s390/kvm/interrupt.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,11 +1334,11 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)
13341334
hrtimer_start(&vcpu->arch.ckc_timer, sltime, HRTIMER_MODE_REL);
13351335
VCPU_EVENT(vcpu, 4, "enabled wait: %llu ns", sltime);
13361336
no_timer:
1337-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
1337+
kvm_vcpu_srcu_read_unlock(vcpu);
13381338
kvm_vcpu_halt(vcpu);
13391339
vcpu->valid_wakeup = false;
13401340
__unset_cpu_idle(vcpu);
1341-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
1341+
kvm_vcpu_srcu_read_lock(vcpu);
13421342

13431343
hrtimer_cancel(&vcpu->arch.ckc_timer);
13441344
return 0;

arch/s390/kvm/kvm-s390.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4237,14 +4237,14 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
42374237
* We try to hold kvm->srcu during most of vcpu_run (except when run-
42384238
* ning the guest), so that memslots (and other stuff) are protected
42394239
*/
4240-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
4240+
kvm_vcpu_srcu_read_lock(vcpu);
42414241

42424242
do {
42434243
rc = vcpu_pre_run(vcpu);
42444244
if (rc)
42454245
break;
42464246

4247-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
4247+
kvm_vcpu_srcu_read_unlock(vcpu);
42484248
/*
42494249
* As PF_VCPU will be used in fault handler, between
42504250
* guest_enter and guest_exit should be no uaccess.
@@ -4281,12 +4281,12 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
42814281
__enable_cpu_timer_accounting(vcpu);
42824282
guest_exit_irqoff();
42834283
local_irq_enable();
4284-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
4284+
kvm_vcpu_srcu_read_lock(vcpu);
42854285

42864286
rc = vcpu_post_run(vcpu, exit_reason);
42874287
} while (!signal_pending(current) && !guestdbg_exit_pending(vcpu) && !rc);
42884288

4289-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
4289+
kvm_vcpu_srcu_read_unlock(vcpu);
42904290
return rc;
42914291
}
42924292

arch/s390/kvm/vsie.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,7 +1091,7 @@ static int do_vsie_run(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
10911091

10921092
handle_last_fault(vcpu, vsie_page);
10931093

1094-
srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
1094+
kvm_vcpu_srcu_read_unlock(vcpu);
10951095

10961096
/* save current guest state of bp isolation override */
10971097
guest_bp_isolation = test_thread_flag(TIF_ISOLATE_BP_GUEST);
@@ -1133,7 +1133,7 @@ static int do_vsie_run(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
11331133
if (!guest_bp_isolation)
11341134
clear_thread_flag(TIF_ISOLATE_BP_GUEST);
11351135

1136-
vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
1136+
kvm_vcpu_srcu_read_lock(vcpu);
11371137

11381138
if (rc == -EINTR) {
11391139
VCPU_EVENT(vcpu, 3, "%s", "machine check");

0 commit comments

Comments
 (0)