History

rMerge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm

Pull KVM fixes from Radim Krčmář: "ARM: - PSCI selection API, a leftover from 4.16 (for stable) - Kick vcpu on active interrupt affinity change - Plug a VMID allocation race on oversubscribed systems - Silence debug messages - Update Christoffer's email address (linaro -> arm) x86: - Expose userspace-relevant bits of a newly added feature - Fix TLB flushing on VMX with VPID, but without EPT" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: x86/headers/UAPI: Move DISABLE_EXITS KVM capability bits to the UAPI kvm: apic: Flush TLB after APIC mode/address change if VPIDs are in use arm/arm64: KVM: Add PSCI version selection API KVM: arm/arm64: vgic: Kick new VCPU on interrupt migration arm64: KVM: Demote SVE and LORegion warnings to debug only MAINTAINERS: Update e-mail address for Christoffer Dall KVM: arm/arm64: Close VMID generation race

Linus Torvalds committed 8 years ago

Commit 46dc1112 parents 19b522d 5e6249317 files · +189 −32Browse files

Unified · Split

17 files
  1. Documentation/virtual/kvm/api.txt +8 −1
  2. Documentation/virtual/kvm/arm/psci.txt +30 −0
  3. MAINTAINERS +2 −2
  4. arch/arm/include/asm/kvm_host.h +3 −0
  5. arch/arm/include/uapi/asm/kvm.h +6 −0
  6. arch/arm/kvm/guest.c +13 −0
  7. arch/arm64/include/asm/kvm_host.h +3 −0
  8. arch/arm64/include/uapi/asm/kvm.h +6 −0
  9. arch/arm64/kvm/guest.c +13 −1
  10. arch/arm64/kvm/sys_regs.c +2 −4
  11. arch/x86/kvm/vmx.c +4 −10
  12. arch/x86/kvm/x86.h +0 −7
  13. include/kvm/arm_psci.h +14 −2
  14. include/uapi/linux/kvm.h +7 −0
  15. virt/kvm/arm/arm.c +10 −5
  16. virt/kvm/arm/psci.c +60 −0
  17. virt/kvm/arm/vgic/vgic.c +8 −0
Documentation/virtual/kvm/api.txt+8−1
@@ -1960,6 +1960,9 @@ ARM 32-bit VFP control registers have the following id bit patterns: · 1959 unmodified lines
19601960 ARM 64-bit FP registers have the following id bit patterns:
19611961 0x4030 0000 0012 0 <regno:12>
19621962
1963+ARM firmware pseudo-registers have the following bit pattern:
1964+ 0x4030 0000 0014 <regno:16>
1965+
19631966
19641967 arm64 registers are mapped using the lower 32 bits. The upper 16 of
19651968 that is the register group type, or coprocessor number:
@@ -1976,6 +1979,9 @@ arm64 CCSIDR registers are demultiplexed by CSSELR value: · 10 unmodified lines
19761979 arm64 system registers have the following id bit patterns:
19771980 0x6030 0000 0013 <op0:2> <op1:3> <crn:4> <crm:4> <op2:3>
19781981
1982+arm64 firmware pseudo-registers have the following bit pattern:
1983+ 0x6030 0000 0014 <regno:16>
1984+
19791985
19801986 MIPS registers are mapped using the lower 32 bits. The upper 16 of that is
19811987 the register group type:
@@ -2510,7 +2516,8 @@ Possible features: · 528 unmodified lines
25102516 and execute guest code when KVM_RUN is called.
25112517 - KVM_ARM_VCPU_EL1_32BIT: Starts the CPU in a 32bit mode.
25122518 Depends on KVM_CAP_ARM_EL1_32BIT (arm64 only).
2513− - KVM_ARM_VCPU_PSCI_0_2: Emulate PSCI v0.2 for the CPU.
2519+ - KVM_ARM_VCPU_PSCI_0_2: Emulate PSCI v0.2 (or a future revision
2520+ backward compatible with v0.2) for the CPU.
25142521 Depends on KVM_CAP_ARM_PSCI_0_2.
25152522 - KVM_ARM_VCPU_PMU_V3: Emulate PMUv3 for the CPU.
25162523 Depends on KVM_CAP_ARM_PMU_V3.
Documentation/virtual/kvm/arm/psci.txt+30−0
@@ -0,0 +1,30 @@
1+KVM implements the PSCI (Power State Coordination Interface)
2+specification in order to provide services such as CPU on/off, reset
3+and power-off to the guest.
4+
5+The PSCI specification is regularly updated to provide new features,
6+and KVM implements these updates if they make sense from a virtualization
7+point of view.
8+
9+This means that a guest booted on two different versions of KVM can
10+observe two different "firmware" revisions. This could cause issues if
11+a given guest is tied to a particular PSCI revision (unlikely), or if
12+a migration causes a different PSCI version to be exposed out of the
13+blue to an unsuspecting guest.
14+
15+In order to remedy this situation, KVM exposes a set of "firmware
16+pseudo-registers" that can be manipulated using the GET/SET_ONE_REG
17+interface. These registers can be saved/restored by userspace, and set
18+to a convenient value if required.
19+
20+The following register is defined:
21+
22+* KVM_REG_ARM_PSCI_VERSION:
23+
24+ - Only valid if the vcpu has the KVM_ARM_VCPU_PSCI_0_2 feature set
25+ (and thus has already been initialized)
26+ - Returns the current PSCI version on GET_ONE_REG (defaulting to the
27+ highest PSCI version implemented by KVM and compatible with v0.2)
28+ - Allows any PSCI version implemented by KVM and compatible with
29+ v0.2 to be set with SET_ONE_REG
30+ - Affects the whole VM (even if the register view is per-vcpu)
MAINTAINERS+2−2
@@ -7744,7 +7744,7 @@ F: arch/x86/include/asm/svm.h · 7743 unmodified lines
77447744 F: arch/x86/kvm/svm.c
77457745
77467746 KERNEL VIRTUAL MACHINE FOR ARM (KVM/arm)
7747−M: Christoffer Dall <christoffer.dall@linaro.org>
7747+M: Christoffer Dall <christoffer.dall@arm.com>
77487748 M: Marc Zyngier <marc.zyngier@arm.com>
77497749 L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
77507750 L: kvmarm@lists.cs.columbia.edu
@@ -7758,7 +7758,7 @@ F: virt/kvm/arm/ · 7 unmodified lines
77587758 F: include/kvm/arm_*
77597759
77607760 KERNEL VIRTUAL MACHINE FOR ARM64 (KVM/arm64)
7761−M: Christoffer Dall <christoffer.dall@linaro.org>
7761+M: Christoffer Dall <christoffer.dall@arm.com>
77627762 M: Marc Zyngier <marc.zyngier@arm.com>
77637763 L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
77647764 L: kvmarm@lists.cs.columbia.edu
arch/arm/include/asm/kvm_host.h+3−0
@@ -77,6 +77,9 @@ struct kvm_arch { · 76 unmodified lines
7777 /* Interrupt controller */
7878 struct vgic_dist vgic;
7979 int max_vcpus;
80+
81+ /* Mandated version of PSCI */
82+ u32 psci_version;
8083 };
8184
8285 #define KVM_NR_MEM_OBJS 40
arch/arm/include/uapi/asm/kvm.h+6−0
@@ -195,6 +195,12 @@ struct kvm_arch_memory_slot { · 194 unmodified lines
195195 #define KVM_REG_ARM_VFP_FPINST 0x1009
196196 #define KVM_REG_ARM_VFP_FPINST2 0x100A
197197
198+/* KVM-as-firmware specific pseudo-registers */
199+#define KVM_REG_ARM_FW (0x0014 << KVM_REG_ARM_COPROC_SHIFT)
200+#define KVM_REG_ARM_FW_REG(r) (KVM_REG_ARM | KVM_REG_SIZE_U64 | \
201+ KVM_REG_ARM_FW | ((r) & 0xffff))
202+#define KVM_REG_ARM_PSCI_VERSION KVM_REG_ARM_FW_REG(0)
203+
198204 /* Device Control API: ARM VGIC */
199205 #define KVM_DEV_ARM_VGIC_GRP_ADDR 0
200206 #define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
arch/arm/kvm/guest.c+13−0
@@ -22,6 +22,7 @@ · 21 unmodified lines
2222 #include <linux/module.h>
2323 #include <linux/vmalloc.h>
2424 #include <linux/fs.h>
25+#include <kvm/arm_psci.h>
2526 #include <asm/cputype.h>
2627 #include <linux/uaccess.h>
2728 #include <asm/kvm.h>
@@ -176,6 +177,7 @@ static unsigned long num_core_regs(void) · 148 unmodified lines
176177 unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu)
177178 {
178179 return num_core_regs() + kvm_arm_num_coproc_regs(vcpu)
180+ + kvm_arm_get_fw_num_regs(vcpu)
179181 + NUM_TIMER_REGS;
180182 }
181183
@@ -196,6 +198,11 @@ int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) · 14 unmodified lines
196198 uindices++;
197199 }
198200
201+ ret = kvm_arm_copy_fw_reg_indices(vcpu, uindices);
202+ if (ret)
203+ return ret;
204+ uindices += kvm_arm_get_fw_num_regs(vcpu);
205+
199206 ret = copy_timer_indices(vcpu, uindices);
200207 if (ret)
201208 return ret;
@@ -214,6 +221,9 @@ int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) · 12 unmodified lines
214221 if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_CORE)
215222 return get_core_reg(vcpu, reg);
216223
224+ if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_FW)
225+ return kvm_arm_get_fw_reg(vcpu, reg);
226+
217227 if (is_timer_reg(reg->id))
218228 return get_timer_reg(vcpu, reg);
219229
@@ -230,6 +240,9 @@ int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) · 10 unmodified lines
230240 if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_CORE)
231241 return set_core_reg(vcpu, reg);
232242
243+ if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_FW)
244+ return kvm_arm_set_fw_reg(vcpu, reg);
245+
233246 if (is_timer_reg(reg->id))
234247 return set_timer_reg(vcpu, reg);
235248
arch/arm64/include/asm/kvm_host.h+3−0
@@ -75,6 +75,9 @@ struct kvm_arch { · 74 unmodified lines
7575
7676 /* Interrupt controller */
7777 struct vgic_dist vgic;
78+
79+ /* Mandated version of PSCI */
80+ u32 psci_version;
7881 };
7982
8083 #define KVM_NR_MEM_OBJS 40
arch/arm64/include/uapi/asm/kvm.h+6−0
@@ -206,6 +206,12 @@ struct kvm_arch_memory_slot { · 205 unmodified lines
206206 #define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2)
207207 #define KVM_REG_ARM_TIMER_CVAL ARM64_SYS_REG(3, 3, 14, 0, 2)
208208
209+/* KVM-as-firmware specific pseudo-registers */
210+#define KVM_REG_ARM_FW (0x0014 << KVM_REG_ARM_COPROC_SHIFT)
211+#define KVM_REG_ARM_FW_REG(r) (KVM_REG_ARM64 | KVM_REG_SIZE_U64 | \
212+ KVM_REG_ARM_FW | ((r) & 0xffff))
213+#define KVM_REG_ARM_PSCI_VERSION KVM_REG_ARM_FW_REG(0)
214+
209215 /* Device Control API: ARM VGIC */
210216 #define KVM_DEV_ARM_VGIC_GRP_ADDR 0
211217 #define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1
arch/arm64/kvm/guest.c+13−1
@@ -25,6 +25,7 @@ · 24 unmodified lines
2525 #include <linux/module.h>
2626 #include <linux/vmalloc.h>
2727 #include <linux/fs.h>
28+#include <kvm/arm_psci.h>
2829 #include <asm/cputype.h>
2930 #include <linux/uaccess.h>
3031 #include <asm/kvm.h>
@@ -205,7 +206,7 @@ static int get_timer_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) · 174 unmodified lines
205206 unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu)
206207 {
207208 return num_core_regs() + kvm_arm_num_sys_reg_descs(vcpu)
208− + NUM_TIMER_REGS;
209+ + kvm_arm_get_fw_num_regs(vcpu) + NUM_TIMER_REGS;
209210 }
210211
211212 /**
@@ -225,6 +226,11 @@ int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices) · 13 unmodified lines
225226 uindices++;
226227 }
227228
229+ ret = kvm_arm_copy_fw_reg_indices(vcpu, uindices);
230+ if (ret)
231+ return ret;
232+ uindices += kvm_arm_get_fw_num_regs(vcpu);
233+
228234 ret = copy_timer_indices(vcpu, uindices);
229235 if (ret)
230236 return ret;
@@ -243,6 +249,9 @@ int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) · 12 unmodified lines
243249 if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_CORE)
244250 return get_core_reg(vcpu, reg);
245251
252+ if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_FW)
253+ return kvm_arm_get_fw_reg(vcpu, reg);
254+
246255 if (is_timer_reg(reg->id))
247256 return get_timer_reg(vcpu, reg);
248257
@@ -259,6 +268,9 @@ int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg) · 10 unmodified lines
259268 if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_CORE)
260269 return set_core_reg(vcpu, reg);
261270
271+ if ((reg->id & KVM_REG_ARM_COPROC_MASK) == KVM_REG_ARM_FW)
272+ return kvm_arm_set_fw_reg(vcpu, reg);
273+
262274 if (is_timer_reg(reg->id))
263275 return set_timer_reg(vcpu, reg);
264276
arch/arm64/kvm/sys_regs.c+2−4
@@ -996,14 +996,12 @@ static u64 read_id_reg(struct sys_reg_desc const *r, bool raz) · 995 unmodified lines
996996
997997 if (id == SYS_ID_AA64PFR0_EL1) {
998998 if (val & (0xfUL << ID_AA64PFR0_SVE_SHIFT))
999− pr_err_once("kvm [%i]: SVE unsupported for guests, suppressing\n",
1000− task_pid_nr(current));
999+ kvm_debug("SVE unsupported for guests, suppressing\n");
10011000
10021001 val &= ~(0xfUL << ID_AA64PFR0_SVE_SHIFT);
10031002 } else if (id == SYS_ID_AA64MMFR1_EL1) {
10041003 if (val & (0xfUL << ID_AA64MMFR1_LOR_SHIFT))
1005− pr_err_once("kvm [%i]: LORegions unsupported for guests, suppressing\n",
1006− task_pid_nr(current));
1004+ kvm_debug("LORegions unsupported for guests, suppressing\n");
10071005
10081006 val &= ~(0xfUL << ID_AA64MMFR1_LOR_SHIFT);
10091007 }
arch/x86/kvm/vmx.c+4−10
@@ -4544,12 +4544,6 @@ static void vmx_flush_tlb(struct kvm_vcpu *vcpu, bool invalidate_gpa) · 4543 unmodified lines
45444544 __vmx_flush_tlb(vcpu, to_vmx(vcpu)->vpid, invalidate_gpa);
45454545 }
45464546
4547−static void vmx_flush_tlb_ept_only(struct kvm_vcpu *vcpu)
4548−{
4549− if (enable_ept)
4550− vmx_flush_tlb(vcpu, true);
4551−}
4552−
45534547 static void vmx_decache_cr0_guest_bits(struct kvm_vcpu *vcpu)
45544548 {
45554549 ulong cr0_guest_owned_bits = vcpu->arch.cr0_guest_owned_bits;
@@ -9278,7 +9272,7 @@ static void vmx_set_virtual_x2apic_mode(struct kvm_vcpu *vcpu, bool set) · 4722 unmodified lines
92789272 } else {
92799273 sec_exec_control &= ~SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE;
92809274 sec_exec_control |= SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES;
9281− vmx_flush_tlb_ept_only(vcpu);
9275+ vmx_flush_tlb(vcpu, true);
92829276 }
92839277 vmcs_write32(SECONDARY_VM_EXEC_CONTROL, sec_exec_control);
92849278
@@ -9306,7 +9300,7 @@ static void vmx_set_apic_access_page_addr(struct kvm_vcpu *vcpu, hpa_t hpa) · 21 unmodified lines
93069300 !nested_cpu_has2(get_vmcs12(&vmx->vcpu),
93079301 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
93089302 vmcs_write64(APIC_ACCESS_ADDR, hpa);
9309− vmx_flush_tlb_ept_only(vcpu);
9303+ vmx_flush_tlb(vcpu, true);
93109304 }
93119305 }
93129306
@@ -11220,7 +11214,7 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, · 1907 unmodified lines
1122011214 }
1122111215 } else if (nested_cpu_has2(vmcs12,
1122211216 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
11223− vmx_flush_tlb_ept_only(vcpu);
11217+ vmx_flush_tlb(vcpu, true);
1122411218 }
1122511219
1122611220 /*
@@ -12073,7 +12067,7 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, · 846 unmodified lines
1207312067 } else if (!nested_cpu_has_ept(vmcs12) &&
1207412068 nested_cpu_has2(vmcs12,
1207512069 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
12076− vmx_flush_tlb_ept_only(vcpu);
12070+ vmx_flush_tlb(vcpu, true);
1207712071 }
1207812072
1207912073 /* This is needed for same reason as it was needed in prepare_vmcs02 */
arch/x86/kvm/x86.h+0−7
@@ -302,13 +302,6 @@ static inline u64 nsec_to_cycles(struct kvm_vcpu *vcpu, u64 nsec) · 301 unmodified lines
302302 __rem; \
303303 })
304304
305−#define KVM_X86_DISABLE_EXITS_MWAIT (1 << 0)
306−#define KVM_X86_DISABLE_EXITS_HTL (1 << 1)
307−#define KVM_X86_DISABLE_EXITS_PAUSE (1 << 2)
308−#define KVM_X86_DISABLE_VALID_EXITS (KVM_X86_DISABLE_EXITS_MWAIT | \
309− KVM_X86_DISABLE_EXITS_HTL | \
310− KVM_X86_DISABLE_EXITS_PAUSE)
311−
312305 static inline bool kvm_mwait_in_guest(struct kvm *kvm)
313306 {
314307 return kvm->arch.mwait_in_guest;
include/kvm/arm_psci.h+14−2
@@ -37,10 +37,15 @@ static inline int kvm_psci_version(struct kvm_vcpu *vcpu, struct kvm *kvm) · 36 unmodified lines
3737 * Our PSCI implementation stays the same across versions from
3838 * v0.2 onward, only adding the few mandatory functions (such
3939 * as FEATURES with 1.0) that are required by newer
40− * revisions. It is thus safe to return the latest.
40+ * revisions. It is thus safe to return the latest, unless
41+ * userspace has instructed us otherwise.
4142 */
42− if (test_bit(KVM_ARM_VCPU_PSCI_0_2, vcpu->arch.features))
43+ if (test_bit(KVM_ARM_VCPU_PSCI_0_2, vcpu->arch.features)) {
44+ if (vcpu->kvm->arch.psci_version)
45+ return vcpu->kvm->arch.psci_version;
46+
4347 return KVM_ARM_PSCI_LATEST;
48+ }
4449
4550 return KVM_ARM_PSCI_0_1;
4651 }
@@ -48,4 +53,11 @@ static inline int kvm_psci_version(struct kvm_vcpu *vcpu, struct kvm *kvm) · 1 unmodified line
4853
4954 int kvm_hvc_call_handler(struct kvm_vcpu *vcpu);
5055
56+struct kvm_one_reg;
57+
58+int kvm_arm_get_fw_num_regs(struct kvm_vcpu *vcpu);
59+int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices);
60+int kvm_arm_get_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
61+int kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
62+
5163 #endif /* __KVM_ARM_PSCI_H__ */
include/uapi/linux/kvm.h+7−0
@@ -676,6 +676,13 @@ struct kvm_ioeventfd { · 675 unmodified lines
676676 __u8 pad[36];
677677 };
678678
679+#define KVM_X86_DISABLE_EXITS_MWAIT (1 << 0)
680+#define KVM_X86_DISABLE_EXITS_HTL (1 << 1)
681+#define KVM_X86_DISABLE_EXITS_PAUSE (1 << 2)
682+#define KVM_X86_DISABLE_VALID_EXITS (KVM_X86_DISABLE_EXITS_MWAIT | \
683+ KVM_X86_DISABLE_EXITS_HTL | \
684+ KVM_X86_DISABLE_EXITS_PAUSE)
685+
679686 /* for KVM_ENABLE_CAP */
680687 struct kvm_enable_cap {
681688 /* in */
virt/kvm/arm/arm.c+10−5
@@ -63,7 +63,7 @@ static DEFINE_PER_CPU(struct kvm_vcpu *, kvm_arm_running_vcpu); · 62 unmodified lines
6363 static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1);
6464 static u32 kvm_next_vmid;
6565 static unsigned int kvm_vmid_bits __read_mostly;
66−static DEFINE_SPINLOCK(kvm_vmid_lock);
66+static DEFINE_RWLOCK(kvm_vmid_lock);
6767
6868 static bool vgic_present;
6969
@@ -473,11 +473,16 @@ static void update_vttbr(struct kvm *kvm) · 403 unmodified lines
473473 {
474474 phys_addr_t pgd_phys;
475475 u64 vmid;
476+ bool new_gen;
476477
477− if (!need_new_vmid_gen(kvm))
478+ read_lock(&kvm_vmid_lock);
479+ new_gen = need_new_vmid_gen(kvm);
480+ read_unlock(&kvm_vmid_lock);
481+
482+ if (!new_gen)
478483 return;
479484
480− spin_lock(&kvm_vmid_lock);
485+ write_lock(&kvm_vmid_lock);
481486
482487 /*
483488 * We need to re-check the vmid_gen here to ensure that if another vcpu
@@ -485,7 +490,7 @@ static void update_vttbr(struct kvm *kvm) · 1 unmodified line
485490 * use the same vmid.
486491 */
487492 if (!need_new_vmid_gen(kvm)) {
488− spin_unlock(&kvm_vmid_lock);
493+ write_unlock(&kvm_vmid_lock);
489494 return;
490495 }
491496
@@ -519,7 +524,7 @@ static void update_vttbr(struct kvm *kvm) · 27 unmodified lines
519524 vmid = ((u64)(kvm->arch.vmid) << VTTBR_VMID_SHIFT) & VTTBR_VMID_MASK(kvm_vmid_bits);
520525 kvm->arch.vttbr = kvm_phys_to_vttbr(pgd_phys) | vmid;
521526
522− spin_unlock(&kvm_vmid_lock);
527+ write_unlock(&kvm_vmid_lock);
523528 }
524529
525530 static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
virt/kvm/arm/psci.c+60−0
@@ -18,6 +18,7 @@ · 17 unmodified lines
1818 #include <linux/arm-smccc.h>
1919 #include <linux/preempt.h>
2020 #include <linux/kvm_host.h>
21+#include <linux/uaccess.h>
2122 #include <linux/wait.h>
2223
2324 #include <asm/cputype.h>
@@ -427,3 +428,62 @@ int kvm_hvc_call_handler(struct kvm_vcpu *vcpu) · 403 unmodified lines
427428 smccc_set_retval(vcpu, val, 0, 0, 0);
428429 return 1;
429430 }
431+
432+int kvm_arm_get_fw_num_regs(struct kvm_vcpu *vcpu)
433+{
434+ return 1; /* PSCI version */
435+}
436+
437+int kvm_arm_copy_fw_reg_indices(struct kvm_vcpu *vcpu, u64 __user *uindices)
438+{
439+ if (put_user(KVM_REG_ARM_PSCI_VERSION, uindices))
440+ return -EFAULT;
441+
442+ return 0;
443+}
444+
445+int kvm_arm_get_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
446+{
447+ if (reg->id == KVM_REG_ARM_PSCI_VERSION) {
448+ void __user *uaddr = (void __user *)(long)reg->addr;
449+ u64 val;
450+
451+ val = kvm_psci_version(vcpu, vcpu->kvm);
452+ if (copy_to_user(uaddr, &val, KVM_REG_SIZE(reg->id)))
453+ return -EFAULT;
454+
455+ return 0;
456+ }
457+
458+ return -EINVAL;
459+}
460+
461+int kvm_arm_set_fw_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg)
462+{
463+ if (reg->id == KVM_REG_ARM_PSCI_VERSION) {
464+ void __user *uaddr = (void __user *)(long)reg->addr;
465+ bool wants_02;
466+ u64 val;
467+
468+ if (copy_from_user(&val, uaddr, KVM_REG_SIZE(reg->id)))
469+ return -EFAULT;
470+
471+ wants_02 = test_bit(KVM_ARM_VCPU_PSCI_0_2, vcpu->arch.features);
472+
473+ switch (val) {
474+ case KVM_ARM_PSCI_0_1:
475+ if (wants_02)
476+ return -EINVAL;
477+ vcpu->kvm->arch.psci_version = val;
478+ return 0;
479+ case KVM_ARM_PSCI_0_2:
480+ case KVM_ARM_PSCI_1_0:
481+ if (!wants_02)
482+ return -EINVAL;
483+ vcpu->kvm->arch.psci_version = val;
484+ return 0;
485+ }
486+ }
487+
488+ return -EINVAL;
489+}
virt/kvm/arm/vgic/vgic.c+8−0
@@ -600,6 +600,7 @@ retry: · 599 unmodified lines
600600
601601 list_for_each_entry_safe(irq, tmp, &vgic_cpu->ap_list_head, ap_list) {
602602 struct kvm_vcpu *target_vcpu, *vcpuA, *vcpuB;
603+ bool target_vcpu_needs_kick = false;
603604
604605 spin_lock(&irq->irq_lock);
605606
@@ -670,11 +671,18 @@ retry: · 64 unmodified lines
670671 list_del(&irq->ap_list);
671672 irq->vcpu = target_vcpu;
672673 list_add_tail(&irq->ap_list, &new_cpu->ap_list_head);
674+ target_vcpu_needs_kick = true;
673675 }
674676
675677 spin_unlock(&irq->irq_lock);
676678 spin_unlock(&vcpuB->arch.vgic_cpu.ap_list_lock);
677679 spin_unlock_irqrestore(&vcpuA->arch.vgic_cpu.ap_list_lock, flags);
680+
681+ if (target_vcpu_needs_kick) {
682+ kvm_make_request(KVM_REQ_IRQ_PENDING, target_vcpu);
683+ kvm_vcpu_kick(target_vcpu);
684+ }
685+
678686 goto retry;
679687 }
680688