It isn't. It makes no sense at all to give a guest more vcpus than
physical cpus, so that kind of contention won't happen in general. But
the bad locking scenario happens when there's any system-wide
contention, so it could happen if some other virtual machine preempts a
vcpu holding a lock. And once a lock ends up being (effectively) held
for 30ms rather than 30us, the likelihood of going into contention goes
way up, and you can enter the catastrophic N^2 unlock->relock state.
My measurements show that reverting to the old lock-byte algorithm
avoids the worst case, and just results in a bit of excessive spinning.
Replacing it with a smarter spin-then-block-vcpu algorithm doesn't
really benefit the specific guest VM very much (kernbench elapsed time
is only slightly improved), but its consumption of physical cpu time can
go down by ~10%.
I'm aware of that. In my current implementation the overhead amounts to
an extra direct call in the lock/unlock path, but that can be eliminated
with a small amount of restructuring (by making spin_lock/unlock()
inline functions, and having the call to raw_spin_lock/unlock within
it). The pvops patching machinery removes any indirect calls or jumps.
J
--