Linux 内核调度器代码的补丁系列已排队,预计将在 Linux 6.18 中引入,以在任务退出用户空间时延迟节流。这些更改将调度器切换到基于任务的节流模型和基于任务的节流时间会计,可以提供延迟优化,并解决实时“RT”内核可能出现的死锁情况。
今天在 tip/tip.git 的”sched/core” Git 分支中排队的是关于重新设计节流代码的补丁。现状问题在补丁的封面信中描述:
CFS 任务可能会在持有其他非节流任务阻塞的锁时被节流。
对于!PREEMPT_RT,这可能导致由于节流引起的资源获取拒绝而出现延迟。
对于 PREEMPT_RT,情况更糟,可能导致死锁:
o CFS 任务 p0 在持有 read_lock(&lock)时被节流
o 任务 p1 在 write_lock(&lock)上阻塞,使得更多读者进入慢路径
o ktimers 或 ksoftirqd 任务在 read_lock(&lock)上阻塞
…
为了解决此问题并改善!PREEMPT_RT 的延迟情况,将节流模型改为基于任务,即当 cfs_rq 被节流时,标记其节流状态,但不要将其从 cpu 的 rq 中移除。相反,对于属于此 cfs_rq 的任务,当它们被选中时,向它们添加任务工作,这样当它们返回用户态时,它们可以被出队。这样,被节流的任务将不会占用任何内核资源。当 cfs_rq 解除节流时,将这些被节流的任务重新入队。”

随着这些补丁现在排队到 sched/core TIP 分支,这项基于任务的节流模型工作应该会在 Linux 6.18 合并窗口中合并,除非 Linus Torvalds 或其他代码问题出现。
转自 Linux Scheduler Adapted For A Latency Win & Avoiding An RT Deadlock – Phoronix
Linuxeden开源社区