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,st
调度work_struct 到自定义workqueue 初始化好我们自己的工作队列后,就可以将work调度到工作队列上面,这一点和使用自带工作队列是没什么区别。 int queue_work( struct workqueue_struct *wq, struct work_struct *work ); int queue_work_on( int cpu, struct workqueue_struct *wq, struct work_struct *work ...
函数queue_work_on()将work放入workqueue队列,其定义如下: externboolqueue_work_on(intcpu,structworkqueue_struct *wq,structwork_struct *work); 函数queue_delayed_work将delayed_work在延迟delay个jiffies之后放入workqueue队列,其定义如下: staticinlineboolqueue_delayed_work(structworkqueue_struct *wq,structdelayed...
queue_work是一个inline函数,内核中很多接口采用这种用法,在头文件中定义一个inline函数包装一下实际业务的函数,这样过度一下可以有效的降低代码的耦合度。实际执行的函数是queue_work_on,代码如下: 1455行,1462行,关闭/打开本地中断,防止work的data并发设置。1457行,设置work->data的WORK_STRUCT_PENDING_BIT,表示任...
默认情况下,会选择当前 CPU,即调用 queue_work_on() 时的 CPU,但是前提是当前 CPU 在 @wq_unbound_cpumask 内,@wq_unbound_cpumask 全局参数描述了当前系统中所有 unbound worker pool 默认的 CPU affinity (即 workqueue_attr->cpumask),用户可以通过/sys/devices/virtual/workqueue/cpumask修改该参数的值,该...
8、queue_work_on():在指定CPU上添加工作任务,queue_work()调用queue_work_on()在所有CPU上添加工作任务 三、接口使用举例 1、共享工作队列 文件:drivers/gpu/drm/drm_fb_helper.c,举例如下: ## 3、工作任务的具体实现static void drm_fb_helper_restore_work_fn(struct work_struct *ignored){ ...} ...
void worker_func(struct work_struct *work); INIT_DELAYED_WORK(&work, worker_func); queue_work_on() 函数queue_work_on()将work放入workqueue队列,其定义如下: extern bool queue_work_on(int cpu, struct workqueue_struct *wq, struct work_struct *work); ...
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(...
queue_work_on()和queue_delayed_work_on()指定了任务由哪个cpu上的工作线程执行,另两个函数允许任务运行在任意cpu上。对于前两个函数,任务将会被立即执行;而对于后两个函数,任务需要等待一段时间才会被执行。 绑定工作队列的缺陷 在内核中,一种常见的使用工作队列的场景是处理周期性的工作:不断重复执行队列任务...
以下驱动demo,特意使用了schedule_work_on的API,证明一个work是可以指定CPU运行的,通过写/dev/work_queue设备节点,触发调度work,在work回调里执行计算密集型任务,即可观察指定的CPU的使用率,最后卸载模块的时候,特意使用了带sync的API,等待work执行完毕,因此可以看到rmmod模块时会阻塞掉一段时间。