On 05/03/2013 11:11:10 AM, Mihai Caraman wrote:
A change in the generic code highlighted that we were running with IRQs
(soft) enabled on Book3E 64-bit when trying to restart interrupts from
handle_exit(). This is a lesson to configure lockdep often :)

There is no reason to exit guest with soft_enabled == 1, a local_irq_enable() call will do this for us so get rid of kvmppc_layz_ee() calls. With this fix we eliminate irqs_disabled() warnings and some guest and host hangs revealed
under stress tests, but guests still exhibit some unresponsiveness.

The unresponsiveness has to do with the fact that arch_local_irq_restore()
does not guarantees to hard enable interrupts.

Could you elaborate? If the saved IRQ state was "enabled", why wouldn't arch_local_irq_restore() hard-enable IRQs? The last thing it does is __hard_irq_enable().

Where is the arch_local_irq_restore() instance you're talking about?

To do so replace exception
function calls like timer_interrupt() with irq_happened flags. The
local_irq_enable() call takes care of replaying them and lets the interrupts
hard enabled.

Not sure what you mean by "lets the interrupts hard enabled"... Do you mean the EE bit in regs->msr, as opposed to the EE bit in the current MSR?

Signed-off-by: Mihai Caraman <mihai.cara...@freescale.com>
---
 arch/powerpc/kvm/booke.c |    9 +++------
 1 files changed, 3 insertions(+), 6 deletions(-)

diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index 1020119..82f155e 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -673,7 +673,6 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
                ret = s;
                goto out;
        }
-       kvmppc_lazy_ee_enable();

        kvm_guest_enter();

@@ -789,16 +788,16 @@ static void kvmppc_restart_interrupt(struct kvm_vcpu *vcpu,
        switch (exit_nr) {
        case BOOKE_INTERRUPT_EXTERNAL:
                kvmppc_fill_pt_regs(&regs);
-               do_IRQ(&regs);
+               local_paca->irq_happened |= PACA_IRQ_EE;
                break;
        case BOOKE_INTERRUPT_DECREMENTER:
                kvmppc_fill_pt_regs(&regs);
-               timer_interrupt(&regs);
+               local_paca->irq_happened |= PACA_IRQ_DEC;
                break;
 #if defined(CONFIG_PPC_FSL_BOOK3E) || defined(CONFIG_PPC_BOOK3E_64)
        case BOOKE_INTERRUPT_DOORBELL:
                kvmppc_fill_pt_regs(&regs);
-               doorbell_exception(&regs);
+               local_paca->irq_happened |= PACA_IRQ_DBELL;
                break;
 #endif

Aren't you breaking 32-bit here?

-Scott
--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to