<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:΢ÈíÑźÚ
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
<BR>&nbsp;<BR>
<DIV id=SkyDrivePlaceholder></DIV>
<DIV>&gt; Date: Wed, 4 Jul 2012 08:12:25 -0700<BR>&gt; Subject: Re: Why can not processes switch in atomic context?<BR>&gt; From: dhylands@gmail.com<BR>&gt; To: buyit@live.cn<BR>&gt; CC: mobile.parmenides@gmail.com; kernelnewbies@kernelnewbies.org<BR>&gt; <BR>&gt; Hi,<BR>&gt; <BR>&gt; On Wed, Jul 4, 2012 at 3:44 AM, ß®Ìì ²· &lt;buyit@live.cn&gt; wrote:<BR>&gt; &gt;<BR>&gt; &gt;<BR>&gt; &gt; ÔÚ 2012-7-3£¬22:26£¬"Parmenides" &lt;mobile.parmenides@gmail.com&gt; Ð´µÀ£º<BR>&gt; &gt;<BR>&gt; ...snip...<BR>&gt; &gt;&gt; 1. For the spinlock case, it is easy to get if preemption is allowed<BR>&gt; &gt;&gt; in critical section, the purpose of protection provided by spinlock<BR>&gt; &gt;&gt; can not be achieved readily.<BR>&gt; &gt;&gt;<BR>&gt; &gt; i think disable preemption in spinlock is not for safe, it is<BR>&gt; &gt; For efficiency. Spinlock should exit as soon as possible.<BR>&gt; &gt; If tank1 get spinlock and goto sleep for 100 seconds before<BR>&gt; &gt; Release spinlock, task2 which requests the same spinlock<BR>&gt; &gt; Should wait for 100 seconds, for this example, mutex should be used instead of spinlock.<BR>&gt; <BR>&gt; Unless, of course, the interrupt that fired tried to acquire the<BR>&gt; spinlock it preempted, in which case you would have deadlock, even on<BR>&gt; an SMP system, if the same processor happened to be used for both.<BR>&gt; </DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; we are talking about schedule in spinlock, but not the synchronization between</DIV>
<DIV>normal process and interrupt.</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in your example, it is kernel developer's responsibility to make this correct, this is</DIV>
<DIV>why kernel give us the API spin_lock_irqsave(). if normal process and interrupt handler</DIV>
<DIV>will acquire the same spinlock, please use spin_lock_irqsave() instead of spin_lock().</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>&gt; &gt;&gt; 2. For the interrupt context case, I think when processing interrupt,<BR>&gt; &gt;&gt; kernel can be preempted in principle. But, this really increases the<BR>&gt; &gt;&gt; interrupt processing time which further cause longer response time and<BR>&gt; &gt;&gt; data missing in device. Except that, is there any other reasons?<BR>&gt; &gt;<BR>&gt; &gt; You are right, kernel can schedule in interrupt context, but that will delay the completion of interrupt, which does not make sense, so kernel will not do like this.<BR>&gt; &gt; Note! Kernel can, but should not schedule in interrupt context.<BR>&gt; <BR>&gt; Scheduling in an interrupt can hang the system. Lets suppose that A<BR>&gt; acquires a resource, disabled interrupts and calls schedule. Then B<BR>&gt; gets scheduled and wants the resource that A is holding so it blocks.<BR>&gt; But since interrupts were disabled, the timer tick will never fire and<BR>&gt; you're back into a deadlock situation again.<BR>&gt; </DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp; in your&nbsp;example here, i think A is the interrupt handler,&nbsp;rather than a normal</DIV>
<DIV>task, because we are talking about scheduleing in interrupt&nbsp;handler. if A</DIV>
<DIV>calls schedule, the interrupted task, let's suppose it is usb task, will go</DIV>
<DIV>to sleep. let's suppose cpu0 handles the interrupt handler A, and usb task runs</DIV>
<DIV>on cpu0 also. after A go to sleep, which equals the usb task go to sleep, there </DIV>
<DIV>must be another new task will be waked up by function switch_to(), let's suppose</DIV>
<DIV>this lucky guy is BT task, the interrupt on cpu0 could be re-enalbed by function svc_exit() </DIV>
<DIV>before BT task(or some other tasks) runs.&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; i think disable interrupt on cpu0 inside A does not mean the interrupt can only be re-enabled by A. </DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp; i am not saying it is good to schedule inside interrupt handler, i just want to make it clear that</DIV>
<DIV>this can be done, but is not a good behavior and make no sense.</DIV>
<DIV>&nbsp;</DIV>
<DIV><BR>&gt; -- <BR>&gt; Dave Hylands<BR>&gt; Shuswap, BC, Canada<BR>&gt; http://www.davehylands.com<BR>&gt; <BR>&gt; _______________________________________________<BR>&gt; Kernelnewbies mailing list<BR>&gt; Kernelnewbies@kernelnewbies.org<BR>&gt; http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies<BR></DIV>                                               </div></body>
</html>