Possible kernel stack overflow due to fast interrupts

Rick Tao tao_rick at yahoo.com
Sat Oct 16 06:13:14 EST 2010


You are exactly right! Ensuring interrupts would not cause more preemptions. 
Thanks for pointing it out.
Rick

--- On Thu, 10/14/10, Benjamin Herrenschmidt <benh at kernel.crashing.org> wrote:

> From: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> Subject: Re: Possible kernel stack overflow due to fast interrupts
> To: "Rick Tao" <tao_rick at yahoo.com>
> Cc: linuxppc-dev at lists.ozlabs.org
> Date: Thursday, October 14, 2010, 4:57 PM
> On Thu, 2010-10-14 at 13:45 -0700,
> Rick Tao wrote:
> > Hi, all,
> 
>  .../...
> 
> > In the context of task A
> > a. NIP would point to the instruction after
> switch_to(). 
> > b. MSR_EE is enabled in the call trace
> (finish_task_switch
> -->finish_lock_switch-->spin_unlock_irq)
> > c. do something that would trigger an interrupt later
> on (such as timer)
> > d. call schedule() for context switch to task B.
> >    In this step, 
> >      task B's stack is popped
> INT_FRAME_SIZE size for context restore.  
> >    Note that task B's ksp = X -
> INT_FRAME_SIZE
> > 
> > In the context of task B again
> > a1. similar to step "a" above
> >
> > b1. similar to step "b" above 
> > c1. interrupt occurs, go to step "1" above, and
> repeat!!!
> > 
> > As you can see, task B's kernel stack space is reduced
> by INT_FRAME_SIZE
> > on each loop. It will eventually overflow.
> 
> So if I follow you correctly, you are worried that by the
> time execution
> resumes in B, and before it pops the second frame off, it
> might get
> another interrupt and re-preempt...
> 
> Now unless I missed something, that cannot happen because
> preempt_schedule_irq() does increment the preempt count:
> 
>     add_preempt_count(PREEMPT_ACTIVE);
>     local_irq_enable();
>     schedule();
>     local_irq_disable();
>     sub_preempt_count(PREEMPT_ACTIVE);
> 
> Which means that it won't preempt again in
> finish_task_switch, and so
> will eventually come back, turn EE back off, and pop off
> the stack
> frame.
> 
> Or am I missing something ?
> 
> Cheers,
> Ben.
> 
> 
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
> 


      


More information about the Linuxppc-dev mailing list