diff mbox

[2/2] powerpc/book3e-64: reraise doorbell when masked by soft-irq-disable

Message ID 20110520190047.GB7058@schlenkerla.am.freescale.net (mailing list archive)
State Changes Requested
Delegated to: Benjamin Herrenschmidt
Headers show

Commit Message

Scott Wood May 20, 2011, 7 p.m. UTC
Signed-off-by: Scott Wood <scottwood@freescale.com>
---
 arch/powerpc/kernel/exceptions-64e.S |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletions(-)

Comments

Benjamin Herrenschmidt May 20, 2011, 10:32 p.m. UTC | #1
On Fri, 2011-05-20 at 14:00 -0500, Scott Wood wrote:
> Signed-off-by: Scott Wood <scottwood@freescale.com>
> ---
>  arch/powerpc/kernel/exceptions-64e.S |   22 +++++++++++++++++++++-
>  1 files changed, 21 insertions(+), 1 deletions(-)

You can probably remove the doorbell re-check when enabling interrupts
now, can't you ?

Cheers,
Ben.

> diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
> index b60f49e..87ca569 100644
> --- a/arch/powerpc/kernel/exceptions-64e.S
> +++ b/arch/powerpc/kernel/exceptions-64e.S
> @@ -123,6 +123,12 @@
>  	std	r14,PACA_EXMC+EX_R14(r13);				    \
>  	std	r15,PACA_EXMC+EX_R15(r13)
>  
> +#define PROLOG_ADDITION_DOORBELL_GEN					    \
> +	lbz	r11,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */	    \
> +	cmpwi	cr0,r11,0;		/* yes -> go out of line */	    \
> +	beq	masked_doorbell_book3e;
> +
> +
>  /* Core exception code for all exceptions except TLB misses.
>   * XXX: Needs to make SPRN_SPRG_GEN depend on exception type
>   */
> @@ -466,7 +472,13 @@ kernel_dbg_exc:
>  	MASKABLE_EXCEPTION(0x260, perfmon, .performance_monitor_exception, ACK_NONE)
>  
>  /* Doorbell interrupt */
> -	MASKABLE_EXCEPTION(0x2070, doorbell, .doorbell_exception, ACK_NONE)
> +	START_EXCEPTION(doorbell)
> +	NORMAL_EXCEPTION_PROLOG(0x2070, PROLOG_ADDITION_DOORBELL)
> +	EXCEPTION_COMMON(0x2070, PACA_EXGEN, INTS_DISABLE_ALL)
> +	CHECK_NAPPING()
> +	addi	r3,r1,STACK_FRAME_OVERHEAD
> +	bl	.doorbell_exception
> +	b	.ret_from_except_lite;
>  
>  /* Doorbell critical Interrupt */
>  	START_EXCEPTION(doorbell_crit);
> @@ -521,8 +533,16 @@ kernel_dbg_exc:
>   * An interrupt came in while soft-disabled; clear EE in SRR1,
>   * clear paca->hard_enabled and return.
>   */
> +masked_doorbell_book3e:
> +	mtcr	r10
> +	/* Resend the doorbell to fire again when ints enabled */
> +	mfspr	r10,SPRN_PIR
> +	PPC_MSGSND(r10)
> +	b	masked_interrupt_book3e_common
> +
>  masked_interrupt_book3e:
>  	mtcr	r10
> +masked_interrupt_book3e_common:
>  	stb	r11,PACAHARDIRQEN(r13)
>  	mfspr	r10,SPRN_SRR1
>  	rldicl	r11,r10,48,1		/* clear MSR_EE */
Scott Wood May 23, 2011, 8:26 p.m. UTC | #2
On Sat, 21 May 2011 08:32:58 +1000
Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:

> On Fri, 2011-05-20 at 14:00 -0500, Scott Wood wrote:
> > Signed-off-by: Scott Wood <scottwood@freescale.com>
> > ---
> >  arch/powerpc/kernel/exceptions-64e.S |   22 +++++++++++++++++++++-
> >  1 files changed, 21 insertions(+), 1 deletions(-)
> 
> You can probably remove the doorbell re-check when enabling interrupts
> now, can't you ?

Ah, so that's how it currently gets away without re-raising when the
interrupt happens. :-)

I'll remove it.

-Scott
Benjamin Herrenschmidt May 23, 2011, 8:51 p.m. UTC | #3
On Mon, 2011-05-23 at 15:26 -0500, Scott Wood wrote:
> On Sat, 21 May 2011 08:32:58 +1000
> Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:
> 
> > On Fri, 2011-05-20 at 14:00 -0500, Scott Wood wrote:
> > > Signed-off-by: Scott Wood <scottwood@freescale.com>
> > > ---
> > >  arch/powerpc/kernel/exceptions-64e.S |   22 +++++++++++++++++++++-
> > >  1 files changed, 21 insertions(+), 1 deletions(-)
> > 
> > You can probably remove the doorbell re-check when enabling interrupts
> > now, can't you ?
> 
> Ah, so that's how it currently gets away without re-raising when the
> interrupt happens. :-)
> 
> I'll remove it.

Yup, I was too lazy to make a special case in the exception handlers :-)

Cheers,
Ben.
Benjamin Herrenschmidt June 17, 2011, 5:12 a.m. UTC | #4
On Tue, 2011-05-24 at 06:51 +1000, Benjamin Herrenschmidt wrote:
> On Mon, 2011-05-23 at 15:26 -0500, Scott Wood wrote:
> > On Sat, 21 May 2011 08:32:58 +1000
> > Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:
> > 
> > > On Fri, 2011-05-20 at 14:00 -0500, Scott Wood wrote:
> > > > Signed-off-by: Scott Wood <scottwood@freescale.com>
> > > > ---
> > > >  arch/powerpc/kernel/exceptions-64e.S |   22 +++++++++++++++++++++-
> > > >  1 files changed, 21 insertions(+), 1 deletions(-)
> > > 
> > > You can probably remove the doorbell re-check when enabling interrupts
> > > now, can't you ?
> > 
> > Ah, so that's how it currently gets away without re-raising when the
> > interrupt happens. :-)
> > 
> > I'll remove it.
> 
> Yup, I was too lazy to make a special case in the exception handlers :-)

Are you going to send a re-spin ?

Cheers,
Ben.
Scott Wood June 17, 2011, 4:02 p.m. UTC | #5
On Fri, 17 Jun 2011 15:12:00 +1000
Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:

> On Tue, 2011-05-24 at 06:51 +1000, Benjamin Herrenschmidt wrote:
> > On Mon, 2011-05-23 at 15:26 -0500, Scott Wood wrote:
> > > On Sat, 21 May 2011 08:32:58 +1000
> > > Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:
> > > 
> > > > On Fri, 2011-05-20 at 14:00 -0500, Scott Wood wrote:
> > > > > Signed-off-by: Scott Wood <scottwood@freescale.com>
> > > > > ---
> > > > >  arch/powerpc/kernel/exceptions-64e.S |   22 +++++++++++++++++++++-
> > > > >  1 files changed, 21 insertions(+), 1 deletions(-)
> > > > 
> > > > You can probably remove the doorbell re-check when enabling interrupts
> > > > now, can't you ?
> > > 
> > > Ah, so that's how it currently gets away without re-raising when the
> > > interrupt happens. :-)
> > > 
> > > I'll remove it.
> > 
> > Yup, I was too lazy to make a special case in the exception handlers :-)
> 
> Are you going to send a re-spin ?

Ah, yes, forgot about this one. :-)

-Scott
diff mbox

Patch

diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index b60f49e..87ca569 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -123,6 +123,12 @@ 
 	std	r14,PACA_EXMC+EX_R14(r13);				    \
 	std	r15,PACA_EXMC+EX_R15(r13)
 
+#define PROLOG_ADDITION_DOORBELL_GEN					    \
+	lbz	r11,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */	    \
+	cmpwi	cr0,r11,0;		/* yes -> go out of line */	    \
+	beq	masked_doorbell_book3e;
+
+
 /* Core exception code for all exceptions except TLB misses.
  * XXX: Needs to make SPRN_SPRG_GEN depend on exception type
  */
@@ -466,7 +472,13 @@  kernel_dbg_exc:
 	MASKABLE_EXCEPTION(0x260, perfmon, .performance_monitor_exception, ACK_NONE)
 
 /* Doorbell interrupt */
-	MASKABLE_EXCEPTION(0x2070, doorbell, .doorbell_exception, ACK_NONE)
+	START_EXCEPTION(doorbell)
+	NORMAL_EXCEPTION_PROLOG(0x2070, PROLOG_ADDITION_DOORBELL)
+	EXCEPTION_COMMON(0x2070, PACA_EXGEN, INTS_DISABLE_ALL)
+	CHECK_NAPPING()
+	addi	r3,r1,STACK_FRAME_OVERHEAD
+	bl	.doorbell_exception
+	b	.ret_from_except_lite;
 
 /* Doorbell critical Interrupt */
 	START_EXCEPTION(doorbell_crit);
@@ -521,8 +533,16 @@  kernel_dbg_exc:
  * An interrupt came in while soft-disabled; clear EE in SRR1,
  * clear paca->hard_enabled and return.
  */
+masked_doorbell_book3e:
+	mtcr	r10
+	/* Resend the doorbell to fire again when ints enabled */
+	mfspr	r10,SPRN_PIR
+	PPC_MSGSND(r10)
+	b	masked_interrupt_book3e_common
+
 masked_interrupt_book3e:
 	mtcr	r10
+masked_interrupt_book3e_common:
 	stb	r11,PACAHARDIRQEN(r13)
 	mfspr	r10,SPRN_SRR1
 	rldicl	r11,r10,48,1		/* clear MSR_EE */