2019-09-26 10:13:28

by Wanpeng Li

[permalink] [raw]
Subject: [PATCH v2] KVM: LAPIC: Loose fluctuation filter for auto tune lapic_timer_advance_ns

From: Wanpeng Li <[email protected]>

5000 guest cycles delta is easy to encounter on desktop, per-vCPU
lapic_timer_advance_ns always keeps at 1000ns initial value, lets
loose fluctuation filter a bit to make auto tune can make some
progress.

Signed-off-by: Wanpeng Li <[email protected]>
---
v1 -> v2:
* separate defines for ns vs cycles

arch/x86/kvm/lapic.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 3a3a685..7bfc3c0 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -66,9 +66,10 @@
#define X2APIC_BROADCAST 0xFFFFFFFFul

static bool lapic_timer_advance_dynamic __read_mostly;
-#define LAPIC_TIMER_ADVANCE_ADJUST_MIN 100
-#define LAPIC_TIMER_ADVANCE_ADJUST_MAX 5000
-#define LAPIC_TIMER_ADVANCE_ADJUST_INIT 1000
+#define LAPIC_TIMER_ADVANCE_EXPIRE_MIN 100
+#define LAPIC_TIMER_ADVANCE_EXPIRE_MAX 10000
+#define LAPIC_TIMER_ADVANCE_NS_INIT 1000
+#define LAPIC_TIMER_ADVANCE_NS_MAX 5000
/* step-by-step approximation to mitigate fluctuation */
#define LAPIC_TIMER_ADVANCE_ADJUST_STEP 8

@@ -1488,8 +1489,8 @@ static inline void adjust_lapic_timer_advance(struct kvm_vcpu *vcpu,
u64 ns;

/* Do not adjust for tiny fluctuations or large random spikes. */
- if (abs(advance_expire_delta) > LAPIC_TIMER_ADVANCE_ADJUST_MAX ||
- abs(advance_expire_delta) < LAPIC_TIMER_ADVANCE_ADJUST_MIN)
+ if (abs(advance_expire_delta) > LAPIC_TIMER_ADVANCE_EXPIRE_MAX ||
+ abs(advance_expire_delta) < LAPIC_TIMER_ADVANCE_EXPIRE_MIN)
return;

/* too early */
@@ -1504,8 +1505,8 @@ static inline void adjust_lapic_timer_advance(struct kvm_vcpu *vcpu,
timer_advance_ns += ns/LAPIC_TIMER_ADVANCE_ADJUST_STEP;
}

- if (unlikely(timer_advance_ns > LAPIC_TIMER_ADVANCE_ADJUST_MAX))
- timer_advance_ns = LAPIC_TIMER_ADVANCE_ADJUST_INIT;
+ if (unlikely(timer_advance_ns > LAPIC_TIMER_ADVANCE_NS_MAX))
+ timer_advance_ns = LAPIC_TIMER_ADVANCE_NS_INIT;
apic->lapic_timer.timer_advance_ns = timer_advance_ns;
}

@@ -2302,7 +2303,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu, int timer_advance_ns)
HRTIMER_MODE_ABS_HARD);
apic->lapic_timer.timer.function = apic_timer_fn;
if (timer_advance_ns == -1) {
- apic->lapic_timer.timer_advance_ns = LAPIC_TIMER_ADVANCE_ADJUST_INIT;
+ apic->lapic_timer.timer_advance_ns = LAPIC_TIMER_ADVANCE_NS_INIT;
lapic_timer_advance_dynamic = true;
} else {
apic->lapic_timer.timer_advance_ns = timer_advance_ns;
--
2.7.4


2019-09-26 10:58:38

by Wanpeng Li

[permalink] [raw]
Subject: Re: [PATCH v2] KVM: LAPIC: Loose fluctuation filter for auto tune lapic_timer_advance_ns

On Thu, 26 Sep 2019 at 18:25, Paolo Bonzini <[email protected]> wrote:
>
> On 26/09/19 02:54, Wanpeng Li wrote:
> > -#define LAPIC_TIMER_ADVANCE_ADJUST_MIN 100
> > -#define LAPIC_TIMER_ADVANCE_ADJUST_MAX 5000
> > -#define LAPIC_TIMER_ADVANCE_ADJUST_INIT 1000
> > +#define LAPIC_TIMER_ADVANCE_EXPIRE_MIN 100
> > +#define LAPIC_TIMER_ADVANCE_EXPIRE_MAX 10000
> > +#define LAPIC_TIMER_ADVANCE_NS_INIT 1000
> > +#define LAPIC_TIMER_ADVANCE_NS_MAX 5000
>
> I think the old #define value is good. What about:
>
> -#define LAPIC_TIMER_ADVANCE_ADJUST_MIN 100
> -#define LAPIC_TIMER_ADVANCE_ADJUST_MAX 5000
> -#define LAPIC_TIMER_ADVANCE_ADJUST_INIT 1000
> +#define LAPIC_TIMER_ADVANCE_ADJUST_MIN 100 /* clock cycles */
> +#define LAPIC_TIMER_ADVANCE_ADJUST_MAX 10000 /* clock cycles */
> +#define LAPIC_TIMER_ADVANCE_NS_INIT 1000
> +#define LAPIC_TIMER_ADVANCE_NS_MAX 5000

Looks good, I guess you can update the patch during apply. :)

Wanpeng

2019-09-26 10:58:38

by Paolo Bonzini

[permalink] [raw]
Subject: Re: [PATCH v2] KVM: LAPIC: Loose fluctuation filter for auto tune lapic_timer_advance_ns

On 26/09/19 02:54, Wanpeng Li wrote:
> -#define LAPIC_TIMER_ADVANCE_ADJUST_MIN 100
> -#define LAPIC_TIMER_ADVANCE_ADJUST_MAX 5000
> -#define LAPIC_TIMER_ADVANCE_ADJUST_INIT 1000
> +#define LAPIC_TIMER_ADVANCE_EXPIRE_MIN 100
> +#define LAPIC_TIMER_ADVANCE_EXPIRE_MAX 10000
> +#define LAPIC_TIMER_ADVANCE_NS_INIT 1000
> +#define LAPIC_TIMER_ADVANCE_NS_MAX 5000

I think the old #define value is good. What about:

-#define LAPIC_TIMER_ADVANCE_ADJUST_MIN 100
-#define LAPIC_TIMER_ADVANCE_ADJUST_MAX 5000
-#define LAPIC_TIMER_ADVANCE_ADJUST_INIT 1000
+#define LAPIC_TIMER_ADVANCE_ADJUST_MIN 100 /* clock cycles */
+#define LAPIC_TIMER_ADVANCE_ADJUST_MAX 10000 /* clock cycles */
+#define LAPIC_TIMER_ADVANCE_NS_INIT 1000
+#define LAPIC_TIMER_ADVANCE_NS_MAX 5000

?

Thanks,

Paolo