* [PATCHv2 0/2] KVM: micro-optimization and interrupt disabling
@ 2015-04-30 11:43 Christian Borntraeger
2015-04-30 11:43 ` [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} Christian Borntraeger
2015-04-30 11:43 ` [PATCH 2/2] KVM: arm/mips/x86/power use __kvm_guest_{enter|exit} Christian Borntraeger
0 siblings, 2 replies; 9+ messages in thread
From: Christian Borntraeger @ 2015-04-30 11:43 UTC (permalink / raw)
To: Paolo Bonzini
Cc: linux-mips, KVM, kvm-ppc, Christian Borntraeger, Cornelia Huck,
kvmarm
This rework allows to avoid some cycles by not disabling interrupts
twice.
Christian Borntraeger (2):
KVM: provide irq_unsafe kvm_guest_{enter|exit}
KVM: arm/mips/x86/power use __kvm_guest_{enter|exit}
arch/arm/kvm/arm.c | 4 ++--
arch/mips/kvm/mips.c | 4 ++--
arch/powerpc/kvm/powerpc.c | 2 +-
arch/s390/kvm/kvm-s390.c | 10 ++++++----
arch/x86/kvm/x86.c | 2 +-
include/linux/kvm_host.h | 27 ++++++++++++++++++---------
6 files changed, 30 insertions(+), 19 deletions(-)
--
2.3.0
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} 2015-04-30 11:43 [PATCHv2 0/2] KVM: micro-optimization and interrupt disabling Christian Borntraeger @ 2015-04-30 11:43 ` Christian Borntraeger 2015-04-30 11:50 ` Paolo Bonzini 2015-04-30 11:43 ` [PATCH 2/2] KVM: arm/mips/x86/power use __kvm_guest_{enter|exit} Christian Borntraeger 1 sibling, 1 reply; 9+ messages in thread From: Christian Borntraeger @ 2015-04-30 11:43 UTC (permalink / raw) To: Paolo Bonzini Cc: KVM, kvm-ppc, kvmarm, linux-mips, Cornelia Huck, Alexander Graf, Christian Borntraeger Several kvm architectures disable interrupts before kvm_guest_enter. kvm_guest_enter then uses local_irq_save/restore to disable interrupts again or for the first time. Lets provide underscore versions of kvm_guest_{enter|exit} that assume being called locked. kvm_guest_enter now disables interrupts for the full function and thus we can remove the check for preemptible. This patch then adopts s390/kvm to use local_irq_disable/enable calls which are slighty cheaper that local_irq_save/restore and call these new functions. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> --- arch/s390/kvm/kvm-s390.c | 10 ++++++---- include/linux/kvm_host.h | 27 ++++++++++++++++++--------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 46f37df..c25d4e5 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -2010,12 +2010,14 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) * As PF_VCPU will be used in fault handler, between * guest_enter and guest_exit should be no uaccess. */ - preempt_disable(); - kvm_guest_enter(); - preempt_enable(); + local_irq_disable(); + __kvm_guest_enter(); + local_irq_enable(); exit_reason = sie64a(vcpu->arch.sie_block, vcpu->run->s.regs.gprs); - kvm_guest_exit(); + local_irq_disable(); + __kvm_guest_exit(); + local_irq_enable(); vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); rc = vcpu_post_run(vcpu, exit_reason); diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index d12b210..2d3b3ce 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -749,16 +749,10 @@ static inline void kvm_iommu_unmap_pages(struct kvm *kvm, } #endif -static inline void kvm_guest_enter(void) +/* must be called with irqs disabled */ +static inline void __kvm_guest_enter(void) { - unsigned long flags; - - BUG_ON(preemptible()); - - local_irq_save(flags); guest_enter(); - local_irq_restore(flags); - /* 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 * is very similar to exiting to userspace from rcu point of view. In @@ -769,12 +763,27 @@ static inline void kvm_guest_enter(void) rcu_virt_note_context_switch(smp_processor_id()); } +/* must be called with irqs disabled */ +static inline void __kvm_guest_exit(void) +{ + guest_exit(); +} + +static inline void kvm_guest_enter(void) +{ + unsigned long flags; + + local_irq_save(flags); + __kvm_guest_enter(); + local_irq_restore(flags); +} + static inline void kvm_guest_exit(void) { unsigned long flags; local_irq_save(flags); - guest_exit(); + __kvm_guest_exit(); local_irq_restore(flags); } -- 2.3.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} 2015-04-30 11:43 ` [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} Christian Borntraeger @ 2015-04-30 11:50 ` Paolo Bonzini 2015-04-30 12:01 ` Christian Borntraeger 0 siblings, 1 reply; 9+ messages in thread From: Paolo Bonzini @ 2015-04-30 11:50 UTC (permalink / raw) To: Christian Borntraeger Cc: KVM, kvm-ppc, kvmarm, linux-mips, Cornelia Huck, Alexander Graf On 30/04/2015 13:43, Christian Borntraeger wrote: > +/* must be called with irqs disabled */ > +static inline void __kvm_guest_enter(void) > { > - unsigned long flags; > - > - BUG_ON(preemptible()); Please keep the BUG_ON() in kvm_guest_enter. Otherwise looks good, thanks! Paolo > - local_irq_save(flags); > guest_enter(); > - local_irq_restore(flags); > - > /* 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 > * is very similar to exiting to userspace from rcu point of view. In > @@ -769,12 +763,27 @@ static inline void kvm_guest_enter(void) > rcu_virt_note_context_switch(smp_processor_id()); > } > > +/* must be called with irqs disabled */ > +static inline void __kvm_guest_exit(void) > +{ > + guest_exit(); > +} > + > +static inline void kvm_guest_enter(void) > +{ > + unsigned long flags; > + > + local_irq_save(flags); > + __kvm_guest_enter(); > + local_irq_restore(flags); > +} > + ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} 2015-04-30 11:50 ` Paolo Bonzini @ 2015-04-30 12:01 ` Christian Borntraeger 2015-04-30 12:02 ` Christian Borntraeger 0 siblings, 1 reply; 9+ messages in thread From: Christian Borntraeger @ 2015-04-30 12:01 UTC (permalink / raw) To: Paolo Bonzini Cc: KVM, kvm-ppc, kvmarm, linux-mips, Cornelia Huck, Alexander Graf Am 30.04.2015 um 13:50 schrieb Paolo Bonzini: > > > On 30/04/2015 13:43, Christian Borntraeger wrote: >> +/* must be called with irqs disabled */ >> +static inline void __kvm_guest_enter(void) >> { >> - unsigned long flags; >> - >> - BUG_ON(preemptible()); > > Please keep the BUG_ON() in kvm_guest_enter. Otherwise looks good, thanks! would be BUG_ON(!irqs_disabled()) then? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} 2015-04-30 12:01 ` Christian Borntraeger @ 2015-04-30 12:02 ` Christian Borntraeger 2015-04-30 12:07 ` Christian Borntraeger 0 siblings, 1 reply; 9+ messages in thread From: Christian Borntraeger @ 2015-04-30 12:02 UTC (permalink / raw) To: Paolo Bonzini Cc: KVM, kvm-ppc, kvmarm, linux-mips, Cornelia Huck, Alexander Graf Am 30.04.2015 um 14:01 schrieb Christian Borntraeger: > Am 30.04.2015 um 13:50 schrieb Paolo Bonzini: >> >> >> On 30/04/2015 13:43, Christian Borntraeger wrote: >>> +/* must be called with irqs disabled */ >>> +static inline void __kvm_guest_enter(void) >>> { >>> - unsigned long flags; >>> - >>> - BUG_ON(preemptible()); >> >> Please keep the BUG_ON() in kvm_guest_enter. Otherwise looks good, thanks! Ah, you mean have the BUG_ON in the non underscore version? Yes, makes sense. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} 2015-04-30 12:02 ` Christian Borntraeger @ 2015-04-30 12:07 ` Christian Borntraeger 2015-04-30 12:28 ` Paolo Bonzini 0 siblings, 1 reply; 9+ messages in thread From: Christian Borntraeger @ 2015-04-30 12:07 UTC (permalink / raw) To: Paolo Bonzini; +Cc: linux-mips, KVM, kvm-ppc, Cornelia Huck, kvmarm Am 30.04.2015 um 14:02 schrieb Christian Borntraeger: > Am 30.04.2015 um 14:01 schrieb Christian Borntraeger: >> Am 30.04.2015 um 13:50 schrieb Paolo Bonzini: >>> >>> >>> On 30/04/2015 13:43, Christian Borntraeger wrote: >>>> +/* must be called with irqs disabled */ >>>> +static inline void __kvm_guest_enter(void) >>>> { >>>> - unsigned long flags; >>>> - >>>> - BUG_ON(preemptible()); >>> >>> Please keep the BUG_ON() in kvm_guest_enter. Otherwise looks good, thanks! > > Ah, you mean have the BUG_ON in the non underscore version? Yes, makes sense. Hmmm, too quick. the BUG_ON was there to make sure that rcu_virt_note_context_switch is safe. The reworked code pulls the rcu_virt_note_context_switch within the irq_save section so we no longer need this BUG_ON, no? Christian ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} 2015-04-30 12:07 ` Christian Borntraeger @ 2015-04-30 12:28 ` Paolo Bonzini 0 siblings, 0 replies; 9+ messages in thread From: Paolo Bonzini @ 2015-04-30 12:28 UTC (permalink / raw) To: Christian Borntraeger; +Cc: Cornelia Huck, linux-mips, kvm-ppc, KVM, kvmarm On 30/04/2015 14:07, Christian Borntraeger wrote: >>>>> >>>> +static inline void __kvm_guest_enter(void) >>>>> >>>> { >>>>> >>>> - unsigned long flags; >>>>> >>>> - >>>>> >>>> - BUG_ON(preemptible()); >>>> >>> >>>> >>> Please keep the BUG_ON() in kvm_guest_enter. Otherwise looks good, thanks! >> > >> > Ah, you mean have the BUG_ON in the non underscore version? Yes, makes sense. > Hmmm, too quick. > the BUG_ON was there to make sure that rcu_virt_note_context_switch is safe. > The reworked code pulls the rcu_virt_note_context_switch within the irq_save > section so we no longer need this BUG_ON, no? Right. I can apply the patches then! Paolo ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] KVM: arm/mips/x86/power use __kvm_guest_{enter|exit} 2015-04-30 11:43 [PATCHv2 0/2] KVM: micro-optimization and interrupt disabling Christian Borntraeger 2015-04-30 11:43 ` [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} Christian Borntraeger @ 2015-04-30 11:43 ` Christian Borntraeger 2015-05-05 12:08 ` Christoffer Dall 1 sibling, 1 reply; 9+ messages in thread From: Christian Borntraeger @ 2015-04-30 11:43 UTC (permalink / raw) To: Paolo Bonzini Cc: KVM, kvm-ppc, kvmarm, linux-mips, Cornelia Huck, Alexander Graf, Christian Borntraeger Use __kvm_guest_{enter|exit} instead of kvm_guest_{enter|exit} where interrupts are disabled. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> --- arch/arm/kvm/arm.c | 4 ++-- arch/mips/kvm/mips.c | 4 ++-- arch/powerpc/kvm/powerpc.c | 2 +- arch/x86/kvm/x86.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 5560f74..050c274 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -533,13 +533,13 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) * Enter the guest */ trace_kvm_entry(*vcpu_pc(vcpu)); - kvm_guest_enter(); + __kvm_guest_enter(); vcpu->mode = IN_GUEST_MODE; ret = kvm_call_hyp(__kvm_vcpu_run, vcpu); vcpu->mode = OUTSIDE_GUEST_MODE; - kvm_guest_exit(); + __kvm_guest_exit(); trace_kvm_exit(kvm_vcpu_trap_get_class(vcpu), *vcpu_pc(vcpu)); /* * We may have taken a host interrupt in HYP mode (ie diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c index c9eccf5..539c12c 100644 --- a/arch/mips/kvm/mips.c +++ b/arch/mips/kvm/mips.c @@ -388,7 +388,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) kvm_mips_deliver_interrupts(vcpu, kvm_read_c0_guest_cause(vcpu->arch.cop0)); - kvm_guest_enter(); + __kvm_guest_enter(); /* Disable hardware page table walking while in guest */ htw_stop(); @@ -398,7 +398,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) /* Re-enable HTW before enabling interrupts */ htw_start(); - kvm_guest_exit(); + __kvm_guest_exit(); local_irq_enable(); if (vcpu->sigset_active) diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 27c0fac..e5c0be5 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -115,7 +115,7 @@ int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu) continue; } - kvm_guest_enter(); + __kvm_guest_enter(); return 1; } diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 32bf19e..eb8aa96 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -6292,7 +6292,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) if (req_immediate_exit) smp_send_reschedule(vcpu->cpu); - kvm_guest_enter(); + __kvm_guest_enter(); if (unlikely(vcpu->arch.switch_db_regs)) { set_debugreg(0, 7); -- 2.3.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] KVM: arm/mips/x86/power use __kvm_guest_{enter|exit} 2015-04-30 11:43 ` [PATCH 2/2] KVM: arm/mips/x86/power use __kvm_guest_{enter|exit} Christian Borntraeger @ 2015-05-05 12:08 ` Christoffer Dall 0 siblings, 0 replies; 9+ messages in thread From: Christoffer Dall @ 2015-05-05 12:08 UTC (permalink / raw) To: Christian Borntraeger Cc: Paolo Bonzini, KVM, kvm-ppc, kvmarm, linux-mips, Cornelia Huck, Alexander Graf On Thu, Apr 30, 2015 at 01:43:31PM +0200, Christian Borntraeger wrote: > Use __kvm_guest_{enter|exit} instead of kvm_guest_{enter|exit} > where interrupts are disabled. > > Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> For the ARM part: Acked-by: Christoffer Dall <christoffer.dall@linaro.org> ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2015-05-05 12:08 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-04-30 11:43 [PATCHv2 0/2] KVM: micro-optimization and interrupt disabling Christian Borntraeger
2015-04-30 11:43 ` [PATCH 1/2] KVM: provide irq_unsafe kvm_guest_{enter|exit} Christian Borntraeger
2015-04-30 11:50 ` Paolo Bonzini
2015-04-30 12:01 ` Christian Borntraeger
2015-04-30 12:02 ` Christian Borntraeger
2015-04-30 12:07 ` Christian Borntraeger
2015-04-30 12:28 ` Paolo Bonzini
2015-04-30 11:43 ` [PATCH 2/2] KVM: arm/mips/x86/power use __kvm_guest_{enter|exit} Christian Borntraeger
2015-05-05 12:08 ` Christoffer Dall
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox