Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制; Workqueue工作队列可以用作中断处理的Bottom-half机制,利用进程上下文来执行中断处理中耗时的任务,因此它允许睡眠,而Softirq和Tasklet在处理任务时不能睡眠; 来一张概述图: 在中断处理过程中,或者其他子系统中,调用workqueue的调度或入队接口后,通
用户可以通过创建工作队列,并将工作任务提交给工作队列来实现异步执行任务的功能。 alloc_workqueue函数是一个用于创建新工作队列的函数,该函数的声明如下: struct workqueue_struct *alloc_workqueue(const char *fmt, unsigned int flags, int max_active); 其中,参数fmt指定了工作队列的名称,flags用于指定工作队列的...
int __initworkqueue_init_early(void){...system_wq=alloc_workqueue("events",0,0);system_highpri_wq=alloc_workqueue("events_highpri",WQ_HIGHPRI,0);system_long_wq=alloc_workqueue("events_long",0,0);system_unbound_wq=alloc_workqueue("events_unbound",WQ_UNBOUND,WQ_UNBOUND_MAX_ACTIVE);syste...
2.使用alloc_workqueue()创建系统自带的多个工作队列。system_wq 、system_highpri_wq 、system_long_wq 、system_unbound_wq 、system_freezable_wq 、system_power_efficient_wq 、system_freezable_power_efficient_wq 都是全局的工作队列,供各个驱动模块使用,各有不同的特点。 alloc_workqueue(const char *fmt,...
alloc_workqueue完成的主要工作包括: 首先当然是要分配一个struct workqueue_struct的数据结构,并且对该结构中的字段进行初始化操作; 前文提到过workqueue最终需要和worker_pool关联起来,而这个纽带就是pool_workqueue,alloc_and_link_pwqs函数就是完成这个功能:1)如果工作队列是绑定到CPU上的,则为每个CPU都分配pool_wor...
alloc_workqueue完成的主要工作包括: 首先当然是要分配一个struct workqueue_struct的数据结构,并且对该结构中的字段进行初始化操作; 前文提到过workqueue最终需要和worker_pool关联起来,而这个纽带就是pool_workqueue,alloc_and_link_pwqs函数就是完成这个功能:1)如果工作队列是绑定到CPU上的,则为每个CPU都分配pool_wor...
alloc_workqueue(const char *fmt, unsigned int flags, int max_active, ...); system_wq = alloc_workqueue("events", 0, 0); system_highpri_wq = alloc_workqueue("events_highpri", WQ_HIGHPRI, 0); system_long_wq = alloc_workqueue("events_long", 0, 0); ...
alloc_workqueue()用于分配一个WQ。原来的create_workqueue()系列接口已经弃用并计划删除。alloc_workqueue()有三个入参:@name, @flags, @max_active。name是workqueue的名字并也用于rescuer-thread(如果有的话)名称。flags和max_active用于控制work分配执行环境、调度和执行。
Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制; Workqueue工作队列可以用作中断处理的Bottom-half机制,利用进程上下文来执行中断处理中耗时的任务,因此它允许睡眠,而Softirq和Tasklet在处理任务时不能睡眠; 来一张概述图: 在中断处理过程中,或者其他子系统中,调用workqueue的调度或入队接口后,通过建立好的链...
allow_workqueue()是创建队列的宏,负责创建一个新的队列,不管有没有定义CONFIG_LOCKDEP最终通过__alloc_workqueue_key()实现。参数的解析我们放到后文再说,先看看hub模块如何创建队列: USB hub模块在初始化的时候先注册hub驱动,接着创建工作队列。 5272行,创建全局唯一hub_wq队列,参数WQ_FREEZABLE表示工作线程在挂起时...