(Adding Christian Borntraeger in Cc)
2012/10/25 Frederic Weisbecker <[email protected]>: > Switching to or from guest context is done on ioctl context. > So by the time we call kvm_guest_enter() or kvm_guest_exit() > we know we are not running the idle task. > > As a result, we can directly account the cputime using > vtime_account_system(). > > There are two good reasons to do this: > > * We avoid some useless checks on guest switch. It optimizes > a bit this fast path. > > * In the case of CONFIG_IRQ_TIME_ACCOUNTING, calling vtime_account() > checks for irq time to account. This is pointless since we know > we are not in an irq on guest switch. This is wasting cpu cycles > for no good reason. vtime_account_system() OTOH is a no-op in > this config option. > > * We can remove the irq disable/enable around kvm guest switch in s390. > > A further optimization may consist in introducing a vtime_account_guest() > that directly calls account_guest_time(). > > Signed-off-by: Frederic Weisbecker <[email protected]> > Cc: Tony Luck <[email protected]> > Cc: Fenghua Yu <[email protected]> > Cc: Benjamin Herrenschmidt <[email protected]> > Cc: Paul Mackerras <[email protected]> > Cc: Heiko Carstens <[email protected]> > Cc: Martin Schwidefsky <[email protected]> > Cc: Avi Kivity <[email protected]> > Cc: Marcelo Tosatti <[email protected]> > Cc: Joerg Roedel <[email protected]> > Cc: Alexander Graf <[email protected]> > Cc: Xiantao Zhang <[email protected]> > Cc: Christian Borntraeger <[email protected]> > Cc: Cornelia Huck <[email protected]> > Cc: Peter Zijlstra <[email protected]> > Cc: Ingo Molnar <[email protected]> > Cc: Thomas Gleixner <[email protected]> > Cc: Steven Rostedt <[email protected]> > Cc: Paul Gortmaker <[email protected]> > --- > arch/s390/kvm/kvm-s390.c | 4 ---- > include/linux/kvm_host.h | 12 ++++++++++-- > 2 files changed, 10 insertions(+), 6 deletions(-) > > diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c > index ecced9d..d91a955 100644 > --- a/arch/s390/kvm/kvm-s390.c > +++ b/arch/s390/kvm/kvm-s390.c > @@ -608,9 +608,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) > kvm_s390_deliver_pending_interrupts(vcpu); > > vcpu->arch.sie_block->icptcode = 0; > - local_irq_disable(); > kvm_guest_enter(); > - local_irq_enable(); > VCPU_EVENT(vcpu, 6, "entering sie flags %x", > atomic_read(&vcpu->arch.sie_block->cpuflags)); > trace_kvm_s390_sie_enter(vcpu, > @@ -629,9 +627,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) > VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", > vcpu->arch.sie_block->icptcode); > trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode); > - local_irq_disable(); > kvm_guest_exit(); > - local_irq_enable(); > > memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16); > return rc; > diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h > index 93bfc9f..0e2212f 100644 > --- a/include/linux/kvm_host.h > +++ b/include/linux/kvm_host.h > @@ -737,7 +737,11 @@ static inline int kvm_deassign_device(struct kvm *kvm, > static inline void kvm_guest_enter(void) > { > BUG_ON(preemptible()); > - vtime_account(current); > + /* > + * This is running in ioctl context so we can avoid > + * the call to vtime_account() with its unnecessary idle check. > + */ > + vtime_account_system(current); > current->flags |= PF_VCPU; > /* KVM does not hold any references to rcu protected data when it > * switches CPU into a guest mode. In fact switching to a guest mode > @@ -751,7 +755,11 @@ static inline void kvm_guest_enter(void) > > static inline void kvm_guest_exit(void) > { > - vtime_account(current); > + /* > + * This is running in ioctl context so we can avoid > + * the call to vtime_account() with its unnecessary idle check. > + */ > + vtime_account_system(current); > current->flags &= ~PF_VCPU; > } > > -- > 1.7.5.4 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

