tip sched/core 的 flat-hierarchy 重构里 tg_cpus() 不像 tg_tasks() 那样 floor 在 1,空 cpuset 给出 0 后穿过 calc_concur_shares() 的 min() 击穿 __calc_smp_shares() 的 MIN_SHARES 兜底,group se 的 load.weight 沦为 0,下一次 enqueue 走 __calc_prop_weight() 触发 #DE。Jake Steinman 提出把 tg_cpus() 改成 max(nr, 1),已合入 tip sched/urgent(commit 2...
tip sched/core 的 flat-hierarchy 重构里 tg_cpus() 不像 tg_tasks() 那样 floor 在 1,空 cpuset 给出 0 后穿过 calc_concur_shares() 的 min() 击穿 __calc_smp_shares() 的 MIN_SHARES 兜底,group se 的 load.weight 沦为 0,下一次 enqueue 走 __calc_prop_weight() 触发 #DE。Jake Steinman 提出把 tg_cpus() 改成 max(nr, 1),已合入 tip sched/urgent(commit 23906f3a1686);但 cpuset_num_cpus() 为何能短暂返回 0 仍是未决问题,第二例 idle 路径复现说明补丁必须并入 urgent 分支。