Skip to content

fix(starry-perf): separate control and IRQ output locks - #1793

Merged
ZR233 merged 1 commit into
devfrom
codex/fix-starry-perf-control-locks
Jul 31, 2026
Merged

fix(starry-perf): separate control and IRQ output locks#1793
ZR233 merged 1 commit into
devfrom
codex/fix-starry-perf-control-locks

Conversation

@ZR233

@ZR233 ZR233 commented Jul 31, 2026

Copy link
Copy Markdown
Member

问题

PerfEvent 当前用一个 SpinNoPreempt 同时保护任务控制路径和 eBPF 输出路径。readioctlmmap 等任务上下文操作会在该锁内调用具体 perf event 的回调,而这些回调允许分配内存、缺页或调度;因此一旦回调发生调度,就会触发 atomic-context panic。

这个问题可以从 #17752f4e8cb 独立提取,不依赖该 PR 的调度器、网络或其他架构改动。

修改

  • PerfEvent 的任务控制面改为 ax_sync::Mutex,允许回调在任务上下文中安全睡眠或调度。
  • 为 BPF perf event 拆出可克隆的 BpfPerfOutput
    • 只暴露有界的 ring 写入状态;
    • 使用 SpinNoIrq 保护 IRQ/trace producer 可访问的状态;
    • 写入完成后再通过 IrqNotify 延迟唤醒 poll waiter。
  • 将全局 fd 到 perf event 的弱引用表改为 SpinNoIrq,避免同 CPU IRQ 重入。
  • device_mmap 在短自旋锁外完成连续页分配,并在发布映射前重新检查状态;VMA 继续持有强引用,输出状态只保留 Weak,不改变原有页生命周期。
  • PERF_EVENT_IOC_SET_OUTPUT 先快照目标输出再锁定源事件,避免两个可睡眠锁嵌套。
  • 增加确定性 axtest:控制回调主动 yield_now(),验证 perf 控制面没有禁用抢占。

本修改不新增 syscall、属性布局或 errno 语义;perf_event_openreadioctlmmapbpf_perf_event_output 的用户 ABI 保持不变。

回归证据

在修复前,仅加入回归测试后运行:

cargo xtask ktest qemu --package starry-kernel --test axtest_kernel --arch x86_64

稳定触发:

sleeping or rescheduling is not allowed in atomic context
reasons=[preempt_disabled]

应用修复并重放到最新 dev 后,同一命令通过:

AXTEST_SUMMARY pass=396 fail=0 skip=0 total=396
AXTEST_SUITE_OK

其他本地检查:

  • cargo xtask clippy --package starry-kernel:24/24 checks passed
  • cargo fmt --all -- --check
  • git diff origin/dev...HEAD --check

真实 ebpf/sched_trace QEMU 用例完成了用户态程序和 StarryOS 编译,但现有 x86_64 app 启动配置在进入内核前被 QEMU 拒绝:

qemu-system-x86_64: Error loading uncompressed kernel without PVH ELF Note

该配置与 origin/dev 一致;因此没有把这个未进入内核的运行记为通过。物理板和 self-hosted 流程未在本地执行。

与现有 PR 的关系

@ZR233
ZR233 marked this pull request as ready for review July 31, 2026 02:45

@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 将 PerfEvent 的任务控制面改为可睡眠的 Mutex,并将 eBPF 软件事件输出拆为 IRQ 安全的 SpinNoIrq 能力端点,从而避免控制回调在禁抢占上下文中分配、缺页或调度。映射页仍由 VMA 强引用持有,SET_OUTPUT 先快照目标再锁定源事件,锁顺序和页面生命周期均保持清晰。

影响范围限于 Starry perf 内部并发控制;已检查 perf_event_openreadioctlmmapbpf_perf_event_output 的入口、参数和 errno 路径,未见用户 ABI 变化。feature-development.md 不适用:这是不扩展功能边界的 bug 修复;starry/syscall.md 不适用:没有改变用户态 syscall 语义。新增 axtest 通过主动 yield_now() 覆盖修复前的禁抢占回归,且位于现有 axtest_runtime 注册路径中。

验证:review_pr_helper.py test 通过;helper 已识别 starry-kernel 变更;cargo fmt --all -- --checkgit diff --check origin/dev...HEAD 通过。组织当前头 CI:81 项中 success=38、skipped=40、cancelled=3(取消项为 stale-run;无 failure),相关格式与 clippy 检查已通过,依照要求未重复完整本地测试。无既有评审评论或线程。

重复/重叠检查:base 不含此锁分层修复;#1577#1601#1602#1603 仅在 perf 表面有后续整合冲突风险,并未实现本修复。未发现 crates.io patch、冲突或新增/变更 app 的运行时适用项。无遗留问题。

Powered by gpt-5.6-terra

@ZR233
ZR233 merged commit a2fc3af into dev Jul 31, 2026
78 of 81 checks passed
@ZR233
ZR233 deleted the codex/fix-starry-perf-control-locks branch July 31, 2026 04:10
This was referenced Jul 31, 2026
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