test(sched): add sched-family test suite and fix kernel scheduler sys…#986
Conversation
04megumi
commented
May 27, 2026
- initialize sched-family syscall test suite
- add cross-arch qemu test configs
- implement comprehensive userspace scheduler tests
- fix kernel sched_* syscall behavior and policy handling
- pass scheduler family tests on all supported architectures
…calls - initialize sched-family syscall test suite - add cross-arch qemu test configs - implement comprehensive userspace scheduler tests - fix kernel sched_* syscall behavior and policy handling - pass scheduler family tests on all supported architectures
There was a problem hiding this comment.
PR #986 Review: test(sched): add sched-family test suite and fix kernel scheduler syscalls
变更概述
本 PR 做了两件事:
- 内核实现:为
schedule.rs中的sched_getscheduler/sched_setscheduler/sched_getparam/sched_setaffinity补充了实际语义实现,新增check_sched_permission权限检查,在ax-task中为TaskInner添加sched_policy和sched_priority字段。 - 测试用例:在
test-suit/starryos/normal/qemu-smp4/test-sched-family/c/新增了跨四平台(x86_64/aarch64/riscv64/loongarch64)的 scheduler 系统调用综合测试。
阻塞问题:编译失败
ax_hal 不是 starry-kernel 的直接依赖。schedule.rs 将 ax_runtime::hal::* 改为 ax_hal::*,但 os/StarryOS/kernel/Cargo.toml 中只有 ax-runtime(无 ax-hal)。ax_runtime 通过 pub use ax_hal as hal 提供间接访问,但直接 use ax_hal::... 在此 crate 中不可解析。
本地验证结果:
cargo xtask clippy --package starry-kernel
→ error[E0433]: cannot find module or crate `ax_hal` in this scope
(7 个编译错误,14 个配置全部失败)
修复方案(二选一):
- 在
os/StarryOS/kernel/Cargo.toml的[dependencies]中增加ax-hal.workspace = true; - 将
use ax_hal::...改回use ax_runtime::hal::...(保持与现有 crate 依赖结构一致)。
非阻塞观察
check_sched_permission只检查caller.euid == target.uid || caller.euid == target.euid,缺少caller.uid == target.uid的检查。不过这与仓库中已有的setpriority_cred_matches模式一致,暂不阻塞。SCHED_RESET_ON_FORK提取后未实际实现 reset-on-fork 行为,作为首次实现可接受。sys_sched_setscheduler返回 0 而非旧 policy(Linux 返回旧 policy),语义略有差异。sys_sched_setaffinity中check_sched_permission和get_task_by_sched_pid各查一次任务表,存在冗余查找。- 部分新增文件缺少末尾换行(CMakeLists.txt、qemu-riscv64.toml、qemu-x86_64.toml、main.c、test_framework.h)。
ax-task 变更
ax-task 中新增的 sched_policy/sched_priority 字段及对应 getter/setter 编译通过,16 个 clippy 配置全部 OK。
测试评价
- 测试放在
test-suit/starryos/normal/qemu-smp4/test-sched-family/c/,符合项目测试规范。 - 覆盖了
sched_setaffinity、sched_getaffinity、sched_yield、sched_setscheduler、sched_getscheduler、sched_getparam、getpriority等关键系统调用。 - 正确使用
syscall(SYS_...)直接调用避免 libc 掩码。 - 测试框架使用架构适配的 syscall number 定义,覆盖四个平台。
重复/重叠分析
检查了当前所有 open PR(#988、#989、#990 等),未发现与 scheduler 系统调用或测试重叠的 PR。本 PR 无重复风险。
合并冲突
PR 可以与当前 base 干净合并,无冲突。但因编译错误,需先修复后再合入。
Powered by mimo-v2.5-pro
|
|
||
| use ax_errno::{AxError, AxResult}; | ||
| use ax_runtime::hal::time::TimeValue; | ||
| use ax_hal::time::TimeValue; |
There was a problem hiding this comment.
阻塞:ax_hal 不是 starry-kernel 的直接依赖,此行会导致编译失败(error[E0433]: cannot find module or crate ax_hal)。
应改为 use ax_runtime::hal::time::TimeValue;,或在 os/StarryOS/kernel/Cargo.toml 中增加 ax-hal.workspace = true。
同样受影响的还有第 50、70、71、104、138、142 行中所有 ax_hal:: 调用。
|
Prepared a review-fix branch for this PR: https://github.com/cg24-THU/tgoskits/tree/fix/pr986-review Changes included:
Verification in ghcr.io/rcore-os/tgoskits-container:latest:
All checks above passed. I could not push directly to 04megumi/tgoskits:dev because this account does not have write permission to that fork, so the branch above contains the ready-to-apply commits. |
There was a problem hiding this comment.
PR #986 Review(第二轮):test(sched): add sched-family test suite and fix kernel scheduler syscalls
变更概述
本 PR 在内核中实现了 sched_getscheduler/sched_setscheduler/sched_getparam 系统调用的真实语义,新增 check_sched_permission 权限检查,在 ax-task 的 TaskInner 中添加 sched_policy/sched_priority 字段。测试方面在 test-suit/starryos/normal/qemu-smp4/test-sched-family/c/ 下新增了覆盖四架构(x86_64/aarch64/riscv64/loongarch64)的 scheduler 系统调用综合测试。
上轮阻塞问题:已修复 ✅
ax_hal依赖问题:作者在第二个提交5b9e6997a中将use ax_hal::...改为use ax_runtime::hal::{self, time::TimeValue},并通过hal::...间接访问,符合starry-kernel的依赖结构。- 格式问题:作者在第三个提交
627401751中修复了schedule.rs缺少末尾换行的问题。
本地验证结果
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo xtask clippy --package starry-kernel (14 配置) |
✅ 全部通过 |
cargo xtask clippy --package ax-task (16 配置) |
✅ 全部通过 |
CI 状态:前一次提交的 Check formatting / run_host 失败已在新提交中修复。当前 head 的 CI 检测到路径变更后大部分任务为 skipped 状态(非失败)。
代码实现评价
-
check_sched_permission:检查逻辑为has_cap_sys_nice() || caller.euid == target.uid || caller.euid == target.euid,与仓库中已有的setpriority_cred_matches模式一致。虽然 Linux 还检查caller.uid == target.uid/euid,但作为首次实现可接受。 -
sys_sched_setscheduler:策略验证(SCHED_NORMAL/FIFO/RR/BATCH/IDLE)和优先级范围检查正确。RT 策略需要CAP_SYS_NICE,符合 Linux 行为。返回 0 符合 Linux syscall 约定。SCHED_RESET_ON_FORK已提取但未实现,作为首次实现可接受。 -
sys_sched_getparam:正确返回任务的sched_priority,使用#[repr(C)]+bytemuck::Pod保证内存布局安全。 -
ax-task变更:sched_policy/sched_priority使用AtomicI32+Acquire/Release语义,线程安全。默认值 0 对应SCHED_NORMAL和 priority 0。 -
sys_sched_setaffinity:check_sched_permission和get_task_by_sched_pid存在冗余任务查找,但不影响正确性。
测试评价
- 测试放在
test-suit/starryos/normal/qemu-smp4/test-sched-family/c/,符合项目测试规范。 - 使用
syscall(SYS_...)直接调用避免 libc 掩码,覆盖四架构 syscall number 定义。 - 边界条件覆盖全面:EINVAL、ESRCH、EPERM、EFAULT 均有测试。
success_regex = ["(?m)DONE: \\d+ pass, 0 fail"]和fail_regex设计合理,能可靠区分成功/失败。- 测试不是 apps 测试,属于 normal test-suit 用例,无需运行完整 Starry apps 验证。
重复/重叠分析
已检查 open PRs,未发现与 scheduler 系统调用或测试重叠的 PR。现有 qemu-smp4/affinity 测试仅覆盖 sched_setaffinity/sched_getaffinity,本 PR 覆盖完整的 scheduler 系统调用家族,互补而非重叠。
合并冲突
PR 可以与当前 dev base 干净合并,无冲突。
前轮 review 线程
前一轮 inline comment 关于 ax_hal 依赖问题已在当前 head 中修复。该线程已过期(outdated),GitHub 会自动标记为 resolved。
非阻塞建议(可后续改进)
- C/TOML 文件(
test_framework.h、main.c、CMakeLists.txt、qemu-riscv64.toml、qemu-x86_64.toml)仍缺少末尾换行,建议补上以保持一致性。 sys_sched_setaffinity中可将check_sched_permission返回的 task 复用,避免冗余查找。
结论
上轮阻塞问题已全部修复,代码质量良好,测试覆盖充分,无阻塞性问题。推荐合入。
Powered by mimo-v2.5-pro
There was a problem hiding this comment.
PR #986 Review(第三轮):test(sched): add sched-family test suite and fix kernel scheduler syscalls
变更概述
本 PR 在内核中实现了 sched_getscheduler/sched_setscheduler/sched_getparam 系统调用的真实语义,新增 check_sched_permission 权限检查,在 ax-task 的 TaskInner 中添加 sched_policy/sched_priority(使用 AtomicI32 + Acquire/Release 语义,线程安全)。测试方面在 test-suit/starryos/normal/qemu-smp4/test-sched-family/ 下新增了覆盖四架构(x86_64/aarch64/riscv64/loongarch64)的 scheduler 系统调用综合测试。
上轮 review 状态
前两轮 review(2026-05-27 CHANGES_REQUESTED,2026-05-28 APPROVED)的阻塞问题均已修复。当前 head(b677204)在 approval 基础上新增了第四个 commit fix: fmt,具体变更:
- 修复 C/TOML 文件缺失末尾换行的问题(CMakeLists.txt、main.c、test_framework.h、qemu-riscv64.toml)
- 将
qemu-*.toml从c/子目录移至正确的父目录test-sched-family/(符合项目测试结构) - 清理
qemu-x86_64.toml中多余的空行(纯格式整理,内容无变化)
本地验证结果
| 检查项 | 结果 |
|---|---|
cargo fmt --check |
✅ 通过 |
cargo xtask clippy --package starry-kernel (14 配置) |
✅ 全部通过 |
cargo xtask clippy --package ax-task (16 配置) |
✅ 全部通过 |
CI 状态
当前 head(b677204)的所有 CI 检查均为 skipped 状态。这是正常的——CI 路径过滤器检测到变更仅限于测试文件和配置,跳过了与测试路径无关的构建/测试任务。无失败、无取消、无挂起。
QEMU 验证说明
本 PR 添加的是 test-suit/starryos/normal/ 下的 QEMU 测试用例(shell_init_cmd = "/usr/bin/test-sched-family"),不是 apps 测试。测试需要完整的 StarryOS 构建环境和 QEMU 才能运行。由于当前审查环境无法执行完整 QEMU 测试流程(需要交叉编译工具链和 rootfs 镜像),无法在此环境运行。但本地编译验证(fmt、clippy)全部通过,且测试框架设计合理:
success_regex = ["(?m)DONE: \\d+ pass, 0 fail"]可靠区分成功/失败fail_regex同时匹配 panic 和 FAIL 标记- 测试覆盖了 EINVAL、ESRCH、EPERM、EFAULT 等边界条件
- 使用
syscall(SYS_...)直接调用避免 libc 掩码
代码实现评价
-
check_sched_permission:检查has_cap_sys_nice() || caller.euid == target.uid || caller.euid == target.euid,与仓库已有的setpriority_cred_matches模式一致。虽然 Linux 还检查caller.uid == target.uid/euid,但作为首次实现可接受。 -
sys_sched_setscheduler:策略验证(SCHED_NORMAL/FIFO/RR/BATCH/IDLE)和优先级范围检查正确。RT 策略需要CAP_SYS_NICE,符合 Linux 行为。SCHED_RESET_ON_FORK已提取但未实际实现 reset-on-fork 行为,作为首次实现可接受。 -
sys_sched_setscheduler返回 0:Linux 返回旧 policy,当前实现返回 0。测试使用 libcsched_setscheduler()wrapper 验证返回 0,不受此差异影响。后续建议修正为返回旧 policy。 -
ax-task变更:sched_policy/sched_priority使用AtomicI32+Acquire/Release语义,线程安全。默认值 0 对应SCHED_NORMAL和 priority 0。16 个 clippy 配置全部通过。
重复/重叠分析
- 已有的
qemu-smp4/affinity测试仅覆盖sched_setaffinity/sched_getaffinity和 CPU 迁移行为,本 PR 覆盖完整的 scheduler 系统调用家族(scheduler policy、param、priority、yield、getpriority),互补而非重叠。 - 检查了当前 open PRs(#1018、#1019 等),未发现与 scheduler 系统调用或测试重叠的 PR。#1019 是 Axvisor 架构重构,完全无关。
合并冲突
PR 可以与当前 dev base 干净合并,mergeable: true,无冲突。
前轮 review 线程
前一轮 inline comment(关于 ax_hal 依赖问题)已随修复 commit 变为 outdated,GitHub 自动标记为 resolved。
非阻塞建议(可后续改进)
sys_sched_setscheduler可考虑返回旧 policy 以更贴近 Linux 语义sys_sched_setaffinity中check_sched_permission和get_task_by_sched_pid存在冗余任务查找,可合并check_sched_permission可增加caller.uid == target.uid/euid的检查
结论
上轮阻塞问题已全部修复,第四个 commit 进一步修正了文件结构和格式问题。代码质量良好,测试覆盖充分,CI 状态正常(全部 skipped,无失败)。无阻塞性问题,推荐合入。
Powered by mimo-v2.5-pro