Wanpeng Li
1d518c6820
KVM: LAPIC: Fix reentrancy issues with preempt notifiers
...
Preempt can occur in the preemption timer expiration handler:
CPU0 CPU1
preemption timer vmexit
handle_preemption_timer(vCPU0)
kvm_lapic_expired_hv_timer
hv_timer_is_use == true
sched_out
sched_in
kvm_arch_vcpu_load
kvm_lapic_restart_hv_timer
restart_apic_timer
start_hv_timer
already-expired timer or sw timer triggerd in the window
start_sw_timer
cancel_hv_timer
/* back in kvm_lapic_expired_hv_timer */
cancel_hv_timer
WARN_ON(!apic->lapic_timer.hv_timer_in_use); ==> Oops
This can be reproduced if CONFIG_PREEMPT is enabled.
------------[ cut here ]------------
WARNING: CPU: 4 PID: 2972 at /home/kernel/linux/arch/x86/kvm//lapic.c:1563 kvm_lapic_expired_hv_timer+0x9e/0xb0 [kvm]
CPU: 4 PID: 2972 Comm: qemu-system-x86 Tainted: G OE 4.13.0-rc2+ #16
RIP: 0010:kvm_lapic_expired_hv_timer+0x9e/0xb0 [kvm]
Call Trace:
handle_preemption_timer+0xe/0x20 [kvm_intel]
vmx_handle_exit+0xb8/0xd70 [kvm_intel]
kvm_arch_vcpu_ioctl_run+0xdd1/0x1be0 [kvm]
? kvm_arch_vcpu_load+0x47/0x230 [kvm]
? kvm_arch_vcpu_load+0x62/0x230 [kvm]
kvm_vcpu_ioctl+0x340/0x700 [kvm]
? kvm_vcpu_ioctl+0x340/0x700 [kvm]
? __fget+0xfc/0x210
do_vfs_ioctl+0xa4/0x6a0
? __fget+0x11d/0x210
SyS_ioctl+0x79/0x90
do_syscall_64+0x81/0x220
entry_SYSCALL64_slow_path+0x25/0x25
------------[ cut here ]------------
WARNING: CPU: 4 PID: 2972 at /home/kernel/linux/arch/x86/kvm//lapic.c:1498 cancel_hv_timer.isra.40+0x4f/0x60 [kvm]
CPU: 4 PID: 2972 Comm: qemu-system-x86 Tainted: G W OE 4.13.0-rc2+ #16
RIP: 0010:cancel_hv_timer.isra.40+0x4f/0x60 [kvm]
Call Trace:
kvm_lapic_expired_hv_timer+0x3e/0xb0 [kvm]
handle_preemption_timer+0xe/0x20 [kvm_intel]
vmx_handle_exit+0xb8/0xd70 [kvm_intel]
kvm_arch_vcpu_ioctl_run+0xdd1/0x1be0 [kvm]
? kvm_arch_vcpu_load+0x47/0x230 [kvm]
? kvm_arch_vcpu_load+0x62/0x230 [kvm]
kvm_vcpu_ioctl+0x340/0x700 [kvm]
? kvm_vcpu_ioctl+0x340/0x700 [kvm]
? __fget+0xfc/0x210
do_vfs_ioctl+0xa4/0x6a0
? __fget+0x11d/0x210
SyS_ioctl+0x79/0x90
do_syscall_64+0x81/0x220
entry_SYSCALL64_slow_path+0x25/0x25
This patch fixes it by making the caller of cancel_hv_timer, start_hv_timer
and start_sw_timer be in preemption-disabled regions, which trivially
avoid any reentrancy issue with preempt notifier.
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
[Add more WARNs. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2017-07-26 19:04:53 +02:00
..
2017-06-08 15:38:21 +02:00
2017-06-07 16:28:15 +02:00
2016-09-16 16:57:48 +02:00
2017-07-06 18:38:31 -07:00
2017-07-20 17:00:00 +02:00
2017-07-14 16:28:18 +02:00
2017-07-12 22:38:26 +02:00
2016-12-08 15:31:11 +01:00
2017-04-12 20:17:15 +02:00
2017-04-12 20:17:14 +02:00
2017-04-12 20:17:14 +02:00
2017-05-02 14:45:45 +02:00
2017-04-12 20:17:13 +02:00
2017-05-02 14:45:45 +02:00
2017-07-19 16:19:14 +02:00
2016-03-22 16:23:37 +01:00
2017-07-26 19:04:53 +02:00
2017-06-29 18:18:52 +02:00
2017-04-07 16:49:00 +02:00
2016-01-15 17:56:32 -08:00
2017-07-14 14:26:16 +02:00
2017-07-14 14:25:24 +02:00
2017-07-03 11:19:54 +02:00
2016-07-05 16:14:43 +02:00
2017-05-08 17:15:12 -07:00
2017-05-15 18:22:40 +02:00
2016-09-16 16:19:49 +02:00
2017-05-19 19:59:27 +02:00
2017-03-01 14:19:46 +01:00
2015-06-23 14:12:14 +02:00
2017-07-14 14:26:16 +02:00
2016-06-16 10:07:48 +02:00
2017-07-26 18:57:46 +02:00
2017-07-26 18:57:45 +02:00
2017-04-21 12:50:28 +02:00