当前位置: 技术问答>linux和unix
内核自旋锁spin_lock,获取已锁住的锁时Linux死机
来源: 互联网 发布时间:2017-03-12
本文导语: 本帖最后由 Iris_Zhou 于 2012-08-31 13:44:24 编辑 写了一个驱动程序,read/write函数实现如下,number是一个全局变量,读/写该变量之前都加上锁。程序大意是为了保证每次读完了才能继续写或者每次写结束以后才能继续读,...
按我的理解,实现现象是这样的:由于进程A处在延时期间,还没有解锁,那么进程B应该会阻塞在那里不停“自旋”,等到10秒延时结束,A进程放开自旋锁,B进程才可以继续写……但实际情况是一执行B,整个Linux就死掉了……要重启才行。我想问下这是为什么?
ssize_t my_read(struct file *flip,char __user *buff,size_t cnt,loff_t *off_t)
{
spin_lock_irqsave(&my_spinlock,flag);
/* 变量number是要保护的数据*/
if(copy_to_user(buff,&number,sizeof(int)))
{
spin_unlock_irqrestore(&my_spinlock,flag);
return -EFAULT;
}
/*延时10秒,为并发创造条件*/
ssleep(10);
spin_unlock_irqrestore(&my_spinlock,flag);
return 0;
}
ssize_t my_write(struct file *flip,const char __user *buff,size_t cnt,loff_t *off_t)
{
spin_lock_irqsave(&my_spinlock,flag);
if(copy_from_user(&number,buff,sizeof(int)))
{
spin_unlock_irqrestore(&my_spinlock,flag);
return -EFAULT;
}
spin_unlock_irqrestore(&my_spinlock,flag);
return 0;
}
|
在原子上下文中(中断上下文、持有自旋锁的上下文)不能睡眠,否则有可能导致死锁