KVM: mmu_shrink: kvm_mmu_zap_page requires slots_lock to be held
kvm_mmu_zap_page() needs slots lock held (rmap_remove->gfn_to_memslot, for example).
Since kvm_lock spinlock is held in mmu_shrink(), do a non-blocking down_read_trylock().
Untested.
arch/x86/kvm/mmu.c +3 -0
@@ -1987,6 +1987,8 @@ static int mmu_shrink(int nr_to_scan, gflist_for_each_entry (kvm, &vm_list, vm_list) {int npages; +if (!down_read_trylock (&kvm->slots_lock)) +continue ;spin_lock (&kvm->mmu_lock); npages = kvm->arch.n_alloc_mmu_pages - kvm->arch.n_free_mmu_pages;
@@ -1999,6 +2001,7 @@ static int mmu_shrink(int nr_to_scan, gf nr_to_scan--;spin_unlock (&kvm->mmu_lock); +up_read (&kvm->slots_lock); }if (kvm_freed)list_move_tail (&kvm_freed->vm_list, &vm_list);
Avi Kivity
AppliedQuoted 6 lines · Marcelo Tosatti
kvm_mmu_zap_page()needs slots lock held (rmap_remove->gfn_to_memslot, for example).Since
kvm_lockspinlock is held inmmu_shrink(), do a non-blockingdown_read_trylock().
Applied, thanks.
Signature · 2 lines
I have a truly marvellous patch that fixes the bug which this signature is too narrow to contain.