On Thu, 15 Sep 2016 18:31:59 +0530
Madhavan Srinivasan <ma...@linux.vnet.ibm.com> wrote:

> Currently soft_enabled is used as the flag to determine
> the interrupt state. Patch extends the soft_enabled
> to be used as a mask instead of a flag.

This should be the title of the patch, IMO. Introducing the new
mask bit is incidental (and could be moved to patch 11). The key
here of course is switching the tests from a flag to a mask.

Very cool that you got this all worked out without adding any
new instructions.

Reviewed-by: Nicholas Piggin <npig...@gmail.com>

> 
> Signed-off-by: Madhavan Srinivasan <ma...@linux.vnet.ibm.com>
> ---
>  arch/powerpc/include/asm/exception-64s.h | 4 ++--
>  arch/powerpc/include/asm/hw_irq.h        | 1 +
>  arch/powerpc/include/asm/irqflags.h      | 4 ++--
>  arch/powerpc/kernel/entry_64.S           | 4 ++--
>  arch/powerpc/kernel/exceptions-64e.S     | 6 +++---
>  5 files changed, 10 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/exception-64s.h 
> b/arch/powerpc/include/asm/exception-64s.h
> index dd3253bd0d8e..1eea4ab75607 100644
> --- a/arch/powerpc/include/asm/exception-64s.h
> +++ b/arch/powerpc/include/asm/exception-64s.h
> @@ -430,9 +430,9 @@ label##_relon_hv:                                         
> \
>  
>  #define __SOFTEN_TEST(h, vec)                                                
> \
>       lbz     r10,PACASOFTIRQEN(r13);                                 \
> -     cmpwi   r10,IRQ_DISABLE_MASK_LINUX;                                     
>                 \
> +     andi.   r10,r10,IRQ_DISABLE_MASK_LINUX;                         \
>       li      r10,SOFTEN_VALUE_##vec;                                 \
> -     beq     masked_##h##interrupt
> +     bne     masked_##h##interrupt
>  #define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec)
>  
>  #define SOFTEN_TEST_PR(vec)                                          \
> diff --git a/arch/powerpc/include/asm/hw_irq.h 
> b/arch/powerpc/include/asm/hw_irq.h
> index fd9b421f9020..245262c02bab 100644
> --- a/arch/powerpc/include/asm/hw_irq.h
> +++ b/arch/powerpc/include/asm/hw_irq.h
> @@ -32,6 +32,7 @@
>   */
>  #define IRQ_DISABLE_MASK_NONE                0
>  #define IRQ_DISABLE_MASK_LINUX               1
> +#define IRQ_DISABLE_MASK_PMU         2
>  
>  #endif /* CONFIG_PPC64 */
>  
> diff --git a/arch/powerpc/include/asm/irqflags.h 
> b/arch/powerpc/include/asm/irqflags.h
> index d0ed2a7d7d10..9ff09747a226 100644
> --- a/arch/powerpc/include/asm/irqflags.h
> +++ b/arch/powerpc/include/asm/irqflags.h
> @@ -48,11 +48,11 @@
>  #define RECONCILE_IRQ_STATE(__rA, __rB)              \
>       lbz     __rA,PACASOFTIRQEN(r13);        \
>       lbz     __rB,PACAIRQHAPPENED(r13);      \
> -     cmpwi   cr0,__rA,IRQ_DISABLE_MASK_LINUX;\
> +     andi.   __rA,__rA,IRQ_DISABLE_MASK_LINUX;\
>       li      __rA,IRQ_DISABLE_MASK_LINUX;    \
>       ori     __rB,__rB,PACA_IRQ_HARD_DIS;    \
>       stb     __rB,PACAIRQHAPPENED(r13);      \
> -     beq     44f;                            \
> +     bne     44f;                            \
>       stb     __rA,PACASOFTIRQEN(r13);        \
>       TRACE_DISABLE_INTS;                     \
>  44:
> diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
> index 879aeb11ad29..533e363914a9 100644
> --- a/arch/powerpc/kernel/entry_64.S
> +++ b/arch/powerpc/kernel/entry_64.S
> @@ -764,8 +764,8 @@ restore:
>        */
>       ld      r5,SOFTE(r1)
>       lbz     r6,PACASOFTIRQEN(r13)
> -     cmpwi   cr0,r5,IRQ_DISABLE_MASK_LINUX
> -     beq     restore_irq_off
> +     andi.   r5,r5,IRQ_DISABLE_MASK_LINUX
> +     bne     restore_irq_off
>  
>       /* We are enabling, were we already enabled ? Yes, just return */
>       cmpwi   cr0,r6,IRQ_DISABLE_MASK_NONE
> diff --git a/arch/powerpc/kernel/exceptions-64e.S 
> b/arch/powerpc/kernel/exceptions-64e.S
> index 5c628b5696f6..8e40df2c2f30 100644
> --- a/arch/powerpc/kernel/exceptions-64e.S
> +++ b/arch/powerpc/kernel/exceptions-64e.S
> @@ -212,8 +212,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
>       /* Interrupts had better not already be enabled... */
>       twnei   r6,IRQ_DISABLE_MASK_LINUX
>  
> -     cmpwi   cr0,r5,IRQ_DISABLE_MASK_LINUX
> -     beq     1f
> +     andi.   r5,r5,IRQ_DISABLE_MASK_LINUX
> +     bne     1f
>  
>       TRACE_ENABLE_INTS
>       stb     r5,PACASOFTIRQEN(r13)
> @@ -352,7 +352,7 @@ ret_from_mc_except:
>  
>  #define PROLOG_ADDITION_MASKABLE_GEN(n)                                      
>     \
>       lbz     r10,PACASOFTIRQEN(r13); /* are irqs soft-disabled ? */      \
> -     cmpwi   cr0,r10,IRQ_DISABLE_MASK_LINUX;/* yes -> go out of line */ \
> +     andi.   r10,r10,IRQ_DISABLE_MASK_LINUX;/* yes -> go out of line */ \
>       beq     masked_interrupt_book3e_##n
>  
>  #define PROLOG_ADDITION_2REGS_GEN(n)                                     \

Reply via email to