gpt4 book ai didi

linux - 从 sleep_on() 到 wait_event()?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:58 26 4
gpt4 key购买 nike

我正在将遗留代码从 Linux 3.14 移植到 4.1。我需要将许多对 sleep_on() 函数的调用转换为对 wait_event() 函数的调用:

wait_event(wq, condition);
wait_event_interruptible(wq, condition);
wait_event_timeout(wq, condition, timeout);
wait_event_interruptible_timeout(wq, condition, timeout);

sleep_on() 函数在内核 3.15 中被删除,因为它们会导致竞争条件。

我的问题是理解使用 sleep_on() 函数的棘手代码并进行适当的更改、测试等需要花费很多时间,我需要至少发布一个原型(prototype)尽快地。假设我是 Linux 设备驱动程序新手。

您知道我可以使用一种模式来通过调用 wait_event() 函数来替换对 sleep_on() 函数的调用吗?例如,如果我只是将 sleep_on(&wait_queue) 替换为 wait_event(wait_queue, false),与遗留代码相比会有什么影响?结果会和遗留代码一样糟糕(可能有竞争条件),还是更糟?

提前感谢您的建议。

最佳答案

您可以定义 sleep_on 函数,因为它已在 3.15 之前的内核中定义。像这样:

void
sleep_on(wait_queue_head_t *q)
{
unsigned long flags;
wait_queue_t wait;

init_waitqueue_entry(&wait, current);

__set_current_state(TASK_UNINTERRUPTIBLE);

spin_lock_irqsave(&q->lock, flags);
__add_wait_queue(q, &wait);
spin_unlock(&q->lock);
schedule();
spin_lock_irq(&q->lock);
__remove_wait_queue(q, &wait);
spin_unlock_irqrestore(&q->lock, flags);
}

(源自 sleep_on_common 的代码,但删除了超时内容。)

对于那些想在 kernel.org 上查看原始代码的人,请参阅 sleep_on_common() 以及 2014 年 4 月提交的 32d01dc7be4e725ab85ce1d74e8f4adc02ad68dd(在该功能被删除前几天) ).


至于wait_event()和 friend ,使用constant condition是错误的:

  • '真'永远不会 sleep
  • 'false'永远不会醒来

关于linux - 从 sleep_on() 到 wait_event()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44852140/

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