Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • O OSKernel2026-StellaOS
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Metrics
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • StellaOS
  • OSKernel2026-StellaOS
  • Merge requests
  • !40

fix: sys_sched_yield 错误阻塞任务导致 waitpid 永久挂死

  • Review changes

  • Download
  • Patches
  • Plain diff
Merged StellaOS requested to merge fix_waitpid into main Jun 05, 2026
  • Overview 0
  • Commits 1
  • Pipelines 0
  • Changes 8

根因: musl 的 sched_yield() 调用 syscall 124 (SYS_sched_yield),内核对应 sys_sched_yield() 错误地调用了 block_current_task(),将任务状态设为 Blocked 且永不重新加入就绪队列。子进程在执行 sched_yield() 后从调度器 中彻底消失,父进程在 wait4 中永远等不到子进程退出。

修复: os/src/syscall/stub.rs — sys_sched_yield() 改为调用 suspend_current_and_run_next(),正确执行 Ready → add_task → schedule。

诊断过程: 通过 [switch]/[pf]/[sched] suspend|block 日志追踪调度路径,发现关键 线索 [sched] block pid=2(应为 suspend)。确认子进程 COW 缺页处理成功 后执行 sched_yield → syscall 124 → block_current_task 而非预期的 suspend_current_and_run_next。

关联改动:

  • os/src/syscall/process.rs: sys_wait4 增加诊断日志 (ENTER/ECHILD/REAP/BLOCK/WOKE)
  • os/src/task/mod.rs: exit_current_and_run_next 增加 [exit] 日志
  • os/src/task/processor.rs: idle 日志注释化
  • os/src/task/manager.rs: add_task/fetch_task 调试日志清理
  • user/src/bin/initproc.rs: 取消 waitpid 等 26 个通过测试的注释

结果: 全部 26 项 basic 测试通过 (新增 waitpid + wait)。

Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: fix_waitpid