diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2015-04-07 12:09:20 -0400 |
|---|---|---|
| committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-04-07 12:09:20 -0400 |
| commit | bf0fb67cf957fc8ecfaaa2819b7d6a0f795e2ef2 (patch) | |
| tree | 22697f7deae781dbbacd2e19a5030df2e8551e6a /arch/arm/kvm | |
| parent | 8999602d08a804ae9cb271fdd5378f910058112d (diff) | |
| parent | d44758c0dfc5993a4b9952935a7eae4c91ebb6b4 (diff) | |
Merge tag 'kvm-arm-for-4.1' of git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm into 'kvm-next'
KVM/ARM changes for v4.1:
- fixes for live migration
- irqfd support
- kvm-io-bus & vgic rework to enable ioeventfd
- page ageing for stage-2 translation
- various cleanups
Diffstat (limited to 'arch/arm/kvm')
| -rw-r--r-- | arch/arm/kvm/Kconfig | 30 | ||||
| -rw-r--r-- | arch/arm/kvm/Makefile | 12 | ||||
| -rw-r--r-- | arch/arm/kvm/arm.c | 45 | ||||
| -rw-r--r-- | arch/arm/kvm/guest.c | 18 | ||||
| -rw-r--r-- | arch/arm/kvm/interrupts_head.S | 8 | ||||
| -rw-r--r-- | arch/arm/kvm/mmio.c | 64 | ||||
| -rw-r--r-- | arch/arm/kvm/mmu.c | 134 | ||||
| -rw-r--r-- | arch/arm/kvm/trace.h | 48 |
8 files changed, 250 insertions, 109 deletions
diff --git a/arch/arm/kvm/Kconfig b/arch/arm/kvm/Kconfig index 338ace78ed18..f1f79d104309 100644 --- a/arch/arm/kvm/Kconfig +++ b/arch/arm/kvm/Kconfig | |||
| @@ -18,6 +18,7 @@ if VIRTUALIZATION | |||
| 18 | 18 | ||
| 19 | config KVM | 19 | config KVM |
| 20 | bool "Kernel-based Virtual Machine (KVM) support" | 20 | bool "Kernel-based Virtual Machine (KVM) support" |
| 21 | depends on MMU && OF | ||
| 21 | select PREEMPT_NOTIFIERS | 22 | select PREEMPT_NOTIFIERS |
| 22 | select ANON_INODES | 23 | select ANON_INODES |
| 23 | select HAVE_KVM_CPU_RELAX_INTERCEPT | 24 | select HAVE_KVM_CPU_RELAX_INTERCEPT |
| @@ -26,10 +27,12 @@ config KVM | |||
| 26 | select KVM_ARM_HOST | 27 | select KVM_ARM_HOST |
| 27 | select KVM_GENERIC_DIRTYLOG_READ_PROTECT | 28 | select KVM_GENERIC_DIRTYLOG_READ_PROTECT |
| 28 | select SRCU | 29 | select SRCU |
| 29 | depends on ARM_VIRT_EXT && ARM_LPAE | 30 | select MMU_NOTIFIER |
| 31 | select HAVE_KVM_EVENTFD | ||
| 32 | select HAVE_KVM_IRQFD | ||
| 33 | depends on ARM_VIRT_EXT && ARM_LPAE && ARM_ARCH_TIMER | ||
| 30 | ---help--- | 34 | ---help--- |
| 31 | Support hosting virtualized guest machines. You will also | 35 | Support hosting virtualized guest machines. |
| 32 | need to select one or more of the processor modules below. | ||
| 33 | 36 | ||
| 34 | This module provides access to the hardware capabilities through | 37 | This module provides access to the hardware capabilities through |
| 35 | a character device node named /dev/kvm. | 38 | a character device node named /dev/kvm. |
| @@ -37,10 +40,7 @@ config KVM | |||
| 37 | If unsure, say N. | 40 | If unsure, say N. |
| 38 | 41 | ||
| 39 | config KVM_ARM_HOST | 42 | config KVM_ARM_HOST |
| 40 | bool "KVM host support for ARM cpus." | 43 | bool |
| 41 | depends on KVM | ||
| 42 | depends on MMU | ||
| 43 | select MMU_NOTIFIER | ||
| 44 | ---help--- | 44 | ---help--- |
| 45 | Provides host support for ARM processors. | 45 | Provides host support for ARM processors. |
| 46 | 46 | ||
| @@ -55,20 +55,4 @@ config KVM_ARM_MAX_VCPUS | |||
| 55 | large, so only choose a reasonable number that you expect to | 55 | large, so only choose a reasonable number that you expect to |
| 56 | actually use. | 56 | actually use. |
| 57 | 57 | ||
| 58 | config KVM_ARM_VGIC | ||
| 59 | bool "KVM support for Virtual GIC" | ||
| 60 | depends on KVM_ARM_HOST && OF | ||
| 61 | select HAVE_KVM_IRQCHIP | ||
| 62 | default y | ||
| 63 | ---help--- | ||
| 64 | Adds support for a hardware assisted, in-kernel GIC emulation. | ||
| 65 | |||
| 66 | config KVM_ARM_TIMER | ||
| 67 | bool "KVM support for Architected Timers" | ||
| 68 | depends on KVM_ARM_VGIC && ARM_ARCH_TIMER | ||
| 69 | select HAVE_KVM_IRQCHIP | ||
| 70 | default y | ||
| 71 | ---help--- | ||
| 72 | Adds support for the Architected Timers in virtual machines | ||
| 73 | |||
| 74 | endif # VIRTUALIZATION | 58 | endif # VIRTUALIZATION |
diff --git a/arch/arm/kvm/Makefile b/arch/arm/kvm/Makefile index 443b8bea43e9..139e46c08b6e 100644 --- a/arch/arm/kvm/Makefile +++ b/arch/arm/kvm/Makefile | |||
| @@ -7,7 +7,7 @@ ifeq ($(plus_virt),+virt) | |||
| 7 | plus_virt_def := -DREQUIRES_VIRT=1 | 7 | plus_virt_def := -DREQUIRES_VIRT=1 |
| 8 | endif | 8 | endif |
| 9 | 9 | ||
| 10 | ccflags-y += -Ivirt/kvm -Iarch/arm/kvm | 10 | ccflags-y += -Iarch/arm/kvm |
| 11 | CFLAGS_arm.o := -I. $(plus_virt_def) | 11 | CFLAGS_arm.o := -I. $(plus_virt_def) |
| 12 | CFLAGS_mmu.o := -I. | 12 | CFLAGS_mmu.o := -I. |
| 13 | 13 | ||
| @@ -15,12 +15,12 @@ AFLAGS_init.o := -Wa,-march=armv7-a$(plus_virt) | |||
| 15 | AFLAGS_interrupts.o := -Wa,-march=armv7-a$(plus_virt) | 15 | AFLAGS_interrupts.o := -Wa,-march=armv7-a$(plus_virt) |
| 16 | 16 | ||
| 17 | KVM := ../../../virt/kvm | 17 | KVM := ../../../virt/kvm |
| 18 | kvm-arm-y = $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o | 18 | kvm-arm-y = $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o |
| 19 | 19 | ||
| 20 | obj-y += kvm-arm.o init.o interrupts.o | 20 | obj-y += kvm-arm.o init.o interrupts.o |
| 21 | obj-y += arm.o handle_exit.o guest.o mmu.o emulate.o reset.o | 21 | obj-y += arm.o handle_exit.o guest.o mmu.o emulate.o reset.o |
| 22 | obj-y += coproc.o coproc_a15.o coproc_a7.o mmio.o psci.o perf.o | 22 | obj-y += coproc.o coproc_a15.o coproc_a7.o mmio.o psci.o perf.o |
| 23 | obj-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic.o | 23 | obj-y += $(KVM)/arm/vgic.o |
| 24 | obj-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic-v2.o | 24 | obj-y += $(KVM)/arm/vgic-v2.o |
| 25 | obj-$(CONFIG_KVM_ARM_VGIC) += $(KVM)/arm/vgic-v2-emul.o | 25 | obj-y += $(KVM)/arm/vgic-v2-emul.o |
| 26 | obj-$(CONFIG_KVM_ARM_TIMER) += $(KVM)/arm/arch_timer.o | 26 | obj-y += $(KVM)/arm/arch_timer.o |
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 5560f74f9eee..6f536451ab78 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
| @@ -61,8 +61,6 @@ static atomic64_t kvm_vmid_gen = ATOMIC64_INIT(1); | |||
| 61 | static u8 kvm_next_vmid; | 61 | static u8 kvm_next_vmid; |
| 62 | static DEFINE_SPINLOCK(kvm_vmid_lock); | 62 | static DEFINE_SPINLOCK(kvm_vmid_lock); |
| 63 | 63 | ||
| 64 | static bool vgic_present; | ||
| 65 | |||
| 66 | static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu) | 64 | static void kvm_arm_set_running_vcpu(struct kvm_vcpu *vcpu) |
| 67 | { | 65 | { |
| 68 | BUG_ON(preemptible()); | 66 | BUG_ON(preemptible()); |
| @@ -173,8 +171,8 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | |||
| 173 | int r; | 171 | int r; |
| 174 | switch (ext) { | 172 | switch (ext) { |
| 175 | case KVM_CAP_IRQCHIP: | 173 | case KVM_CAP_IRQCHIP: |
| 176 | r = vgic_present; | 174 | case KVM_CAP_IRQFD: |
| 177 | break; | 175 | case KVM_CAP_IOEVENTFD: |
| 178 | case KVM_CAP_DEVICE_CTRL: | 176 | case KVM_CAP_DEVICE_CTRL: |
| 179 | case KVM_CAP_USER_MEMORY: | 177 | case KVM_CAP_USER_MEMORY: |
| 180 | case KVM_CAP_SYNC_MMU: | 178 | case KVM_CAP_SYNC_MMU: |
| @@ -183,6 +181,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) | |||
| 183 | case KVM_CAP_ARM_PSCI: | 181 | case KVM_CAP_ARM_PSCI: |
| 184 | case KVM_CAP_ARM_PSCI_0_2: | 182 | case KVM_CAP_ARM_PSCI_0_2: |
| 185 | case KVM_CAP_READONLY_MEM: | 183 | case KVM_CAP_READONLY_MEM: |
| 184 | case KVM_CAP_MP_STATE: | ||
| 186 | r = 1; | 185 | r = 1; |
| 187 | break; | 186 | break; |
| 188 | case KVM_CAP_COALESCED_MMIO: | 187 | case KVM_CAP_COALESCED_MMIO: |
| @@ -268,7 +267,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu) | |||
| 268 | 267 | ||
| 269 | int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) | 268 | int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) |
| 270 | { | 269 | { |
| 271 | return 0; | 270 | return kvm_timer_should_fire(vcpu); |
| 272 | } | 271 | } |
| 273 | 272 | ||
| 274 | int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) | 273 | int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu) |
| @@ -313,13 +312,29 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, | |||
| 313 | int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, | 312 | int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, |
| 314 | struct kvm_mp_state *mp_state) | 313 | struct kvm_mp_state *mp_state) |
| 315 | { | 314 | { |
| 316 | return -EINVAL; | 315 | if (vcpu->arch.pause) |
| 316 | mp_state->mp_state = KVM_MP_STATE_STOPPED; | ||
| 317 | else | ||
| 318 | mp_state->mp_state = KVM_MP_STATE_RUNNABLE; | ||
| 319 | |||
| 320 | return 0; | ||
| 317 | } | 321 | } |
| 318 | 322 | ||
| 319 | int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, | 323 | int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, |
| 320 | struct kvm_mp_state *mp_state) | 324 | struct kvm_mp_state *mp_state) |
| 321 | { | 325 | { |
| 322 | return -EINVAL; | 326 | switch (mp_state->mp_state) { |
| 327 | case KVM_MP_STATE_RUNNABLE: | ||
| 328 | vcpu->arch.pause = false; | ||
| 329 | break; | ||
| 330 | case KVM_MP_STATE_STOPPED: | ||
| 331 | vcpu->arch.pause = true; | ||
| 332 | break; | ||
| 333 | default: | ||
| 334 | return -EINVAL; | ||
| 335 | } | ||
| 336 | |||
| 337 | return 0; | ||
| 323 | } | 338 | } |
| 324 | 339 | ||
| 325 | /** | 340 | /** |
| @@ -452,6 +467,11 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu) | |||
| 452 | return 0; | 467 | return 0; |
| 453 | } | 468 | } |
| 454 | |||
