Message ID | 1318829177-30777-1-git-send-email-david@gibson.dropbear.id.au |
---|---|
State | New |
Headers | show |
On 16.10.2011, at 22:26, David Gibson wrote: > In __cpu_ppc_store_decr(), we set up a regular timer used to trigger > decrementer interrupts. This is necessary to implement the decrementer > properly under TCG, but is unnecessary under KVM (true for both Book3S-PR > and Book3S-HV KVM variants), because the kernel handles generating and > delivering decrementer exceptions. > > Under kvm, in fact, the timer causes expensive and unnecessary exits from > kvm to qemu. This patch, therefore, disables setting the timer when kvm > is in use. > > Signed-off-by: Anton Blanchard <anton@au1.ibm.com> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Thanks, applied to ppc-next. Alex
On Thu, Oct 20, 2011 at 10:08:36AM -0700, Alexander Graf wrote: > > On 16.10.2011, at 22:26, David Gibson wrote: > > > In __cpu_ppc_store_decr(), we set up a regular timer used to trigger > > decrementer interrupts. This is necessary to implement the decrementer > > properly under TCG, but is unnecessary under KVM (true for both Book3S-PR > > and Book3S-HV KVM variants), because the kernel handles generating and > > delivering decrementer exceptions. > > > > Under kvm, in fact, the timer causes expensive and unnecessary exits from > > kvm to qemu. This patch, therefore, disables setting the timer when kvm > > is in use. > > > > Signed-off-by: Anton Blanchard <anton@au1.ibm.com> > > Signed-off-by: David Gibson <david@gibson.dropbear.id.au> > > Thanks, applied to ppc-next. I think you've forgotten to push out the new ppc-next again..
diff --git a/hw/ppc.c b/hw/ppc.c index 25b59dd..d29af0b 100644 --- a/hw/ppc.c +++ b/hw/ppc.c @@ -662,6 +662,12 @@ static void __cpu_ppc_store_decr (CPUState *env, uint64_t *nextp, LOG_TB("%s: %08" PRIx32 " => %08" PRIx32 "\n", __func__, decr, value); + + if (kvm_enabled()) { + /* KVM handles decrementer exceptions, we don't need our own timer */ + return; + } + now = qemu_get_clock_ns(vm_clock); next = now + muldiv64(value, get_ticks_per_sec(), tb_env->decr_freq); if (is_excp) {