如何同步内核工作队列线程



我对Linux设备驱动程序和内核很陌生。我基本上想将一个工作线程(让我们称之为 A())与另一个函数(让我们称之为 B()同步。我的目的是在 A 运行时使 B 失败。

目前,我所做的如下。

A(){
  active = true; // a variable shared b/w both A and B
  ...
  ...
  ...
  active = false;
}
B(){
   if(active){
      return -EBUSY
    }
 }

这是同步这两个功能的正确方法吗?我应该遵循其他策略吗?

对于Linux内核来说,这是糟糕的代码。尝试阅读有关互斥锁信号量的信息。

http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=5

你为什么要这样做?

mmc_rescan()定义为INIT_DELAYED_WORK(&host->detect, mmc_rescan);

Bmmc_suspend_host()中的第一行代码是cancel_delayed_work(&host->detect);

所以你的 AB 中被取消了。这样做是有原因的,由这次提交带来。

那么,用另一个同步替换此取消的原因是什么?如果你的内核中没有这个提交,只需拉取它(挑剔),它可能会解决你的问题。

更新

请参阅下一个提交,它们会更改 MMC 挂起行为:

  1. mmc:核心:将常见的挂起|恢复代码推送到每个bus_ops

  2. mmc:
  3. 核心:从 mmc 总线而不是 mmc 主机启动挂起|恢复

  4. mmc:核心:删除已弃用的mmc_suspend|resume_host API

也许您只需要向后移植这些补丁即可解决问题。或者至少他们会让它更容易修复它。

你应该定义一个互斥锁,并在代码中有共享变量时使用它,这里是 Linux 内核中互斥锁和条件函数的实现 Linux 互斥和条件

最新更新