嵌套的spin_lock_irqsave

时间:2012-09-25 13:42:34

标签: linux linux-kernel linux-device-driver

如果代码如下

void test(void)
{
  spin_lock_irqsave(&lock1, flag);
  ...
  func1();
  ...
  spin_unlock_irqrestore(&lock1, flag);
}

void func1(void)
{
  spin_lock_irqsave(&lock2, flag);
  ...
  spin_unlock_irqrestore(&lock2, flag);
}

代码会有问题吗?当在func1中调用spin_unlock_irqrestore时,是否已启用中断?我想要实现的是test()例程可以在没有调度程序或中断的任何中断的情况下执行。非常感谢

1 个答案:

答案 0 :(得分:6)

就我在文档中找到的而言,我还没有完全耗尽我的搜索,flag将保存设置不同标志的位的状态,然后关闭中断,然后恢复它结束了。如果第一次调用test已关闭中断,然后再进行一次调用,我会假设(并且没有任何迹象表明我已经找到)将关闭中断,存储{{1并在flags中恢复它们,然后将它们恢复到func()中的flag状态。

只有在test功能后才能重新启用中断。

我想说你唯一的问题是你不能在两个函数中使用相同的test变量,否则你将覆盖内部调用中的第一个变量然后重置它,如果之间有任何标志发生变化你的电话,你可以将外部电话重置为错误的状态。