一个实例:
ko insmod 的时候,创建 completion , 然后进行 driver probe/add,init进程使用 wait_for_completion_timeout 等待固定时间,看 driver 是否probe ok,driver probe 成功之后,使用 complete() 通知给等待它的进程
#include <linux/init.h>
#include <linux/module.h>
#include <linux/completion.h>
#include <linux/delay.h>
#include <linux/printk.h>
static struct completion finish_event;
static int demo_add(struct xxx_device *device)
{
// 这里干一些事
// ... ...
complete(&finish_event);
return 0;
}
static struct xxx_driver xxx_driver = {
.name = "xxxx",
.ops = {
.add = demo_add,
.remove = demo_remove,
},
};
static int __init xxx_init(void)
{
int ret, t;
init_completion(&finish_event);
ret = xxx_bus_register_driver(&xxx_driver);
if (ret)
return ret;
t = wait_for_completion_timeout(&finish_event, 5*HZ);
if (t == 0) {
ret = -ETIMEDOUT;
goto cleanup;
}
}
具体原理,后面补上