diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-13 12:55:09 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-13 12:55:09 -0500 |
commit | b9085bcbf5f43adf60533f9b635b2e7faeed0fe9 (patch) | |
tree | e397abf5682a45c096e75b3d0fa99c8e228425fc /arch/arm/include/asm | |
parent | c7d7b98671552abade78834c522b7308bda73c0d (diff) | |
parent | 6557bada461afeaa920a189fae2cff7c8fdce39f (diff) |
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull KVM update from Paolo Bonzini:
"Fairly small update, but there are some interesting new features.
Common:
Optional support for adding a small amount of polling on each HLT
instruction executed in the guest (or equivalent for other
architectures). This can improve latency up to 50% on some
scenarios (e.g. O_DSYNC writes or TCP_RR netperf tests). This
also has to be enabled manually for now, but the plan is to
auto-tune this in the future.
ARM/ARM64:
The highlights are support for GICv3 emulation and dirty page
tracking
s390:
Several optimizations and bugfixes. Also a first: a feature
exposed by KVM (UUID and long guest name in /proc/sysinfo) before
it is available in IBM's hypervisor! :)
MIPS:
Bugfixes.
x86:
Support for PML (page modification logging, a new feature in
Broadwell Xeons that speeds up dirty page tracking), nested
virtualization improvements (nested APICv---a nice optimization),
usual round of emulation fixes.
There is also a new option to reduce latency of the TSC deadline
timer in the guest; this needs to be tuned manually.
Some commits are common between this pull and Catalin's; I see you
have already included his tree.
Powerpc:
Nothing yet.
The KVM/PPC changes will come in through the PPC maintainers,
because I haven't received them yet and I might end up being
offline for some part of next week"
* tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (130 commits)
KVM: ia64: drop kvm.h from installed user headers
KVM: x86: fix build with !CONFIG_SMP
KVM: x86: emulate: correct page fault error code for NoWrite instructions
KVM: Disable compat ioctl for s390
KVM: s390: add cpu model support
KVM: s390: use facilities and cpu_id per KVM
KVM: s390/CPACF: Choose crypto control block format
s390/kernel: Update /proc/sysinfo file with Extended Name and UUID
KVM: s390: reenable LPP facility
KVM: s390: floating irqs: fix user triggerable endless loop
kvm: add halt_poll_ns module parameter
kvm: remove KVM_MMIO_SIZE
KVM: MIPS: Don't leak FPU/DSP to guest
KVM: MIPS: Disable HTW while in guest
KVM: nVMX: Enable nested posted interrupt processing
KVM: nVMX: Enable nested virtual interrupt delivery
KVM: nVMX: Enable nested apic register virtualization
KVM: nVMX: Make nested control MSRs per-cpu
KVM: nVMX: Enable nested virtualize x2apic mode
KVM: nVMX: Prepare for using hardware MSR bitmap
...
Diffstat (limited to 'arch/arm/include/asm')
-rw-r--r-- | arch/arm/include/asm/kvm_asm.h | 1 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_emulate.h | 5 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_host.h | 6 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_mmio.h | 1 | ||||
-rw-r--r-- | arch/arm/include/asm/kvm_mmu.h | 21 | ||||
-rw-r--r-- | arch/arm/include/asm/pgtable-3level.h | 1 |
6 files changed, 33 insertions, 2 deletions
diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h index 3a67bec72d0c..25410b2d8bc1 100644 --- a/arch/arm/include/asm/kvm_asm.h +++ b/arch/arm/include/asm/kvm_asm.h | |||
@@ -96,6 +96,7 @@ extern char __kvm_hyp_code_end[]; | |||
96 | 96 | ||
97 | extern void __kvm_flush_vm_context(void); | 97 | extern void __kvm_flush_vm_context(void); |
98 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); | 98 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); |
99 | extern void __kvm_tlb_flush_vmid(struct kvm *kvm); | ||
99 | 100 | ||
100 | extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu); | 101 | extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu); |
101 | #endif | 102 | #endif |
diff --git a/arch/arm/include/asm/kvm_emulate.h b/arch/arm/include/asm/kvm_emulate.h index 7b0152321b20..a9c80a2ea1a7 100644 --- a/arch/arm/include/asm/kvm_emulate.h +++ b/arch/arm/include/asm/kvm_emulate.h | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <asm/kvm_asm.h> | 23 | #include <asm/kvm_asm.h> |
24 | #include <asm/kvm_mmio.h> | 24 | #include <asm/kvm_mmio.h> |
25 | #include <asm/kvm_arm.h> | 25 | #include <asm/kvm_arm.h> |
26 | #include <asm/cputype.h> | ||
26 | 27 | ||
27 | unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num); | 28 | unsigned long *vcpu_reg(struct kvm_vcpu *vcpu, u8 reg_num); |
28 | unsigned long *vcpu_spsr(struct kvm_vcpu *vcpu); | 29 | unsigned long *vcpu_spsr(struct kvm_vcpu *vcpu); |
@@ -177,9 +178,9 @@ static inline u32 kvm_vcpu_hvc_get_imm(struct kvm_vcpu *vcpu) | |||
177 | return kvm_vcpu_get_hsr(vcpu) & HSR_HVC_IMM_MASK; | 178 | return kvm_vcpu_get_hsr(vcpu) & HSR_HVC_IMM_MASK; |
178 | } | 179 | } |
179 | 180 | ||
180 | static inline unsigned long kvm_vcpu_get_mpidr(struct kvm_vcpu *vcpu) | 181 | static inline unsigned long kvm_vcpu_get_mpidr_aff(struct kvm_vcpu *vcpu) |
181 | { | 182 | { |
182 | return vcpu->arch.cp15[c0_MPIDR]; | 183 | return vcpu->arch.cp15[c0_MPIDR] & MPIDR_HWID_BITMASK; |
183 | } | 184 | } |
184 | 185 | ||
185 | static inline void kvm_vcpu_set_be(struct kvm_vcpu *vcpu) | 186 | static inline void kvm_vcpu_set_be(struct kvm_vcpu *vcpu) |
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h index 04b4ea0b550a..41008cd7c53f 100644 --- a/arch/arm/include/asm/kvm_host.h +++ b/arch/arm/include/asm/kvm_host.h | |||
@@ -68,6 +68,7 @@ struct kvm_arch { | |||
68 | 68 | ||
69 | /* Interrupt controller */ | 69 | /* Interrupt controller */ |
70 | struct vgic_dist vgic; | 70 | struct vgic_dist vgic; |
71 | int max_vcpus; | ||
71 | }; | 72 | }; |
72 | 73 | ||
73 | #define KVM_NR_MEM_OBJS 40 | 74 | #define KVM_NR_MEM_OBJS 40 |
@@ -144,6 +145,7 @@ struct kvm_vm_stat { | |||
144 | }; | 145 | }; |
145 | 146 | ||
146 | struct kvm_vcpu_stat { | 147 | struct kvm_vcpu_stat { |
148 | u32 halt_successful_poll; | ||
147 | u32 halt_wakeup; | 149 | u32 halt_wakeup; |
148 | }; | 150 | }; |
149 | 151 | ||
@@ -231,6 +233,10 @@ static inline void vgic_arch_setup(const struct vgic_params *vgic) | |||
231 | int kvm_perf_init(void); | 233 | int kvm_perf_init(void); |
232 | int kvm_perf_teardown(void); | 234 | int kvm_perf_teardown(void); |
233 | 235 | ||
236 | void kvm_mmu_wp_memory_region(struct kvm *kvm, int slot); | ||
237 | |||
238 | struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr); | ||
239 | |||
234 | static inline void kvm_arch_hardware_disable(void) {} | 240 | static inline void kvm_arch_hardware_disable(void) {} |
235 | static inline void kvm_arch_hardware_unsetup(void) {} | 241 | static inline void kvm_arch_hardware_unsetup(void) {} |
236 | static inline void kvm_arch_sync_events(struct kvm *kvm) {} | 242 | static inline void kvm_arch_sync_events(struct kvm *kvm) {} |
diff --git a/arch/arm/include/asm/kvm_mmio.h b/arch/arm/include/asm/kvm_mmio.h index adcc0d7d3175..3f83db2f6cf0 100644 --- a/arch/arm/include/asm/kvm_mmio.h +++ b/arch/arm/include/asm/kvm_mmio.h | |||
@@ -37,6 +37,7 @@ struct kvm_exit_mmio { | |||
37 | u8 data[8]; | 37 | u8 data[8]; |
38 | u32 len; | 38 | u32 len; |
39 | bool is_write; | 39 | bool is_write; |
40 | void *private; | ||
40 | }; | 41 | }; |
41 | 42 | ||
42 | static inline void kvm_prepare_mmio(struct kvm_run *run, | 43 | static inline void kvm_prepare_mmio(struct kvm_run *run, |
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h index 1bca8f8af442..37ca2a4c6f09 100644 --- a/arch/arm/include/asm/kvm_mmu.h +++ b/arch/arm/include/asm/kvm_mmu.h | |||
@@ -115,6 +115,27 @@ static inline void kvm_set_s2pmd_writable(pmd_t *pmd) | |||
115 | pmd_val(*pmd) |= L_PMD_S2_RDWR; | 115 | pmd_val(*pmd) |= L_PMD_S2_RDWR; |
116 | } | 116 | } |
117 | 117 | ||
118 | static inline void kvm_set_s2pte_readonly(pte_t *pte) | ||
119 | { | ||
120 | pte_val(*pte) = (pte_val(*pte) & ~L_PTE_S2_RDWR) | L_PTE_S2_RDONLY; | ||
121 | } | ||
122 | |||
123 | static inline bool kvm_s2pte_readonly(pte_t *pte) | ||
124 | { | ||
125 | return (pte_val(*pte) & L_PTE_S2_RDWR) == L_PTE_S2_RDONLY; | ||
126 | } | ||
127 | |||
128 | static inline void kvm_set_s2pmd_readonly(pmd_t *pmd) | ||
129 | { | ||
130 | pmd_val(*pmd) = (pmd_val(*pmd) & ~L_PMD_S2_RDWR) | L_PMD_S2_RDONLY; | ||
131 | } | ||
132 | |||
133 | static inline bool kvm_s2pmd_readonly(pmd_t *pmd) | ||
134 | { | ||
135 | return (pmd_val(*pmd) & L_PMD_S2_RDWR) == L_PMD_S2_RDONLY; | ||
136 | } | ||
137 | |||
138 | |||
118 | /* Open coded p*d_addr_end that can deal with 64bit addresses */ | 139 | /* Open coded p*d_addr_end that can deal with 64bit addresses */ |
119 | #define kvm_pgd_addr_end(addr, end) \ | 140 | #define kvm_pgd_addr_end(addr, end) \ |
120 | ({ u64 __boundary = ((addr) + PGDIR_SIZE) & PGDIR_MASK; \ | 141 | ({ u64 __boundary = ((addr) + PGDIR_SIZE) & PGDIR_MASK; \ |
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h index 423a5ac09d3a..a745a2a53853 100644 --- a/arch/arm/include/asm/pgtable-3level.h +++ b/arch/arm/include/asm/pgtable-3level.h | |||
@@ -129,6 +129,7 @@ | |||
129 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ | 129 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ |
130 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ | 130 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ |
131 | 131 | ||
132 | #define L_PMD_S2_RDONLY (_AT(pmdval_t, 1) << 6) /* HAP[1] */ | ||
132 | #define L_PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ | 133 | #define L_PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ |
133 | 134 | ||
134 | /* | 135 | /* |