Linux内核中调用给定函数的上下文

是否有直接的机制来确定是否在中断上下文或进程上下文中调用给定的函数。 这是问题的第一部分。 第二部分是:如何同步两个进程,一个处于中断环境,另一个处于进程环境。 如果我的理解是正确的,我们不能在中断上下文中使用互斥体,因为它不允许睡眠。 另一方面,如果我使用螺旋锁,另一个进程将使用CPU周期。 同步这两个过程的最佳方法是什么? 纠正我,如果我的理解是完全错误的。

您可以通过使用in_irq()函数来判断函数是否作为IRQ处理函数运行。 但是我不认为这是一个很好的做法。 你应该从代码中看到你的函数在哪个上下文中运行。 否则,我会说你的代码糟糕的设计。

至于同步机制 – 你是对的,你必须使用自旋锁 ,因为你需要在原子上下文(例如中断)进行同步 – 而不是你在这里有很多的选择。 你也是正确的,等待螺旋锁的时候会浪费很多的CPU周期,所以你应该尽量减少你的代码量。

添加Sam的答案 – 你应该设计你的中断处理程序的下半部分和上半部分。 这可以让您在中断处理程序(在驱动程序中请求irq时注册)中拥有一个最小代码(上半部分),而使用工作队列可以安排休眠(下半部分)。 您可以在由spinlock保护的原子上下文中拥有这个上半部分(您只需处理中断,并从器件中进行一些最小的红色/写入操作),从而减少了等待螺旋锁的CPU周期数量。