工作队列是内核用于进行延后工作的一种方式。当然驱动模块中使用之前提到的kernel thread就可以完成延后工作了,但是如果每个驱动模块都创建自己的kernel thread,那么内核线程数量过多,这会影响整体的性能。因此,最好的方法就是把这些需求汇集起来,提供一个统一的机制,也就是workqueue了。
它的结构是workqueue_struct;
和工作队列息息相关的是工作元素work_struct,毕竟队列只是一个容器罢了,光有队列是不能干什么活的,它定义在kernel-4.9/include/linux/workqueue.h
struct work_struct {
atomic_long_t data;
struct list_head entry;
work_func_t func;
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
work_struct的初始化,定义在kernel-4.9/include/linux/workqueue.h中;这个方法的用途是将对应的work_struct变量和函数地址建立联系。
#define INIT_WORK(_work, _func) \
__INIT_WORK((_work), (_func), 0)
这里有一个比较奇怪的地方,因为一些资料里面提到的INIT_WORK方法有第三个参数data,然而在kerenl-4.9下的并没有,于是再查看一了下kernel-3.18的代码;
#define IN