Skip to content

test+kernel(sched): align scheduler family syscalls with Linux behavior#962

Closed
04megumi wants to merge 8 commits into
rcore-os:devfrom
04megumi:test-sched-family
Closed

test+kernel(sched): align scheduler family syscalls with Linux behavior#962
04megumi wants to merge 8 commits into
rcore-os:devfrom
04megumi:test-sched-family

Conversation

@04megumi

Copy link
Copy Markdown
Contributor

No description provided.

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 概述

本 PR 将 StarryOS 的调度器族系统调用(sched_getscheduler/sched_setscheduler/sched_getparam/sched_setaffinity)与 Linux 行为对齐。核心改动:

  1. axtask::TaskInner 中新增 sched_policyAtomicI32)和 sched_priorityAtomicI32)字段,支持每个任务独立的调度策略和优先级存储。
  2. 实现了 check_sched_permission() 权限检查函数,遵循 Linux 的 CAP_SYS_NICE / euid 匹配语义。
  3. sched_setaffinity 新增权限检查,sched_setscheduler 从空实现改为完整的策略/优先级校验与存储,sched_getscheduler 从硬编码 SCHED_RR 改为读取任务实际策略,sched_getparam 从空实现改为读取实际优先级。
  4. 新增 test-sched-family 测试用例,覆盖 4 架构(x86_64/aarch64/riscv64/loongarch64),包含正常路径、EINVAL/ESRCH/EFAULT 错误路径和 fork 权限测试。

重复/重叠分析

  • origin/dev 上搜索了 sched_policysched_prioritysched_setscheduler 等符号:基础分支无对应字段存储和完整实现(sched_getscheduler 硬编码返回 SCHED_RRsched_setscheduler/sched_getparam 为空操作)。
  • 检查了当前所有开放 PR(#963 HAL 重构、#961 RISC-V 动态平台等),未发现与调度器族系统调用重叠的 PR。
  • 本 PR 与已有工作无重复或冲突。

实现逻辑分析

整体方向正确,sched_setscheduler 的策略范围校验(SCHED_NORMAL/BATCH/IDLE 要求 prio==0,SCHED_FIFO/RR 要求 prio∈[1,99])符合 Linux 语义。sched_setaffinitysched_setscheduler 的权限检查也符合 Linux 行为。

但存在一个与 Linux 语义不一致的阻塞性问题,详见行内评论。

测试覆盖

  • 测试放置位置 test-suit/starryos/normal/qemu-smp4/test-sched-family 正确。
  • 4 架构 QEMU 配置齐全,success_regexfail_regex 设置合理。
  • 测试覆盖了 sched_setaffinity/sched_getaffinitysched_yieldsched_setscheduler/sched_getschedulersched_getparamgetpriority 的正常路径和错误路径(EINVAL/ESRCH/EFAULT/EPERM)。
  • fork 权限测试设计合理,能够覆盖跨进程的权限场景。

结论

存在一个阻塞性问题:sched_getparam 不应包含权限检查。修复后可以重新审查。

Powered by glm-5.1

Comment thread os/StarryOS/kernel/src/syscall/task/schedule.rs Outdated
Ok(task.sched_policy() as isize)
}

pub fn sys_sched_setscheduler(_pid: i32, _policy: i32, _param: *const ()) -> AxResult<isize> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 建议:sched_setscheduler 未处理 SCHED_RESET_ON_FORK 标志位

Linux 允许在 policy 参数中 OR 上 SCHED_RESET_ON_FORK(0x40000000)标志。当前实现直接将 _policy as u32SCHED_NORMAL 等常量比较,会导致带该标志的合法调用被误判为 EINVAL。

建议在策略校验前先剥离该标志:

const SCHED_RESET_ON_FORK: u32 = 0x40000000;
let reset_on_fork = (policy & SCHED_RESET_ON_FORK) != 0;
let policy = policy & !SCHED_RESET_ON_FORK;

然后在设置任务时存储 reset_on_fork 状态(或在当前阶段先忽略其语义,只做标志剥离以避免 EINVAL 误判)。

@04megumi 04megumi closed this May 26, 2026

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 概述

本 PR 将 StarryOS 的调度器族系统调用与 Linux 行为对齐,核心改动:

  1. axtask::TaskInner 中新增 sched_policyAtomicI32)和 sched_priorityAtomicI32)字段
  2. 新增 check_sched_permission() 权限检查函数(CAP_SYS_NICE / euid 匹配语义)
  3. sched_getscheduler 从硬编码 SCHED_RR 改为读取任务实际策略
  4. sched_setscheduler 从空实现改为完整的策略/优先级校验与存储,含 SCHED_RESET_ON_FORK 标志剥离
  5. sched_getparam 从空实现改为读取实际优先级(无权限检查,符合 Linux 语义)
  6. sched_setaffinity 新增权限检查
  7. 新增 test-sched-family 测试用例,覆盖 4 架构,包含正常路径和 EINVAL/ESRCH/EFAULT/EPERM 错误路径

之前审查问题处理情况

mai-team-app[bot] 在 commit 173cf72b 上的两个阻塞性问题已在最新 commit e1615e10 中解决:

  • sched_getparam 已移除 check_sched_permission 调用,符合 Linux "No special permissions are needed" 语义
  • SCHED_RESET_ON_FORK 标志已在 sched_setscheduler 中正确剥离并接受

实现逻辑分析

  • 策略范围校验(SCHED_NORMAL/BATCH/IDLE 要求 prio==0,SCHED_FIFO/RR 要求 prio∈[1,99])完全符合 Linux sched_setscheduler(2) 语义 ✓
  • check_sched_permission 对 pid==0(自身)直接返回 Ok,对其他进程检查 CAP_SYS_NICE / euid 匹配,符合 Linux 行为 ✓
  • sched_getschedulersched_getparam 不做权限检查,符合 Linux 语义 ✓
  • SchedParam 使用 #[repr(C)] + bytemuck::Pod 安全转换,正确 ✓
  • sched_policy 默认值为 0(即 SCHED_NORMAL),sched_priority 默认值为 0,正确 ✓

测试覆盖

  • 测试放置于 test-suit/starryos/normal/qemu-smp4/test-sched-family,位置正确 ✓
  • 4 架构 QEMU 配置齐全,success_regex / fail_regex 设置合理 ✓
  • 覆盖正常路径 + EINVAL/ESRCH/EFAULT/EPERM 错误路径 + fork 权限测试 ✓

重复/重叠分析

  • 基础分支 origin/devsched_policy/sched_priority 字段存储和完整实现(sched_getscheduler 硬编码 SCHED_RRsched_setscheduler/sched_getparam 为空操作)
  • 当前开放 PR(#963 HAL 重构、#837 kallsyms、#850 等)与调度器族系统调用无重叠

CI 状态

所有 CI 检查均为 skipped(fork 来源 PR 的正常行为),非本 PR 导致。

非阻塞性建议

详见行内评论。sched_getparam 中可用 bytemuck::bytes_of() 替代 unsafe 块,参数命名中的下划线前缀(_pid_policy_param)应移除以反映实际使用。_reset_on_fork 目前未存储,sched_getscheduler 不会返回该标志——作为增量实现是合理的,未来完善时需注意。

结论

代码正确性良好,Linux 语义对齐准确,测试覆盖充分,之前的阻塞性问题已全部解决。建议合入。

Powered by glm-5.1

Comment thread os/StarryOS/kernel/src/syscall/task/schedule.rs
Comment thread os/StarryOS/kernel/src/syscall/task/schedule.rs
Comment thread test-suit/starryos/normal/qemu-smp4/test-sched-family/c/src/main.c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant