【发布时间】:2015-03-04 19:14:48
【问题描述】:
以下 Linux 设备驱动程序代码是否安全,或者我是否需要使用自旋锁保护对 interrupt_flag 的访问?
static DECLARE_WAIT_QUEUE_HEAD(wq_head);
static int interrupt_flag = 0;
static ssize_t my_write(struct file* filp, const char* __user buffer, size_t length, loff_t* offset)
{
interrupt_flag = 0;
wait_event_interruptible(wq_head, interrupt_flag != 0);
}
static irqreturn_t handler(int irq, void* dev_id)
{
interrupt_flag = 1;
wake_up_interruptible(&wq_head);
return IRQ_HANDLED;
}
基本上,我会在my_write() 中启动一些事件并等待中断指示它完成。
如果是这样,我需要使用哪种形式的spin_lock()?我认为spin_lock_irq() 是合适的,但是当我尝试这样做时,我收到了有关 IRQ 处理程序启用中断的警告。
wait_event_interruptible 不评估interrupt_flag != 0 条件吗?这意味着在读取标志时应该持有锁,对吧?
【问题讨论】:
-
试试。
spin_lock_irqsave() -
它几乎肯定需要保护。但是,如果没有更多信息,则无法确定自旋锁或不同的锁定机制是否最合适。
标签: linux-kernel linux-device-driver embedded-linux