Hi Viral, On Wed, Jan 5, 2011 at 2:23 PM, Viral Mehta <Viral.Mehta@lntinfotech.com> wrote:
Hi ,
I need your help to solve below confusion.
1. I know that spin_lock_irqsave, disables premption and local_irq. 2. There is some below piece of kernel code running on Quad core Machine. spin_lock_irqsave(&lock, flags); some_large_critical_section //sleep of 5 minutes //I know there should be as small as possible task in critical section // treat this as an example only
Note that you can't sleep while you hold a spinlock. You're not allowed to perform any type of blocking operations. If you're holding the spinlock for any significant length of time, then you're using the wrong design.
spin_lock_irqrestore(); 3. One of the CPU core tries to execute this code and so acquires the lock. 4. Now, second core is also goes to execute same piece of code and so will keep spinning for lock
Now, the question is Will EVER second CPU core get chance to execute another task ?
Not while it's holding the spinlock or waiting for the spinlock.
Ever if timeslice is over for the current task ?
The time tick interrupt is what determines when the timeslice is over. Since you have interrupts disabled, the timer interrupt can't happen.
What if scheduler code is running on CPU core-3 and sees that timeslice for task running on CPU core-2 has expired ?
Each core only considers the timeslices for its own core.
I guess timeslice expire case is not as same as preemption. Or may be I am terribly wrong.
You shouldn't be holding a spinlock for periods of time approaching the length of a timeslice. The timer interrupt is what determines the end of a timeslice. No timer interrupt, no end of a timeslice. Preemption is also triggered by the timer interrupt, or by releasing a resource that a higher priority task is waiting for. Dave Hylands