Documentation: kvm: clarify SRCU locking order
Currently only the locking order of SRCU vs kvm->slots_arch_lock and kvm->slots_lock is documented. Extend this to kvm->lock since Xen emulation got it terribly wrong. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
a79b53aaaa
commit
02d9a04da4
|
@ -16,17 +16,26 @@ The acquisition orders for mutexes are as follows:
|
||||||
- kvm->slots_lock is taken outside kvm->irq_lock, though acquiring
|
- kvm->slots_lock is taken outside kvm->irq_lock, though acquiring
|
||||||
them together is quite rare.
|
them together is quite rare.
|
||||||
|
|
||||||
- Unlike kvm->slots_lock, kvm->slots_arch_lock is released before
|
|
||||||
synchronize_srcu(&kvm->srcu). Therefore kvm->slots_arch_lock
|
|
||||||
can be taken inside a kvm->srcu read-side critical section,
|
|
||||||
while kvm->slots_lock cannot.
|
|
||||||
|
|
||||||
- kvm->mn_active_invalidate_count ensures that pairs of
|
- kvm->mn_active_invalidate_count ensures that pairs of
|
||||||
invalidate_range_start() and invalidate_range_end() callbacks
|
invalidate_range_start() and invalidate_range_end() callbacks
|
||||||
use the same memslots array. kvm->slots_lock and kvm->slots_arch_lock
|
use the same memslots array. kvm->slots_lock and kvm->slots_arch_lock
|
||||||
are taken on the waiting side in install_new_memslots, so MMU notifiers
|
are taken on the waiting side in install_new_memslots, so MMU notifiers
|
||||||
must not take either kvm->slots_lock or kvm->slots_arch_lock.
|
must not take either kvm->slots_lock or kvm->slots_arch_lock.
|
||||||
|
|
||||||
|
For SRCU:
|
||||||
|
|
||||||
|
- ``synchronize_srcu(&kvm->srcu)`` is called _inside_
|
||||||
|
the kvm->slots_lock critical section, therefore kvm->slots_lock
|
||||||
|
cannot be taken inside a kvm->srcu read-side critical section.
|
||||||
|
Instead, kvm->slots_arch_lock is released before the call
|
||||||
|
to ``synchronize_srcu()`` and _can_ be taken inside a
|
||||||
|
kvm->srcu read-side critical section.
|
||||||
|
|
||||||
|
- kvm->lock is taken inside kvm->srcu, therefore
|
||||||
|
``synchronize_srcu(&kvm->srcu)`` cannot be called inside
|
||||||
|
a kvm->lock critical section. If you cannot delay the
|
||||||
|
call until after kvm->lock is released, use ``call_srcu``.
|
||||||
|
|
||||||
On x86:
|
On x86:
|
||||||
|
|
||||||
- vcpu->mutex is taken outside kvm->arch.hyperv.hv_lock
|
- vcpu->mutex is taken outside kvm->arch.hyperv.hv_lock
|
||||||
|
|
Loading…
Reference in New Issue