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/arm.c | |
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/arm.c')
-rw-r--r-- | arch/arm/kvm/arm.c | 45 |
1 files changed, 28 insertions, 17 deletions
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 | 469 | ||
470 | bool kvm_arch_intc_initialized(struct kvm *kvm) | ||
471 | { | ||
472 | return vgic_initialized(kvm); | ||
473 | } | ||
474 | |||
455 | static void vcpu_pause(struct kvm_vcpu *vcpu) | 475 | static void vcpu_pause(struct kvm_vcpu *vcpu) |
456 | { | 476 | { |
457 | wait_queue_head_t *wq = kvm_arch_vcpu_wq(vcpu); | 477 | wait_queue_head_t *wq = kvm_arch_vcpu_wq(vcpu); |
@@ -831,8 +851,6 @@ static int kvm_vm_ioctl_set_device_addr(struct kvm *kvm, | |||
831 | 851 | ||
832 | switch (dev_id) { | 852 | switch (dev_id) { |
833 | case KVM_ARM_DEVICE_VGIC_V2: | 853 | case KVM_ARM_DEVICE_VGIC_V2: |
834 | if (!vgic_present) | ||
835 | return -ENXIO; | ||
836 | return kvm_vgic_addr(kvm, type, &dev_addr->addr, true); | 854 | return kvm_vgic_addr(kvm, type, &dev_addr->addr, true); |
837 | default: | 855 | default: |
838 | return -ENODEV; | 856 | return -ENODEV; |
@@ -847,10 +865,7 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
847 | 865 | ||
848 | switch (ioctl) { | 866 | switch (ioctl) { |
849 | case KVM_CREATE_IRQCHIP: { | 867 | case KVM_CREATE_IRQCHIP: { |
850 | if (vgic_present) | 868 | return kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); |
851 | return kvm_vgic_create(kvm, KVM_DEV_TYPE_ARM_VGIC_V2); | ||
852 | else | ||
853 | return -ENXIO; | ||
854 | } | 869 | } |
855 | case KVM_ARM_SET_DEVICE_ADDR: { | 870 | case KVM_ARM_SET_DEVICE_ADDR: { |
856 | struct kvm_arm_device_addr dev_addr; | 871 | struct kvm_arm_device_addr dev_addr; |
@@ -1035,10 +1050,6 @@ static int init_hyp_mode(void) | |||
1035 | if (err) | 1050 | if (err) |
1036 | goto out_free_context; | 1051 | goto out_free_context; |
1037 | 1052 | ||
1038 | #ifdef CONFIG_KVM_ARM_VGIC | ||
1039 | vgic_present = true; | ||
1040 | #endif | ||
1041 | |||
1042 | /* | 1053 | /* |
1043 | * Init HYP architected timer support | 1054 | * Init HYP architected timer support |
1044 | */ | 1055 | */ |