我的linux内核模块中有这段代码:
spin_lock_irqsave(&ofn_lock, ofn_flag);
<several instructions>
ack_type = 1;
wake_up = 1;
spin_unlock_irqrestore(&ofn_lock, ofn_flag);
if (wake_up)
wake_up(&wait_q);
睡眠者这样做:
#define TIMEOUT 250
wait_event_timeout(wait_q, ack_type != 0, msecs_to_jiffies(TIMEOUT));
if (ack_type == 1)
retValue = OK;
else
retValue = TIMEOUT;
此代码在具有4个内核的ARM SMP上运行。
大多数情况下代码都能正常工作,但是有时等待会在超时时退出,即使所有时间ack_type都设置为1(我在waker中打印了一个打印该值的打印,并且&#39 ; s 1,我也在卧铺中打印,有时值为0)。
我的感觉是问题与缺乏内存障碍有关(我知道自旋锁和wake_up以及wait_event都使用内存屏障,因此我认为我不需要明确使用记忆障碍),但我不确定这是否真的是问题。
有人知道这里可能出现什么问题吗?