queue_work_on会将当前任务提交到特定的CPU上执行。 intqueue_work_on(intcpu,structworkqueue_struct*wq,structwork_struct*work); 3.3 queue_delayed_work queue_delayed_work会在任务提交到工作队列之前等待一段时间,由delay参数来指定。 ]intqueue_d
(KERN_INFO "own workqueue\n"); ret = queue_work( g_data->own_workqueue, &mywork ); if(ret){ printk("queue work err\n"); return ret; } #else schedule_work_on(1,&mywork); #endif else cancel_work_sync(&mywork); return len; } int work_queue_dev_open (struct inode *inode,...
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...
首先,利用queue_work简单地将任务安排进工作队列(这将任务绑定到当前的CPU)。或者,可以通过queue_work_on来指定处理程序在哪个CPU上运行。两个附加的函数为延迟任务提供相同的功能(其结构体装入结构体work_struct之中,并有一个计时器用于任务延迟)。 清单7.工作队列函数 int queue_work( struct workqueue_struct *w...
queue_work是一个inline函数,内核中很多接口采用这种用法,在头文件中定义一个inline函数包装一下实际业务的函数,这样过度一下可以有效的降低代码的耦合度。实际执行的函数是queue_work_on,代码如下: 1455行,1462行,关闭/打开本地中断,防止work的data并发设置。1457行,设置work->data的WORK_STRUCT_PENDING_BIT,表示任...
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模块时会阻塞掉一段时间。
3.2初始化work_struct #define INIT_WORK(_work, _func) \ __INIT_WORK((_work), (_func), 0) #define INIT_WORK_ONSTACK(_work, _func) \ __INIT_WORK((_work), (_func), 1) #define INIT_DELAYED_WORK(_work, _func) \ __INIT_DELAYED_WORK(_work, _func, 0) ...
工人。在代码中 worker 对应一个 work_thread() 内核线程。 代码语言:javascript 复制 struct worker{/* on idle list while idle, on busy hash table while busy */union{struct list_head entry;/* L: while idle */struct hlist_node hentry;/* L: while busy */};struct work_struct*current_work...