Skip to content

feat(kernel/posix-timer): 实现 POSIX interval timer,修复 gVisor timers_test#1501

Merged
fslongjin merged 1 commit intoDragonOS-Community:masterfrom
fslongjin:feat-interval-timer
Dec 18, 2025
Merged

feat(kernel/posix-timer): 实现 POSIX interval timer,修复 gVisor timers_test#1501
fslongjin merged 1 commit intoDragonOS-Community:masterfrom
fslongjin:feat-interval-timer

Conversation

@fslongjin
Copy link
Member

  • 新增 timer_create/timer_settime/timer_gettime/timer_getoverrun/timer_delete 系统调用处理,并接入 syscall table
  • 实现进程级 POSIX interval timer:基于 CLOCK_MONOTONIC 的创建/删除/设置/查询、周期性重装与到期调度
  • 完整实现 SIGEV_NONE/SIGEV_SIGNAL/SIGEV_THREAD_ID(限制 THREAD_ID 只能指向当前线程)与 SI_TIMER siginfo(含 si_timerid/si_overrun/si_value)
  • 修复 overrun 语义与信号合并:按线程 pending 队列合并并累积 overrun,避免重复入队导致进程被信号杀死
  • 修复周期性 timer 的 gettime 剩余时间计算与回调窗口返回 0 的问题(PeriodicSilent)
  • 修复定时器回调中信号锁/队列访问导致的自锁死(PeriodicGroupDirectedSignal)
  • clear_child_tid/robust futex 相关用户内存访问改为异常表保护,并避免在失败时继续 futex 操作

- 新增 timer_create/timer_settime/timer_gettime/timer_getoverrun/timer_delete 系统调用处理,并接入 syscall table
- 实现进程级 POSIX interval timer:基于 CLOCK_MONOTONIC 的创建/删除/设置/查询、周期性重装与到期调度
- 完整实现 SIGEV_NONE/SIGEV_SIGNAL/SIGEV_THREAD_ID(限制 THREAD_ID 只能指向当前线程)与 SI_TIMER siginfo(含 si_timerid/si_overrun/si_value)
- 修复 overrun 语义与信号合并:按线程 pending 队列合并并累积 overrun,避免重复入队导致进程被信号杀死
- 修复周期性 timer 的 gettime 剩余时间计算与回调窗口返回 0 的问题(PeriodicSilent)
- 修复定时器回调中信号锁/队列访问导致的自锁死(PeriodicGroupDirectedSignal)
- clear_child_tid/robust futex 相关用户内存访问改为异常表保护,并避免在失败时继续 futex 操作

Signed-off-by: longjin <longjin@DragonOS.org>
@fslongjin
Copy link
Member Author

@claude review this PR in Chinese

@dragonos-community-ai-pr-reviewer
Copy link

dragonos-community-ai-pr-reviewer bot commented Dec 18, 2025

Claude finished @fslongjin's task in 7m 47s —— View job


PR #1501 代码审查

审查任务: 审查POSIX interval timer实现PR

待办事项:

  • 创建待办事项列表并更新GitHub评论
  • 分析PR上下文和变更文件
  • 阅读关键实现文件:posix_timer.rs和timer系统调用文件
  • 审查其他修改文件:signal_types.rs, sighand.rs等
  • 检查测试文件和blocklist修改
  • 提供全面的代码审查反馈(中文)

代码审查报告

总体评价

这是一个高质量的PR,实现了完整的POSIX interval timer功能。代码结构清晰,考虑了信号合并、overrun计数、死锁预防等复杂问题,且遵循了项目的现有模式。实现符合Linux语义,修复了gVisor timers_test测试。

主要优点

  1. 完整的功能实现:支持timer_create/timer_settime/timer_gettime/timer_getoverrun/timer_delete所有相关系统调用
  2. 正确的信号处理:实现了SIGEV_NONE/SIGEV_SIGNAL/SIGEV_THREAD_ID,正确处理SI_TIMER siginfo
  3. Overrun语义正确:按线程pending队列合并并累积overrun,避免重复入队导致进程被信号杀死
  4. 死锁预防:修复了定时器回调中信号锁/队列访问导致的自锁死(PeriodicGroupDirectedSignal)
  5. 时间计算正确:修复周期性timer的gettime剩余时间计算与回调窗口返回0的问题(PeriodicSilent)
  6. 内存安全增强:clear_child_tid/robust futex相关用户内存访问改为异常表保护

详细审查反馈

1. 核心实现 (kernel/src/process/posix_timer.rs)

优点:

  • 代码结构清晰,PosixIntervalTimerProcessPosixTimers设计合理
  • 周期性定时器重装逻辑(第303-316行)避免了gettime()在回调窗口看到0的问题
  • 信号合并与overrun累积逻辑(第349-385行)处理了多种边界情况
  • 自锁死预防(第332-346行)通过局部计算ignored_and_unblocked避免重入锁

潜在问题:

  1. 第285-288行self.pcb.upgrade()失败时直接返回Ok(()),这可能隐藏了PCB已被销毁的问题。建议至少添加日志记录。

    let pcb = match self.pcb.upgrade() {
        Some(p) => p,
        None => {
            // 定时器所属进程已退出,正常情况无需处理
            return Ok(());
        }
    };
  2. 第367行drop(siginfo_guard)后调用send_signal_info_to_pcb,需要确保send_signal_info_to_pcb不会重入相同的锁。从代码看这是安全的,但建议添加注释说明。

  3. 第258-259行timespec_to_duration(&new_value.it_value)?可能返回错误,但会被传播,处理正确。

2. 系统调用实现 (kernel/src/time/syscall/*.rs)

优点:

  • 所有系统调用都使用异常表保护用户内存访问,符合项目安全规范
  • 错误处理完整,参数验证充分
  • 遵循现有syscall模式,代码风格一致

建议:

  1. sys_timer_settime.rs第44行flags != 0直接返回EINVAL,但Linux支持TIMER_ABSTIME等flag。根据PR描述,当前仅支持gVisor测试所需功能,这是合理的限制。建议添加TODO注释说明未来扩展计划。

3. 信号类型扩展 (kernel/src/ipc/signal_types.rs)

优点:

  • PosixSigval正确实现为union类型,符合Linux ABI
  • SigType::PosixTimer枚举设计合理,包含完整信息
  • bump_posix_timer_overrunreset_posix_timer_overrun方法实现清晰

潜在问题:

  1. 第424-433行PosixSigvalDebug实现使用unsafe访问两个字段,虽然安全但可能误导。建议在调试输出中明确标注这是union类型。

4. 信号处理扩展 (kernel/src/ipc/sighand.rs)

优点:

  • 新增的shared_pending_posix_timer_*方法提供了必要的工具函数
  • 锁使用正确,使用inner_mut()获取写锁

5. 进程管理 (kernel/src/process/mod.rs)

优点:

  • clear_child_tid处理增加了错误保护,避免因无效指针panic
  • posix_timers字段添加位置合理,与现有itimers字段并列

建议:

  1. 第480-494行clear_child_tid错误处理改为warn!日志,避免panic,这是正确的改进。建议考虑是否需要记录进程ID以便调试。

6. Futex改进 (kernel/src/libs/futex/futex.rs)

优点:

  • 所有用户内存访问都改为异常表保护版本,提高安全性
  • 错误处理更完善

7. 测试相关

优点:

  • timers_test加入whitelist,说明测试通过
  • 添加了blocklist条目排除不相关的测试

建议改进

  1. 文档补充:在posix_timer.rs文件头部添加更详细的设计文档,说明实现的限制(如仅支持CLOCK_MONOTONIC,THREAD_ID限制等)
  2. 错误日志:在定时器回调中PCB升级失败时添加trace级别日志
  3. 常量定义:考虑将SIGEV_SIGNAL等常量移到更全局的位置,或使用现有定义
  4. 未来扩展:在sys_timer_settime中添加TODO注释说明TIMER_ABSTIME等flag的支持计划

安全性评估

  • ✅ 用户内存访问都使用异常表保护
  • ✅ 锁使用正确,避免了死锁
  • ✅ Unsafe代码范围受限且有合理约束
  • ✅ 错误处理完整,避免panic

测试建议

  1. 除gVisor测试外,建议添加单元测试验证overrun计数、信号合并等复杂逻辑
  2. 考虑边缘情况测试:高频率定时器、信号阻塞、进程退出等

总结

这是一个优秀的实现,代码质量高,考虑了实际使用中的复杂情况。建议合并前补充少量文档和日志改进。

批准状态:建议合并(在补充少量文档后)


CI状态: 运行中(2个workflow)

审查完成时间: 2025-12-18

@fslongjin fslongjin merged commit fa4d785 into DragonOS-Community:master Dec 18, 2025
13 checks passed
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