Skip to content

Conversation

@sparkzky
Copy link
Collaborator

@sparkzky sparkzky commented Dec 20, 2025

将merge主线和支持后面新增的procfs文件

目前重构之后不知道什么原因,当查看新procfs下的文件或者tab补全路径的时候可能会出现panic,疑似系统意图调度到其他进程上,例子如下

/ # ls proc
1   12  3  5  7  9        cpuinfo  meminfo  self
11  2   4  6  8  cmdline  kmsg     mounts   version
[ ERROR ] (src/debug/panic/mod.rs:43)    Kernel Panic Occurred. raw_pid: 12
Location:
        File: src/sched/mod.rs
        Line: 825, Column: 5
Message:
        assertion `left == right` failed
  left: 18446744073709551615
 right: 0
Rust Panic Backtrace:
[1] function:_Unwind_Backtrace()        (+) 0051 address:0xffff8000003a1be3
[2] function:dragonos_kernel::debug::panic::hook::print_stack_trace()   (+) 0215 address:0xffff8000003713f7
[3] function:__rustc::rust_begin_unwind()       (+) 0794 address:0xffff800000608b5a
[4] function:core::panicking::panic_fmt()       (+) 0029 address:0xffff800000445dad
[5] function:core::panicking::assert_failed_inner()     (+) 0307 address:0xffff80000044631a
[6] function:core::panicking::assert_failed()   (+) 0046 address:0xffff80000044619f
[7] function:dragonos_kernel::sched::schedule()         (+) 0129 address:0xffff8000002646c1
[8] function:dragonos_kernel::syscall::Syscall::handle()        (+) 10581 address:0xffff8000005725f5
[9] function:dragonos_kernel::debug::panic::kernel_catch_unwind()       (+) 0066 address:0xffff800000608c42
[10] function:syscall_handler()         (+) 0248 address:0xffff8000001f0b58
[11] function:syscall_64()      (+) 0101 address:0xffff80000014029d
[ ERROR ] (src/debug/panic/mod.rs:93)    Catch Unwind Error: Any { .. }
[ ERROR ] (src/debug/panic/mod.rs:43)    Kernel Panic Occurred. raw_pid: 12
Location:
        File: src/sched/mod.rs
        Line: 825, Column: 5
Message:
        assertion `left == right` failed
  left: 18446744073709551615
 right: 0
Rust Panic Backtrace:
[1] function:_Unwind_Backtrace()        (+) 0051 address:0xffff8000003a1be3
[2] function:dragonos_kernel::debug::panic::hook::print_stack_trace()   (+) 0215 address:0xffff8000003713f7
[3] function:__rustc::rust_begin_unwind()       (+) 0794 address:0xffff800000608b5a
[4] function:core::panicking::panic_fmt()       (+) 0029 address:0xffff800000445dad
[5] function:core::panicking::assert_failed_inner()     (+) 0307 address:0xffff80000044631a
[6] function:core::panicking::assert_failed()   (+) 0046 address:0xffff80000044619f
[7] function:dragonos_kernel::sched::schedule()         (+) 0129 address:0xffff8000002646c1
[8] function:dragonos_kernel::syscall::Syscall::handle()        (+) 10581 address:0xffff8000005725f5
[9] function:dragonos_kernel::debug::panic::kernel_catch_unwind()       (+) 0066 address:0xffff800000608c42
[10] function:syscall_handler()         (+) 0248 address:0xffff8000001f0b58
[11] function:syscall_64()      (+) 0101 address:0xffff80000014029d
[ ERROR ] (src/debug/panic/mod.rs:93)    Catch Unwind Error: Any { .. }
[ ERROR ] (src/debug/panic/mod.rs:43)    Kernel Panic Occurred. raw_pid: 12
Location:
        File: src/sched/mod.rs
        Line: 825, Column: 5
Message:
        assertion `left == right` failed
  left: 18446744073709551615
 right: 0
Panic Counter: 3, too many panics, halt.

Signed-off-by: sparkzky <sparkhhhhhhhhhh@outlook.com>
Signed-off-by: sparkzky <sparkhhhhhhhhhh@outlook.com>
@fslongjin
Copy link
Member

@claude review this PR in Chinese

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

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

Claude finished @fslongjin's task in 13m 3s —— View job


PR #1514 代码审查

触发用户: LoGin (@fslongjin)
请求: 审查这个PR(中文)

已完成对这个procfs重构PR的代码审查,重点关注了导致panic的问题。

待办事项列表:

  • 1. 创建待办事项列表并分析PR上下文
  • 2. 查看PR变更文件概览
  • 3. 分析panic错误堆栈和根源
  • 4. 审查procfs重构的核心代码
  • 5. 检查与调度器相关的潜在问题
  • 6. 提供代码审查反馈和改进建议
  • 7. 总结审查结果

审查总结

🚨 发现的关键问题

根本原因: RwLock::downgrade()方法存在严重的preempt_count计数bug,导致计数下溢为usize::MAX

具体分析:

  1. RwLockWriteGuard::downgrade()中,写guard被显式drop(调用preempt_enable()
  2. 然后创建读guard(drop时也会调用preempt_enable()
  3. preempt_disable()只在获取写锁时调用一次
  4. 结果是:一次锁获取,两次preempt_enable()preempt_count从0下溢为usize::MAX
  5. 后续调用schedule()时触发断言失败,系统panic

触发场景: 查看procfs文件或tab补全时,频繁调用目录操作,大量使用downgrade()方法。

📊 PR质量评估

架构改进 (优秀):

  • ✅ 模块化设计,提高可维护性
  • ✅ 基于trait的泛型模板系统,代码复用性好
  • ✅ Builder模式简化inode创建
  • ✅ 参考Asterinas的现代化设计

代码质量 (良好):

  • ✅ 大部分代码清晰易读
  • ✅ 适当的错误处理
  • ⚠️ 部分unsafe代码需要更多注释

测试覆盖 (待验证):

  • ⚠️ 需要添加并发测试
  • ⚠️ 需要压力测试验证性能
  • ⚠️ 需要边界条件测试

🔧 修复建议(优先级排序)

紧急修复 (高优先级):

  1. 修复RwLock::downgrade()的preempt计数bug

    • 避免双重preempt_enable()调用
    • 添加标记字段标识通过降级获得的guard
  2. 临时规避方案:

    • 在修复前,procfs中避免使用downgrade()
    • 使用其他缓存策略或直接返回读锁

架构优化 (中优先级):

  1. 添加更多文档注释
  2. 优化锁持有时间,减少对调度的影响
  3. 验证volatile标志的正确性

测试完善 (低优先级):

  1. 添加procfs并发测试
  2. 添加preempt_count平衡测试
  3. 压力测试验证性能

🎯 结论

这个PR在架构设计方面有显著改进,采用了现代化的模板系统。然而,它暴露了一个已有的底层bug(RwLock::downgrade()的preempt计数问题),该bug在旧代码中可能已存在但不易触发。

建议行动:

  1. 立即修复RwLock::downgrade()的bug
  2. 验证修复后procfs操作是否稳定
  3. 继续推进这个PR,因为架构改进很有价值

这个panic不是procfs重构引入的新bug,而是新架构更容易触发了一个已有的底层问题。修复该bug后,这个PR应该可以安全合并。


审查完成时间: 2025-12-20
审查者: Claude
状态: ✅ 完成全面审查,已识别根本原因并提供修复建议

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.

2 participants