公司动态

14、驱动性能分析与优化--异步处理框架

📅 2026/8/20 10:24:10
14、驱动性能分析与优化--异步处理框架
14.1 先搞清楚:你为什么要异步?说白了,驱动里很多操作不能直接在中断上下文里做。比如你处理一个网络包,中断来了,你总不能在里面等磁盘I/O吧?那叫阻塞,会死人的。异步处理的核心就一句话:把耗时操作挪到合适的上下文去执行。至于怎么挪、挪到哪,就是这几个框架要解决的事。核心原则:中断上下文只做最紧急、最轻量的事。其余的都给我扔出去。14.2 tasklet:轻量但有限tasklet 是内核里最古老的异步机制之一。我刚开始写驱动时,前辈就告诉我:「能用 tasklet 就用 tasklet,简单。」它确实简单。你注册一个回调函数,告诉内核「软中断来了就叫我」。tasklet 运行在软中断上下文,所以不能睡眠,不能拿信号量。// tasklet 典型用法 void my_tasklet_func(unsigned long data) { // 这里不能睡眠! // 只能做轻量操作 printk("tasklet 执行中\n"); } DECLARE_TASKLET(my_tasklet, my_tasklet_func, 0); tasklet_schedule(my_tasklet);嗯,这里要注意:tasklet 在同一时间只能在一个 CPU 上跑。你调度了两次,它也只执行一次。这是它的设计约束,也是它的优势——不用考虑并发。我的经验:tasklet 适合做网络收发包的轻量后处理。比如更新统计计数器、触发下一个 DMA。千万别在里