# Concurrency Managed Workqueue
[workqueue 官方文件](https://www.kernel.org/doc/html/latest/core-api/workqueue.html)
[2025 年 Linux 核心設計課程作業 —— ktcp](https://hackmd.io/@sysprog/linux2025-ktcp/%2F%40sysprog%2Flinux2025-ktcp-c#%E4%BD%BF%E7%94%A8-Ftrace-%E8%A7%80%E5%AF%9F-kHTTPd)
[Linux 核心設計: Concurrency Managed Workqueue](https://hackmd.io/@RinHizakura/H1PKDev6h)
[紀錄:一對一討論](https://hackmd.io/P82xNXcZS46lh6VoHQkJyA?view)
## 為甚麼需要它
過去的 workqueue 實作有兩種
- multi threaded (MT) wq
- single threaded (ST) wq
### 名詞解釋
- work item: 一個要執行的函式
- workqueue: 存放 work item
- work thread: 用來執行 work item
>When such an asynchronous execution context is needed, a work item describing which function to execute is put on a queue. An independent thread serves as the asynchronous execution context. The queue is called workqueue and the thread is called worker.
### single threaded (ST) wq
每建立一個 workqueue ,會在系統建立一個 work thread
### multi threaded (MT) wq
- 每建立一個 workqueue ,會在每個 CPU 上建立一個 work thread,這很可能導致把 pid 數量( 32k )用完
- 每個 cpu 最多只能有一個執行緒處理工作
:::info
[Concurrency Managed Workqueue之(二):CMWQ概述](http://www.wowotech.net/irq_subsystem/cmwq-intro.html) 上面寫說某個 cpu 被阻塞,該 cpu 處理的其他 work 也會被阻塞,但沒有找到 MTWQ work item 會先排入各個 cpu 的敘述,不知道是不是對的,但好像很合理?
:::
## CMWQ 設計
### threaded workqueues
- 所有 worker 執行緒由 worker-pool 統一管理 -> 解決了 MTWQ 大量建立 thread 與 cpu 阻塞的問題
- 使用者層面的工作佇列(寫核心模組用到的部份)與後端處理(實際處理工作的部份)分離
- 每個 cpu 有兩個 worker pool
- 一個負責處理「一般」優先等級的工作項目
- 一個負責處理「高優先」工作項目
- 為了服務 unbound workqueue(不綁定特定 CPU 的工作佇列)所排入的工作項目,系統還會動態建立額外的 worker-pool。
### BH workqueue
### 建立與排程工作項目
### 並行度管理
- worker-pool 與並行度管理
- worker-pool 透過 hook 排程器來管理並行度
- 維持足以避免處理停滯就算最佳化
- 當 cpu 上還有一個 runnable worker 時,worker-pool 不會啟動新的工作
- 但當最後一個執行中的 worker 進入睡眠時,系統會立即排程另一個 worker
:::info
kxo 的 mcts 是不是因為這個設計,變得很卡?
:::
- idle worker 保留
- cmwq 會保留 idle worker 一段時間,若有新的 work-item 要處理,就不用重新建立
- Forward Progress
- 系統必須能在需要更多執行上下文時建立新的 worker,才能保證前向進度。此保證仰賴 rescue worker 的機制
- `WQ_MEM_RECLAIM`
### kworker thread 的排程策略
```
chrt -p 27779
pid 27779's current scheduling policy: SCHED_OTHER
pid 27779 目前的排程優先權:0
```
- `WQ_CPU_INTENSIVE` 的影響經過實測,不會影響排程策略跟 nice 值,但跑 mcts 的時候電腦變得不卡了,根據 doc 的描述,它會讓這個 workqueue 的 work 不會阻礙其他 work 的執行
>runnable CPU intensive work items will not prevent other work items in the same worker-pool from starting execution