我对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);
B:mmc_suspend_host()
中的第一行代码是cancel_delayed_work(&host->detect);
所以你的 A 在 B 中被取消了。这样做是有原因的,由这次提交带来。
那么,用另一个同步替换此取消的原因是什么?如果你的内核中没有这个提交,只需拉取它(挑剔),它可能会解决你的问题。
更新
请参阅下一个提交,它们会更改 MMC 挂起行为:
-
mmc:核心:将常见的挂起|恢复代码推送到每个bus_ops
mmc: 核心:从 mmc 总线而不是 mmc 主机启动挂起|恢复
mmc:核心:删除已弃用的mmc_suspend|resume_host API
也许您只需要向后移植这些补丁即可解决问题。或者至少他们会让它更容易修复它。
你应该定义一个互斥锁,并在代码中有共享变量时使用它,这里是 Linux 内核中互斥锁和条件函数的实现 Linux 互斥和条件