Hi <div><br></div><div>I am running with preemption on. </div><div><br></div><div>Jeff, but when i tried this on x86 machine my kernel just froze. How is that happening?<br><br><div class="gmail_quote">On Fri, Nov 4, 2011 at 3:41 AM, Jeff Haran <span dir="ltr">&lt;<a href="mailto:jharan@bytemobile.com">jharan@bytemobile.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p><div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt"><div><div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt"> <a href="mailto:kernelnewbies-bounces@kernelnewbies.org" target="_blank">kernelnewbies-bounces@kernelnewbies.org</a> [mailto:<a href="mailto:kernelnewbies-bounces@kernelnewbies.org" target="_blank">kernelnewbies-bounces@kernelnewbies.org</a>] <b>On Behalf Of </b>Prajosh Premdas<br>
<b>Sent:</b> Wednesday, November 02, 2011 2:02 AM<br><b>To:</b> <a href="mailto:kernelnewbies@kernelnewbies.org" target="_blank">kernelnewbies@kernelnewbies.org</a><br><b>Subject:</b> spin_lock behavior<u></u><u></u></span></p>
</div></div><div><div class="h5"><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Hi <u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I wrote a sample module which looked like this and i expected the module to hang as i have used 2 spin_lock simultaneously. But i find the print after the second spin_lock being printed and the module works perfectly fine. Can any body please help me in understanding this? I got this problem from a driver i wrote and had a typo &quot;spin_lock&quot; instead of &quot;spin_unlock&quot; the driver worked fine and i caught the mistake only during a review <u></u><u></u></p>
</div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><div><p class="MsoNormal"><i>#include &lt;linux/module.h&gt;</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>#include &lt;linux/spinlock.h&gt;</i><u></u><u></u></p>
</div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><i>struct sp_q {</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>spinlock_t spinlock;</i><u></u><u></u></p></div><div><p class="MsoNormal">
<i>uint8_t data;</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>};</i><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><i>static int __init sp_lck_init(void)</i><u></u><u></u></p>
</div><div><p class="MsoNormal"><i>{</i><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><i>   struct sp_q test;</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>   </i><u></u><u></u></p>
</div><div><p class="MsoNormal"><i>   /* Spin lock Init */</i><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><i>   spin_lock_init(&amp;test.spinlock);</i><u></u><u></u></p>
</div><div><p class="MsoNormal"><i>    </i><u></u><u></u></p></div><div><p class="MsoNormal"><i>   printk(&quot;&lt;1&gt;Test start\n&quot;);</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>   </i><u></u><u></u></p>
</div><div><p class="MsoNormal"><i>   spin_lock(&amp;test.spinlock);</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>   test.data = 0;   </i><u></u><u></u></p></div><div><p class="MsoNormal"><i>   spin_lock(&amp;test.spinlock);   </i><u></u><u></u></p>
</div><div><p class="MsoNormal"><i>   </i><u></u><u></u></p></div><div><p class="MsoNormal"><i>   printk(&quot;&lt;1&gt;How come???\n&quot;);</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>   return 0;</i><u></u><u></u></p>
</div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><i>}</i><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><i>static void __exit sp_lck_exit(void)</i><u></u><u></u></p>
</div><div><p class="MsoNormal"><i>{</i><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><i>}</i><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div>
<div><p class="MsoNormal"><i>module_init(sp_lck_init);</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>module_exit(sp_lck_exit);</i><u></u><u></u></p></div><div><p class="MsoNormal"><i>MODULE_LICENSE(&quot;GPL&quot;);</i><u></u><u></u></p>
</div></div></div></div><div><div><p class="MsoNormal"><u></u> <u></u></p></div><p class="MsoNormal">-- <br>Regards,<br><br>Prajosh Premdas<u></u><u></u></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">On single processor systems, spin_lock() doesn’t actually spin on anything.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">The term spin_lock() is a bit of a misnomer in my opinion as it implies that some sort of spinning will go on if the lock has already been taken.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">It really means, sort of, “disable preemption, then serialize access on this variable among other threads on other CPUs, and I promise not to try to take this lock in any top or bottom half context on this CPU.”<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Of course, that would make for an unwieldy function name, so its call spin_lock().<span class="HOEnZb"><font color="#888888"><u></u><u></u></font></span></span></p>
<span class="HOEnZb"><font color="#888888"><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Jeff Haran<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p></font></span></div></div></div><font face="monospace"></font></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>
Regards,<br><br>Prajosh Premdas<br>
</div>