60 lines
1.6 KiB
Diff
60 lines
1.6 KiB
Diff
|
# HG changeset patch
|
||
|
# User Keir Fraser <keir.fraser@citrix.com>
|
||
|
# Date 1284795115 -3600
|
||
|
# Node ID ee3c640732311ef6bc5e2de56c3b4b753cb020fa
|
||
|
# Parent 632c02167f97bb2bd25571b2780425b9b75949b4
|
||
|
x86: irq_enter()/irq_exit() covers all of do_IRQ().
|
||
|
|
||
|
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
|
||
|
|
||
|
--- a/xen/arch/x86/irq.c
|
||
|
+++ b/xen/arch/x86/irq.c
|
||
|
@@ -535,6 +535,8 @@ asmlinkage void do_IRQ(struct cpu_user_r
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
+ irq_enter();
|
||
|
+
|
||
|
desc = irq_to_desc(irq);
|
||
|
|
||
|
spin_lock(&desc->lock);
|
||
|
@@ -568,14 +570,10 @@ asmlinkage void do_IRQ(struct cpu_user_r
|
||
|
desc->rl_quantum_start = now;
|
||
|
}
|
||
|
|
||
|
- irq_enter();
|
||
|
tsc_in = tb_init_done ? get_cycles() : 0;
|
||
|
__do_IRQ_guest(irq);
|
||
|
TRACE_3D(TRC_TRACE_IRQ, irq, tsc_in, get_cycles());
|
||
|
- irq_exit();
|
||
|
- spin_unlock(&desc->lock);
|
||
|
- set_irq_regs(old_regs);
|
||
|
- return;
|
||
|
+ goto out_no_end;
|
||
|
}
|
||
|
|
||
|
desc->status &= ~IRQ_REPLAY;
|
||
|
@@ -594,20 +592,20 @@ asmlinkage void do_IRQ(struct cpu_user_r
|
||
|
while ( desc->status & IRQ_PENDING )
|
||
|
{
|
||
|
desc->status &= ~IRQ_PENDING;
|
||
|
- irq_enter();
|
||
|
spin_unlock_irq(&desc->lock);
|
||
|
tsc_in = tb_init_done ? get_cycles() : 0;
|
||
|
action->handler(irq, action->dev_id, regs);
|
||
|
TRACE_3D(TRC_TRACE_IRQ, irq, tsc_in, get_cycles());
|
||
|
spin_lock_irq(&desc->lock);
|
||
|
- irq_exit();
|
||
|
}
|
||
|
|
||
|
desc->status &= ~IRQ_INPROGRESS;
|
||
|
|
||
|
out:
|
||
|
desc->handler->end(irq);
|
||
|
+ out_no_end:
|
||
|
spin_unlock(&desc->lock);
|
||
|
+ irq_exit();
|
||
|
set_irq_regs(old_regs);
|
||
|
}
|
||
|
|