| From: Josh Cartwright <joshc@ni.com> |
| Date: Thu, 11 Feb 2016 11:54:01 -0600 |
| Subject: KVM: arm/arm64: downgrade preempt_disable()d region to migrate_disable() |
| |
| kvm_arch_vcpu_ioctl_run() disables the use of preemption when updating |
| the vgic and timer states to prevent the calling task from migrating to |
| another CPU. It does so to prevent the task from writing to the |
| incorrect per-CPU GIC distributor registers. |
| |
| On -rt kernels, it's possible to maintain the same guarantee with the |
| use of migrate_{disable,enable}(), with the added benefit that the |
| migrate-disabled region is preemptible. Update |
| kvm_arch_vcpu_ioctl_run() to do so. |
| |
| Cc: Christoffer Dall <christoffer.dall@linaro.org> |
| Reported-by: Manish Jaggi <Manish.Jaggi@caviumnetworks.com> |
| Signed-off-by: Josh Cartwright <joshc@ni.com> |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| --- |
| arch/arm/kvm/arm.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/arch/arm/kvm/arm.c |
| +++ b/arch/arm/kvm/arm.c |
| @@ -632,7 +632,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v |
| * involves poking the GIC, which must be done in a |
| * non-preemptible context. |
| */ |
| - preempt_disable(); |
| + migrate_disable(); |
| kvm_pmu_flush_hwstate(vcpu); |
| kvm_timer_flush_hwstate(vcpu); |
| kvm_vgic_flush_hwstate(vcpu); |
| @@ -653,7 +653,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v |
| kvm_pmu_sync_hwstate(vcpu); |
| kvm_timer_sync_hwstate(vcpu); |
| kvm_vgic_sync_hwstate(vcpu); |
| - preempt_enable(); |
| + migrate_enable(); |
| continue; |
| } |
| |
| @@ -709,7 +709,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_v |
| |
| kvm_vgic_sync_hwstate(vcpu); |
| |
| - preempt_enable(); |
| + migrate_enable(); |
| |
| ret = handle_exit(vcpu, run, ret); |
| } |