[PATCH] powerpc/32bit,PREEMPT:Load TI_FLAGS to check NEED_RESCHED
Jain Priyanka-B32167
B32167 at freescale.com
Mon May 27 16:55:09 EST 2013
If we go some more lines up in the same file, the code is
resume_kernel:
/* check current_thread_info, _TIF_EMULATE_STACK_STORE */
CURRENT_THREAD_INFO(r9, r1)
lwz r8,TI_FLAGS(r9)
andis. r8,r8,_TIF_EMULATE_STACK_STORE at h
beq+ 1f
---
After execution of andis. Instruction, r8 contains logical AND result of r8 and _TIF_EMULATE_STACK_STORE and it also sets the condition register flag.
If beq+ is true, it will jump to label '1' which points to the code contained in the patch. In this particular scenario, r8 does not contains the appropriate value.
Regards
Priyanka
> -----Original Message-----
> From: tiejun.chen [mailto:tiejun.chen at windriver.com]
> Sent: Monday, May 27, 2013 12:15 PM
> To: Jain Priyanka-B32167
> Cc: linuxppc-dev at lists.ozlabs.org; Wood Scott-B07421
> Subject: Re: [PATCH] powerpc/32bit,PREEMPT:Load TI_FLAGS to check
> NEED_RESCHED
>
> On 05/27/2013 02:27 PM, Priyanka Jain wrote:
> > Add instruction to load TI_FLAGS in r8
> >
> > While returning from exception handling in case of PREEMPT enabled,
> > _TIF_NEED_RESCHED bit is checked in TI_FLAGS (thread_info flag) of
> > current task. Only if this bit is set, it should continue with the
> > process of calling preempt_schedule_irq() to schedule highest priority
> > task if available.
> >
> > Current code assumes that r8 contains TI_FLAGS and check this for
> > _TIF_NEED_RESCHED, but as r8 is modified in the code which executes
> > before
>
> Could you elaborate this scenario? As I take a look at this path:
>
> ...
> /* Clear _TIF_EMULATE_STACK_STORE flag */
> lis r11,_TIF_EMULATE_STACK_STORE at h
> addi r5,r9,TI_FLAGS
> 0: lwarx r8,0,r5
> andc r8,r8,r11
> #ifdef CONFIG_IBM405_ERR77
> dcbt 0,r5
> #endif
> stwcx. r8,0,r5
> bne- 0b
> 1:
>
> #ifdef CONFIG_PREEMPT
> /* check current_thread_info->preempt_count */
> lwz r0,TI_PREEMPT(r9)
> cmpwi 0,r0,0 /* if non-zero, just restore regs and
> return */
> bne restore
> andi. r8,r8,_TIF_NEED_RESCHED
> ...
>
> Where is R8 clobbered?
>
> Tiejun
>
> > this check, r8 no longer contains the expected TI_FLAGS information.
> >
> > As a result check for comparison with _TIF_NEED_RESCHED was failing
> > even if NEED_RESCHED bit is set in the current thread_info flag. Due
> > to this,
> > preempt_schedule_irq() and in turn scheduler was not getting called
> > even if highest priority task is ready for execution.
> >
> >
> > Signed-off-by: Priyanka Jain <Priyanka.Jain at freescale.com>
> > ---
> > arch/powerpc/kernel/entry_32.S | 1 +
> > 1 files changed, 1 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/powerpc/kernel/entry_32.S
> > b/arch/powerpc/kernel/entry_32.S index d22e73e..0239c7f 100644
> > --- a/arch/powerpc/kernel/entry_32.S
> > +++ b/arch/powerpc/kernel/entry_32.S
> > @@ -887,6 +887,7 @@ resume_kernel:
> > #ifdef CONFIG_PREEMPT
> > /* check current_thread_info->preempt_count */
> > lwz r0,TI_PREEMPT(r9)
> > + lwz r8,TI_FLAGS(r9)
> > cmpwi 0,r0,0 /* if non-zero, just restore regs and
> return */
> > bne restore
> > andi. r8,r8,_TIF_NEED_RESCHED
> >
>
More information about the Linuxppc-dev
mailing list