gpt4 book ai didi

linux-kernel - 如何正确唤醒中断处理程序中的进程

转载 作者:行者123 更新时间:2023-12-04 05:53:22 25 4
gpt4 key购买 nike

简而言之,在 read 中我检查变量是否为 0 的方法,如果是,我将当前进程置于 sleep 状态:

static ssize_t soc2e_read(struct file *filp, char __user *buf,
size_t count, loff_t * ppos)
{
...
struct soc2e_dev *soc2e = (struct soc2e_dev *)filp->private_data;

if (soc2e->bytes == 0)
{
if (wait_event_interruptible(soc2e->wlist, (soc2e->bytes > 0)))
return -ERESTARTSYS;
}
...
}

我必须在中断处理程序中唤醒进程:
static irqreturn_t soc2e_irq_handler(int irq, void *dev)
{
...
struct soc2e_dev *soc2e = dev;
...
soc2e->bytes += read_bytes;

wake_up_interruptible(&soc2e->wlist);
return IRQ_HANDLED;
}

我认为(并且也验证了)这可能是一个原子性问题。如果中断出现在 if (soc2e->bytes == 0) 之间会发生什么在 read方法和对 wait_event_interruptible 的调用.也许直到下一次中断才会唤醒进程。解决此问题的最佳方法是什么?

最佳答案

wait_event_interruptible宏已经非常小心地避免了您描述的比赛。事实上,您不需要对您的 bytes 进行初始检查。成员(member)——你可以写在你的 read方法:

  if (wait_event_interruptible(soc2e->wlist, soc2e->bytes > 0))
return -ERESTARTSYS;

因为 wait_event_interruptible()如果条件为真(或在进入休眠过程中变为真),则实际上不会进入休眠状态。

关于linux-kernel - 如何正确唤醒中断处理程序中的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9809140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com