projects
/
platform
/
kernel
/
linux-rpi.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
282da87
)
KVM: vmx: defer load of APIC access page address during reset
author
Paolo Bonzini
<pbonzini@redhat.com>
Sun, 2 Nov 2014 06:54:30 +0000
(07:54 +0100)
committer
Paolo Bonzini
<pbonzini@redhat.com>
Sun, 2 Nov 2014 07:37:18 +0000
(08:37 +0100)
Most call paths to vmx_vcpu_reset do not hold the SRCU lock. Defer loading
the APIC access page to the next vmentry.
This avoids the following lockdep splat:
[ INFO: suspicious RCU usage. ]
3.18.0-rc2-test2+ #70 Not tainted
-------------------------------
include/linux/kvm_host.h:474 suspicious rcu_dereference_check() usage!
other info that might help us debug this:
rcu_scheduler_active = 1, debug_locks = 0
1 lock held by qemu-system-x86/2371:
#0: (&vcpu->mutex){+.+...}, at: [<
ffffffffa037d800
>] vcpu_load+0x20/0xd0 [kvm]
stack backtrace:
CPU: 4 PID: 2371 Comm: qemu-system-x86 Not tainted 3.18.0-rc2-test2+ #70
Hardware name: Dell Inc. OptiPlex 9010/0M9KCM, BIOS A12 01/10/2013
0000000000000001
ffff880209983ca8
ffffffff816f514f
0000000000000000
ffff8802099b8990
ffff880209983cd8
ffffffff810bd687
00000000000fee00
ffff880208a2c000
ffff880208a10000
ffff88020ef50040
ffff880209983d08
Call Trace:
[<
ffffffff816f514f
>] dump_stack+0x4e/0x71
[<
ffffffff810bd687
>] lockdep_rcu_suspicious+0xe7/0x120
[<
ffffffffa037d055
>] gfn_to_memslot+0xd5/0xe0 [kvm]
[<
ffffffffa03807d3
>] __gfn_to_pfn+0x33/0x60 [kvm]
[<
ffffffffa0380885
>] gfn_to_page+0x25/0x90 [kvm]
[<
ffffffffa038aeec
>] kvm_vcpu_reload_apic_access_page+0x3c/0x80 [kvm]
[<
ffffffffa08f0a9c
>] vmx_vcpu_reset+0x20c/0x460 [kvm_intel]
[<
ffffffffa039ab8e
>] kvm_vcpu_reset+0x15e/0x1b0 [kvm]
[<
ffffffffa039ac0c
>] kvm_arch_vcpu_setup+0x2c/0x50 [kvm]
[<
ffffffffa037f7e0
>] kvm_vm_ioctl+0x1d0/0x780 [kvm]
[<
ffffffff810bc664
>] ? __lock_is_held+0x54/0x80
[<
ffffffff812231f0
>] do_vfs_ioctl+0x300/0x520
[<
ffffffff8122ee45
>] ? __fget+0x5/0x250
[<
ffffffff8122f0fa
>] ? __fget_light+0x2a/0xe0
[<
ffffffff81223491
>] SyS_ioctl+0x81/0xa0
[<
ffffffff816fed6d
>] system_call_fastpath+0x16/0x1b
Reported-by: Takashi Iwai <tiwai@suse.de>
Reported-by: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Reviewed-by: Wanpeng Li <wanpeng.li@linux.intel.com>
Tested-by: Wanpeng Li <wanpeng.li@linux.intel.com>
Fixes: 38b9917350cb2946e368ba684cfc33d1672f104e
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx.c
patch
|
blob
|
history
diff --git
a/arch/x86/kvm/vmx.c
b/arch/x86/kvm/vmx.c
index a0f78dbaabee2cf4695b3c424c340714006d3f7a..3e556c68351b7a1356c05e7fe94c6c0895d9755d 100644
(file)
--- a/
arch/x86/kvm/vmx.c
+++ b/
arch/x86/kvm/vmx.c
@@
-4579,7
+4579,7
@@
static void vmx_vcpu_reset(struct kvm_vcpu *vcpu)
vmcs_write32(TPR_THRESHOLD, 0);
}
- kvm_
vcpu_reload_apic_access_page(
vcpu);
+ kvm_
make_request(KVM_REQ_APIC_PAGE_RELOAD,
vcpu);
if (vmx_vm_has_apicv(vcpu->kvm))
memset(&vmx->pi_desc, 0, sizeof(struct pi_desc));