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

时间:2015-04-09 18:52:37

标签: linux-kernel kernel linux-device-driver

我是Linux设备驱动程序和内核的新手。我基本上想要将一个workque线程(让它称之为A())与另一个函数同步(让我们称之为B())。我的目的是在A运行时失败B.

目前,我所做的工作如下。

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

B(){
   if(active){
      return -EBUSY
    }
 }

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

3 个答案:

答案 0 :(得分:1)

对于Linux内核它的代码不好。尝试阅读互斥信号量

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

答案 1 :(得分:1)

你为什么要这样做?

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

B mmc_suspend_host()中的第一行代码为cancel_delayed_work(&host->detect);

因此 B 中取消 A 。这是出于某种原因,由 this commit 带来。

那么用另一个同步替换此取消的原因是什么?如果您的内核中没有此提交,只需将其拉出(cherry-pick),它可能会解决您的问题。

更新

请参阅下一个提交,他们更改MMC暂停行为:

  1. mmc: core: Push common suspend|resume code into each bus_ops

  2. mmc: core: Initiate suspend|resume from mmc bus instead of mmc host

  3. mmc: core: Remove deprecated mmc_suspend|resume_host APIs

  4. 也许您只需要回传端口补丁来解决问题。或者至少它们会使修复它变得更简单。

答案 2 :(得分:0)

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