Hi I am running with preemption on. Jeff, but when i tried this on x86 machine my kernel just froze. How is that happening? On Fri, Nov 4, 2011 at 3:41 AM, Jeff Haran <jharan@bytemobile.com> wrote:
** **
** **
*From:* kernelnewbies-bounces@kernelnewbies.org [mailto: kernelnewbies-bounces@kernelnewbies.org] *On Behalf Of *Prajosh Premdas *Sent:* Wednesday, November 02, 2011 2:02 AM *To:* kernelnewbies@kernelnewbies.org *Subject:* spin_lock behavior****
** **
Hi ****
** **
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 "spin_lock" instead of "spin_unlock" the driver worked fine and i caught the mistake only during a review ****
** **
*#include <linux/module.h>*****
*#include <linux/spinlock.h>*****
** **
*struct sp_q {*****
*spinlock_t spinlock;*****
*uint8_t data;*****
*};*****
** **
*static int __init sp_lck_init(void)*****
*{*****
** **
* struct sp_q test;*****
* *****
* /* Spin lock Init */*****
** **
* spin_lock_init(&test.spinlock);*****
* *****
* printk("<1>Test start\n");*****
* *****
* spin_lock(&test.spinlock);*****
* test.data = 0; *****
* spin_lock(&test.spinlock); *****
* *****
* printk("<1>How come???\n");*****
* return 0;*****
** **
*}*****
** **
*static void __exit sp_lck_exit(void)*****
*{*****
** **
*}*****
** **
*module_init(sp_lck_init);*****
*module_exit(sp_lck_exit);*****
*MODULE_LICENSE("GPL");*****
** **
-- Regards,
Prajosh Premdas****
** **
On single processor systems, spin_lock() doesn’t actually spin on anything. ****
** **
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.* ***
** **
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.”****
** **
Of course, that would make for an unwieldy function name, so its call spin_lock().****
** **
Jeff Haran****
** **
-- Regards, Prajosh Premdas