From patchwork Fri Jan 4 19:40:50 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1/4] KVM: PPC: BookE: Allow irq deliveries to inject requests Date: Fri, 04 Jan 2013 09:40:50 -0000 From: Scott Wood X-Patchwork-Id: 209525 Message-Id: <1357328450.666.13@snotra> To: Alexander Graf Cc: , KVM list On 01/04/2013 11:36:37 AM, Alexander Graf wrote: > When injecting an interrupt into guest context, we usually don't need > to check for requests anymore. At least not until today. > > With the introduction of EPR, we will have to create a request when > the > guest has successfully accepted an external interrupt though. > > So we need to prepare the interrupt delivery to abort guest entry > gracefully. Otherwise we'd delay the EPR request. > > Signed-off-by: Alexander Graf > --- > arch/powerpc/kvm/booke.c | 14 ++++++++++---- > 1 files changed, 10 insertions(+), 4 deletions(-) > > diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c > index 69f1140..4ae83f9 100644 > --- a/arch/powerpc/kvm/booke.c > +++ b/arch/powerpc/kvm/booke.c > @@ -554,14 +554,16 @@ static void update_timer_ints(struct kvm_vcpu > *vcpu) > kvmppc_core_dequeue_watchdog(vcpu); > } > > -static void kvmppc_core_check_exceptions(struct kvm_vcpu *vcpu) > +static int kvmppc_core_check_exceptions(struct kvm_vcpu *vcpu) > { > unsigned long *pending = &vcpu->arch.pending_exceptions; > unsigned int priority; > + int r = 0; > > priority = __ffs(*pending); > while (priority < BOOKE_IRQPRIO_MAX) { > - if (kvmppc_booke_irqprio_deliver(vcpu, priority)) > + r = kvmppc_booke_irqprio_deliver(vcpu, priority); > + if (r) > break; > > priority = find_next_bit(pending, > @@ -571,15 +573,19 @@ static void kvmppc_core_check_exceptions(struct > kvm_vcpu *vcpu) > > /* Tell the guest about our interrupt status */ > vcpu->arch.shared->int_pending = !!*pending; > + > + return r > 1; > } It isn't until patch 3/4 that the reason for "r > 1" appears... Why not just: kvm_vcpu_block(vcpu); ...or if you really want to do it through return values, make it an enum rather than a magic "2". -Scott --- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 69f1140..964f447 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c @@ -581,6 +581,11 @@ int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu) kvmppc_core_check_exceptions(vcpu); + if (vcpu->requests) { + /* Exception delivery raised request; start over */ + return 1; + } + if (vcpu->arch.shared->msr & MSR_WE) { local_irq_enable();