Linux工作队列的INIT_WORK跟DECLARE_WORK到底是3个参数还是2个参数?

上周,一位客户问我为什么内核代码中的这些宏如此复杂......我拿出workqueue.h给他看。
仔细想想,INIT_WORK和DECLARE_WORK这两个宏,一个用于初始化,一个用于声明结构体,用起来还是挺方便的。

但是话虽如此,为什么要这样做......我想这主要是为了编译时效率。
内核代码运行时速度非常快,因此需要节省编译时间。
通过直接编写 struct work_struct my_work = __WORK_INITIALIZER("my_work", my_func);肯定可以,但是如果每次都这样写,宏展开可能会有点慢。
通过宏定义,编译器直接替换了 __INIT_WORK(&my_work, my_func, 0);语句,这可以避免编译器和内核出现问题。

再看看__WORK_INITIALIZER,它内部也调用了__INIT_WORK。
它是做什么用的? __INIT_WORK 是实际完成工作的函数。
将work_struct的func成员指向你传递的my_func函数,将wait设置为0,并将所有者设置为当前的task_struct。
内核代码中还有很多类似的细节。
为了节省编译时间,用宏来玩游戏。

如果以后遇到此类宏,请不要困惑。
直接有/sys/src/linux/kernel/workqueue.h打开源文件查看。
其中实际上只有几行__INIT_WORK实现。
一旦你理解了它,你就会明白为什么要这样设计。
别问我为什么知道得这么清楚。
2 01 9 年,我在北京一家互联网公司开发驱动程序时,正在调试工作队列阻塞问题。
我追了这个宏三天,最后发现是task_struct加锁不释放导致的……反正你能搞清楚。
内核代码就是这样,看多了也就习惯了。

Linux 6.9 内核正式版发布:支持 AMD P-State 首选核心、优化酷睿 Ultra 处理器性能

Linux 6 .9 内核改进了性能和硬件支持。
AMD 处理器更喜欢核心支持以提高能效。
Intel Core Ultra性能优化和均衡功耗。
修复AMDGPU驱动程序以提高渲染稳定性。
4 K 显示器具有更大的字体和更高的可读性。
加强了LoongArch支持,提高了对国产CPU的兼容性。
旧版本的 NTFS 驱动程序已被删除,以减少代码重复。
定时器子系统已被重写,可以更快地处理网络操作。
升级了任务排队机制,减少延迟,提高并发性。
核心网络协议栈已更新,以优化数据包处理。
改进KVM虚拟机,提高资源调度效率。
联发科网络 SoC 支持,改进的 Wi-Fi/蓝牙连接。
高通Snapdragon X1 E8 01 00时钟控制器,精确的时钟管理。
联发科技 MT8 1 8 6 Chromebook 扩展了教育市场的兼容性。
ARM6 4 构建的数量不断增加,生态系统已演变成多种架构。
扩大测试范围,主动识别潜在风险。
Linus Torvalds 将 6 .9 评估为通用版本,但为基本重建奠定了基础。
6 .1 0合并窗口即将打开,更多实验性功能将被引入。
你自己掂量一下。