【问题标题】:Nested spin_lock_irqsave嵌套 spin_lock_irqsave
【发布时间】:2012-09-25 13:42:33
【问题描述】:

如果代码如下

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() 例程可以在不受调度程序或中断的任何中断的情况下执行。非常感谢

【问题讨论】:

  • 实际上,除了spin_lock_irq()/spin_unlock_irq() 之外,还有spin_lock_irqsave()/spin_unlock_irq_restore() 的全部意义。

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


【解决方案1】:

据我在文档中找到的,我还没有完全用尽我的搜索,flag 将保存设置不同标志的位的状态,然后关闭中断,然后恢复它结尾。如果第一次调用test 关闭了中断,然后您又进行了一次调用,我会假设(并且没有任何迹象表明我发现)它将关闭中断,存储flags 并恢复它们在func() 中,然后将它们恢复到flagtest 中的状态。

只有在 test 函数之后才能重新启用中断。

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

【讨论】:

  • 这是正确的。嵌套 spin_lock_irqsave() 完全没问题,只要您使用不同的“标志”变量。
猜你喜欢
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
相关资源
最近更新 更多