queue_work_on会将当前任务提交到特定的CPU上执行。 intqueue_work_on(intcpu,structworkqueue_struct*wq,structwork_struct*work); 3.3 queue_delayed_work queue_delayed_work会在任务提交到工作队列之前等待一段时间,由delay参数来指定。 ]intqueue_delayed_work(structworkqueue_struct*wq,structdelayed_work*dwork...
queue_work()函数的源码可以在openeuler/kernel/blob/kernel-4.19/include/linux/workqueue.h文件中找到,后两个函数的源码都可以在openeuler/kernel/blob/kernel-4.19/kernel/workqueue.c文件中找到。 queue_work()函数直接调用了queue_work_on()函数: queue_work_on()函数关中断并调用__queue_work()将工作项加入特...
INIT_WORK() schedule_work() flush_work() cancel_work_sync() INIT_DELAYED_WORK() schedule_delayed_work() flush_delayed_work() cancel_delayed_work() cancel_delayed_work_sync() create_workqueue() queue_work() queue_delayed_work() queue_work_on() flush_workqueue() destroy_workqueue() create...
5、cancel_delayed_work_sync():取消延时工作任务并等待它完成 6、create_workqueue():对于多CPU系统,内核会在每个CPU上创建一个工作队列,使线程处理并行化 7、create_singlethread_workqueue():内核只在一个CPU上创建一个工作队列 8、queue_work_on():在指定CPU上添加工作任务,queue_work()调用queue_work_on()...
8、queue_work_on():在指定CPU上添加工作任务,queue_work()调用queue_work_on()在所有CPU上添加工作任务 三、接口使用举例 1、共享工作队列 文件:drivers/gpu/drm/drm_fb_helper.c,举例如下: ## 3、工作任务的具体实现staticvoiddrm_fb_helper_restore_work_fn(structwork_struct*ignored){...}## 1、定义...
可采用多种方法来完成这一操作(参见清单7)。首先,利用queue_work简单地将任务安排进工作队列(这将任务绑定到当前的CPU)。或者,可以通过queue_work_on来指定处理程序在哪个CPU上运行。两个附加的函数为延迟任务提供相同的功能(其结构体装入结构体work_struct之中,并有一个计时器用于任务延迟)。
可采用多种方法来完成这一操作(参见清单7)。首先,利用queue_work 简单地将任务安排进工作队列(这将任务绑定到当前的CPU)。或者,可以通过queue_work_on 来指定处理程序在哪个CPU 上运行。两个附加的函数为延迟任务提供相同的功能(其结构体装入结构体work_struct 之中,并有一个计时器用于任务延迟)。
以下驱动demo,特意使用了schedule_work_on的API,证明一个work是可以指定CPU运行的,通过写/dev/work_queue设备节点,触发调度work,在work回调里执行计算密集型任务,即可观察指定的CPU的使用率,最后卸载模块的时候,特意使用了带sync的API,等待work执行完毕,因此可以看到rmmod模块时会阻塞掉一段时间。
queue_work是一个inline函数,内核中很多接口采用这种用法,在头文件中定义一个inline函数包装一下实际业务的函数,这样过度一下可以有效的降低代码的耦合度。实际执行的函数是queue_work_on,代码如下: 1455行,1462行,关闭/打开本地中断,防止work的data并发设置。1457行,设置work->data的WORK_STRUCT_PENDING_BIT,表示任...
function: queue_work_on 174 185int 186queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work) 187{ 188int ret = 0; 189 190if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) { 191BUG_ON(!list_empty(&work->entry)); ...