Linux工作队列应该是具有进程上下文的内核级线程。我试图用它作为kthread的替代品,它没有特定的进程上下文。但是如何将数据传递到工作队列? work_struct有一个数据字段,类型为atomic_long_t。我无法将指针传递给此字段。我该怎么做?
此外,我找不到工作队列的单个具体示例。你能建议吗?
答案 0 :(得分:19)
如果要将数据传递到工作队列函数,只需将work_struct
结构嵌入到您自己的数据结构中,并在工作函数中使用container_of
来检索它。
至于一个简单的例子,内核充满了它 - 只是git grep work_struct
。您可以查看drivers/cpufreq/cpufreq.c
(handle_update
函数)以获取一个简单示例。下面的文章最后还嵌入了一个示例,但它不使用container_of
,而是依赖于结构的第一个成员与其父级具有相同地址的事实:
http://www.ibm.com/developerworks/linux/library/l-tasklets/index.html
答案 1 :(得分:4)
似乎已经解决了,为了了解如何使用工作队列,您对我非常有帮助。我在github中给你一些简单例子的代码,希望它对任何人都有帮助:
https://github.com/m0r3n/kernel_modules/blob/master/workQueue.c
您可以使用以下Makefile进行编译:
KVERSION = $(shell uname -r)
obj-m = workQueue.o
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
通过以下方式插入模块:
# sync; insmod workQueue.ko; sync
查看日志:
# tailf /var/log/kern.log
编辑: 我刚刚添加了延迟版本:
https://github.com/m0r3n/kernel_modules/blob/master/workQueueDelayed.c
答案 2 :(得分:0)
默认情况下,调用work函数并将work struck作为参数。 在线程内部,可以容易地获得结构的数据元素。 也是Gnurou,为了获得更多数据,工作结构可以放在一个特定于实现的结构中,并且在线程内使用宏容器可以访问所有数据。
关于工作队列的简单描述
worqueue是中断处理下半部分机制,其中一部分工作被提供给内核线程,以便稍后在中断启用时执行。 percpu线程事件/ n由内核创建,线程也可以由驱动程序代码创建。结构用于标识线程,结构内部的一个重要参数是名称字段。它还包含每个cpu结构,依次为包含线程等待的waitqueue头和一个链接列表,用于添加定义工作的结构,即函数和数据。工作线程将该结构作为输入参数。线程运行并等待等待的人员等待唤醒线程。创建定义该功能的工作结构。当一个 workqueue是schedule,结构被添加到链接列表的尾部,并且工作线程被唤醒。在唤醒时,工作线程运行在每个cpu结构中定义的链接列表,并开始执行使用工作结构定义的函数作为参数。执行后,它会从链接列表中删除该条目。