Re: [PATCH] kvm: handle last_boosted_vcpu = 0 case

From: Raghavendra K T
Date: Thu Jun 21 2012 - 06:25:30 EST


On 06/21/2012 12:13 PM, Gleb Natapov wrote:
On Tue, Jun 19, 2012 at 04:51:04PM -0400, Rik van Riel wrote:
On Wed, 20 Jun 2012 01:50:50 +0530
Raghavendra K T<raghavendra.kt@xxxxxxxxxxxxxxxxxx> wrote:


In ple handler code, last_boosted_vcpu (lbv) variable is
serving as reference point to start when we enter.

Also statistical analysis (below) is showing lbv is not very well
distributed with current approach.

You are the second person to spot this bug today (yes, today).

Due to time zones, the first person has not had a chance yet to
test the patch below, which might fix the issue...

Please let me know how it goes.

====8<====

If last_boosted_vcpu == 0, then we fall through all test cases and
may end up with all VCPUs pouncing on vcpu 0. With a large enough
guest, this can result in enormous runqueue lock contention, which
can prevent vcpu0 from running, leading to a livelock.

Changing< to<= makes sure we properly handle that case.

Signed-off-by: Rik van Riel<riel@xxxxxxxxxx>
---
virt/kvm/kvm_main.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 7e14068..1da542b 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1586,7 +1586,7 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me)
*/
for (pass = 0; pass< 2&& !yielded; pass++) {
kvm_for_each_vcpu(i, vcpu, kvm) {
- if (!pass&& i< last_boosted_vcpu) {
+ if (!pass&& i<= last_boosted_vcpu) {
i = last_boosted_vcpu;
continue;
} else if (pass&& i> last_boosted_vcpu)

Looks correct. We can simplify this by introducing something like:

#define kvm_for_each_vcpu_from(idx, n, vcpup, kvm) \
for (n = atomic_read(&kvm->online_vcpus); \
n&& (vcpup = kvm_get_vcpu(kvm, idx)) != NULL; \
n--, idx = (idx+1) % atomic_read(&kvm->online_vcpus))


Thumbs up for this simplification. This really helps in all the places
where we want to start iterating from middle.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/