* [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression
@ 2013-11-23 3:53 Alexander Graf
2013-11-23 3:53 ` [Qemu-devel] [PATCH 1/2] PPC: Make BookE FIT/WDT timers more lazy Alexander Graf
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Alexander Graf @ 2013-11-23 3:53 UTC (permalink / raw)
To: QEMU Developers
Cc: Bharat Bhushan, qemu-ppc@nongnu.org list:PowerPC, Fabien Chouteau
Thanks to the new timer infrastructure we are now able to trigger timer events
and ridiculous granularities in sub-microsecond orders.
However, the BookE targets were quite unhappy about that change, showing up
to x10 slowdown on a simple Linux guest bootup test.
This patch set makes the constant timer facilities in BookE more lazy and less
fine grained than they could be. That way we're at least as good as we were in
QEMU 1.6.
Alexander Graf (2):
PPC: Make BookE FIT/WDT timers more lazy
PPC: BookE: Make FIT/WDT timers at best millisecond grained
hw/ppc/ppc_booke.c | 49 ++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 44 insertions(+), 5 deletions(-)
--
1.7.12.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 1/2] PPC: Make BookE FIT/WDT timers more lazy
2013-11-23 3:53 [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Alexander Graf
@ 2013-11-23 3:53 ` Alexander Graf
2013-11-23 3:53 ` [Qemu-devel] [PATCH 2/2] PPC: BookE: Make FIT/WDT timers at best microsecond grained Alexander Graf
2013-11-23 4:08 ` [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Stefan Weil
2 siblings, 0 replies; 6+ messages in thread
From: Alexander Graf @ 2013-11-23 3:53 UTC (permalink / raw)
To: QEMU Developers
Cc: Bharat Bhushan, qemu-ppc@nongnu.org list:PowerPC, Fabien Chouteau
Today we fire FIT and WDT timer events every time the respective bit
position in TB flips from 0 -> 1.
However, there is no need to do this if the end result would be that
we're changing a TSR bit that is set to 1 to 1 again. No guest visible
change would have occured.
So whenever we see that the TSR bit to our timer is already set, don't
even bother to update the timer that would potentially fire it off.
However, we do need to make sure that we update our timer that notifies
us of the TB flip when the respective TSR bit gets unset. In that case
we do care about the flip and need to notify the guest again. So add
a callback into our timer handlers when TSR bits get unset.
This improves performance for me when the guest is busy processing things.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
hw/ppc/ppc_booke.c | 43 ++++++++++++++++++++++++++++++++++++++-----
1 file changed, 38 insertions(+), 5 deletions(-)
diff --git a/hw/ppc/ppc_booke.c b/hw/ppc/ppc_booke.c
index 8bbfc72..28cf9fd 100644
--- a/hw/ppc/ppc_booke.c
+++ b/hw/ppc/ppc_booke.c
@@ -128,7 +128,8 @@ static uint8_t booke_get_wdt_target(CPUPPCState *env, ppc_tb_t *tb_env)
static void booke_update_fixed_timer(CPUPPCState *env,
uint8_t target_bit,
uint64_t *next,
- struct QEMUTimer *timer)
+ struct QEMUTimer *timer,
+ int tsr_bit)
{
ppc_tb_t *tb_env = env->tb_env;
uint64_t delta_tick, ticks = 0;
@@ -136,6 +137,14 @@ static void booke_update_fixed_timer(CPUPPCState *env,
uint64_t period;
uint64_t now;
+ if (!env->spr[SPR_BOOKE_TSR] & tsr_bit) {
+ /*
+ * Don't arm the timer again when the guest has the current
+ * interrupt still pending. Wait for it to ack it.
+ */
+ return;
+ }
+
now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
tb = cpu_ppc_get_tb(tb_env, now, tb_env->tb_offset);
period = 1ULL << target_bit;
@@ -167,6 +176,7 @@ static void booke_update_fixed_timer(CPUPPCState *env,
(*next)++;
}
+ /* Fire the next timer */
timer_mod(timer, *next);
}
@@ -200,7 +210,8 @@ static void booke_fit_cb(void *opaque)
booke_update_fixed_timer(env,
booke_get_fit_target(env, tb_env),
&booke_timer->fit_next,
- booke_timer->fit_timer);
+ booke_timer->fit_timer,
+ TSR_FIS);
}
static void booke_wdt_cb(void *opaque)
@@ -220,15 +231,35 @@ static void booke_wdt_cb(void *opaque)
booke_update_fixed_timer(env,
booke_get_wdt_target(env, tb_env),
&booke_timer->wdt_next,
- booke_timer->wdt_timer);
+ booke_timer->wdt_timer,
+ TSR_WIS);
}
void store_booke_tsr(CPUPPCState *env, target_ulong val)
{
PowerPCCPU *cpu = ppc_env_get_cpu(env);
+ ppc_tb_t *tb_env = env->tb_env;
+ booke_timer_t *booke_timer = tb_env->opaque;
env->spr[SPR_BOOKE_TSR] &= ~val;
kvmppc_clear_tsr_bits(cpu, val);
+
+ if (val & TSR_FIS) {
+ booke_update_fixed_timer(env,
+ booke_get_fit_target(env, tb_env),
+ &booke_timer->fit_next,
+ booke_timer->fit_timer,
+ TSR_FIS);
+ }
+
+ if (val & TSR_WIS) {
+ booke_update_fixed_timer(env,
+ booke_get_wdt_target(env, tb_env),
+ &booke_timer->wdt_next,
+ booke_timer->wdt_timer,
+ TSR_WIS);
+ }
+
booke_update_irq(cpu);
}
@@ -247,12 +278,14 @@ void store_booke_tcr(CPUPPCState *env, target_ulong val)
booke_update_fixed_timer(env,
booke_get_fit_target(env, tb_env),
&booke_timer->fit_next,
- booke_timer->fit_timer);
+ booke_timer->fit_timer,
+ TSR_FIS);
booke_update_fixed_timer(env,
booke_get_wdt_target(env, tb_env),
&booke_timer->wdt_next,
- booke_timer->wdt_timer);
+ booke_timer->wdt_timer,
+ TSR_WIS);
}
static void ppc_booke_timer_reset_handle(void *opaque)
--
1.7.12.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 2/2] PPC: BookE: Make FIT/WDT timers at best microsecond grained
2013-11-23 3:53 [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Alexander Graf
2013-11-23 3:53 ` [Qemu-devel] [PATCH 1/2] PPC: Make BookE FIT/WDT timers more lazy Alexander Graf
@ 2013-11-23 3:53 ` Alexander Graf
2013-11-23 4:08 ` [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Stefan Weil
2 siblings, 0 replies; 6+ messages in thread
From: Alexander Graf @ 2013-11-23 3:53 UTC (permalink / raw)
To: QEMU Developers
Cc: Bharat Bhushan, qemu-ppc@nongnu.org list:PowerPC, Fabien Chouteau
The default granularity for the FIT timer on 440 is on every 0x1000th
transition of TB from 0 to 1. Translated that means 48828 times a second.
Since interrupts are quite expensive for 440 and we don't really care
about the accuracy of the FIT to that significance, let's force FIT and
WDT to at best microsecond granularity.
This basically restores behavior as it was in QEMU 1.6, where timers
could only deal with microsecond granularities at all.
This patch greatly improves performance with the 440 target and restores
roughly the same performance level that QEMU 1.6 had for me.
Signed-off-by: Alexander Graf <agraf@suse.de>
---
hw/ppc/ppc_booke.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/hw/ppc/ppc_booke.c b/hw/ppc/ppc_booke.c
index 28cf9fd..3038acc 100644
--- a/hw/ppc/ppc_booke.c
+++ b/hw/ppc/ppc_booke.c
@@ -174,6 +174,12 @@ static void booke_update_fixed_timer(CPUPPCState *env,
if (*next == now) {
(*next)++;
+ } else {
+ /*
+ * There's no point to fake any granularity that's more fine grained
+ * than microseconds. Anything beyond that just overloads the system.
+ */
+ *next = MAX(*next, now + SCALE_MS);
}
/* Fire the next timer */
--
1.7.12.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression
2013-11-23 3:53 [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Alexander Graf
2013-11-23 3:53 ` [Qemu-devel] [PATCH 1/2] PPC: Make BookE FIT/WDT timers more lazy Alexander Graf
2013-11-23 3:53 ` [Qemu-devel] [PATCH 2/2] PPC: BookE: Make FIT/WDT timers at best microsecond grained Alexander Graf
@ 2013-11-23 4:08 ` Stefan Weil
2013-11-23 4:43 ` Stefan Weil
2013-11-25 11:10 ` Alexander Graf
2 siblings, 2 replies; 6+ messages in thread
From: Stefan Weil @ 2013-11-23 4:08 UTC (permalink / raw)
To: Alexander Graf, QEMU Developers
Cc: Bharat Bhushan, qemu-ppc@nongnu.org list:PowerPC, Fabien Chouteau
Am 23.11.2013 04:53, schrieb Alexander Graf:
> Thanks to the new timer infrastructure we are now able to trigger timer events
> and ridiculous granularities in sub-microsecond orders.
>
> However, the BookE targets were quite unhappy about that change, showing up
> to x10 slowdown on a simple Linux guest bootup test.
>
> This patch set makes the constant timer facilities in BookE more lazy and less
> fine grained than they could be. That way we're at least as good as we were in
> QEMU 1.6.
>
> Alexander Graf (2):
> PPC: Make BookE FIT/WDT timers more lazy
> PPC: BookE: Make FIT/WDT timers at best millisecond grained
>
> hw/ppc/ppc_booke.c | 49 ++++++++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 44 insertions(+), 5 deletions(-)
Good morning Alexander,
I have two small remarks:
Patch 1: Could you please use 'QemuTimer' instead of 'struct QEMUTimer'
in the modified lines of code?
Patch 2: Milliseconds instead of microseconds (commit message and code
comment)?
Cheers,
Stefan
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression
2013-11-23 4:08 ` [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Stefan Weil
@ 2013-11-23 4:43 ` Stefan Weil
2013-11-25 11:10 ` Alexander Graf
1 sibling, 0 replies; 6+ messages in thread
From: Stefan Weil @ 2013-11-23 4:43 UTC (permalink / raw)
To: Alexander Graf, QEMU Developers
Cc: Bharat Bhushan, qemu-ppc@nongnu.org list:PowerPC, Fabien Chouteau
Am 23.11.2013 05:08, schrieb Stefan Weil:
> Good morning Alexander,
>
> I have two small remarks:
>
> Patch 1: Could you please use 'QemuTimer' instead of 'struct QEMUTimer'
> in the modified lines of code?
Sorry, QEMUTimer, of course. The 'struct' keyword is redundant and
should be avoided.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression
2013-11-23 4:08 ` [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Stefan Weil
2013-11-23 4:43 ` Stefan Weil
@ 2013-11-25 11:10 ` Alexander Graf
1 sibling, 0 replies; 6+ messages in thread
From: Alexander Graf @ 2013-11-25 11:10 UTC (permalink / raw)
To: Stefan Weil
Cc: Bharat Bhushan, qemu-ppc@nongnu.org list:PowerPC, QEMU Developers,
Fabien Chouteau
On 23.11.2013, at 05:08, Stefan Weil <sw@weilnetz.de> wrote:
> Am 23.11.2013 04:53, schrieb Alexander Graf:
>> Thanks to the new timer infrastructure we are now able to trigger timer events
>> and ridiculous granularities in sub-microsecond orders.
>>
>> However, the BookE targets were quite unhappy about that change, showing up
>> to x10 slowdown on a simple Linux guest bootup test.
>>
>> This patch set makes the constant timer facilities in BookE more lazy and less
>> fine grained than they could be. That way we're at least as good as we were in
>> QEMU 1.6.
>>
>> Alexander Graf (2):
>> PPC: Make BookE FIT/WDT timers more lazy
>> PPC: BookE: Make FIT/WDT timers at best millisecond grained
>>
>> hw/ppc/ppc_booke.c | 49 ++++++++++++++++++++++++++++++++++++++++++++-----
>> 1 file changed, 44 insertions(+), 5 deletions(-)
>
> Good morning Alexander,
>
> I have two small remarks:
>
> Patch 1: Could you please use 'QemuTimer' instead of 'struct QEMUTimer'
> in the modified lines of code?
>
> Patch 2: Milliseconds instead of microseconds (commit message and code
> comment)?
Alrighty :). Changed both and will resend. Thanks a lot for the review!
Alex
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-11-25 11:09 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-23 3:53 [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Alexander Graf
2013-11-23 3:53 ` [Qemu-devel] [PATCH 1/2] PPC: Make BookE FIT/WDT timers more lazy Alexander Graf
2013-11-23 3:53 ` [Qemu-devel] [PATCH 2/2] PPC: BookE: Make FIT/WDT timers at best microsecond grained Alexander Graf
2013-11-23 4:08 ` [Qemu-devel] [PATCH 1.7 0/2] PPC: Fix BookE timer performance regression Stefan Weil
2013-11-23 4:43 ` Stefan Weil
2013-11-25 11:10 ` Alexander Graf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).