Skip to content

feat(starry): add syscall and qperf harness#990

Closed
cg24-THU wants to merge 14 commits into
rcore-os:devfrom
cg24-THU:fix/starry-syscall-harness
Closed

feat(starry): add syscall and qperf harness#990
cg24-THU wants to merge 14 commits into
rcore-os:devfrom
cg24-THU:fix/starry-syscall-harness

Conversation

@cg24-THU

@cg24-THU cg24-THU commented May 27, 2026

Copy link
Copy Markdown
Contributor

背景

新增一套 StarryOS harness,用于在 Docker 内执行 Linux 语义对拍和 qperf 性能画像,帮助定位 syscall 兼容性问题与 StarryOS 热点路径。

本分支当前包含三个通过 harness 验证的问题域:

  • ftruncate 作用于只读普通文件 fd 时 errno 与项目期望语义不一致。
  • qperf 需要接入 StarryOS 构建/QEMU/analyzer 流程,并输出可供性能优化迭代使用的结构化报告。
  • harness 需要保留 CLI/MCP 自动化入口,同时提供可选的本地浏览器 UI 进行交互式扫描、性能分析和报告查看。

修改

  • 增加 tools/starry-syscall-harness,包含 syscall probe、Docker harness 入口、本地 UI 和 MCP server。
  • 扩展 MCP tools:starry_syscall_doctorstarry_syscall_discoverstarry_perf_profilestarry_perf_diffstarry_harness_ui_command
  • 增加 harness.py ui:使用标准库 HTTP server 和静态前端,支持 Doctor、syscall scan、qperf profile、perf diff、报告读取、日志轮询和 flamegraph 展示。
  • 扩展 cargo xtask starry perf:支持 qperf TB/insn 采样模式、release/debug profile、top hotspot、物理地址别名映射、可选 kernel filter、folded stack 和 flamegraph 输出。
  • 增强 qperf plugin/analyzer:timeout 场景下及时 flush 样本、支持物理别名映射、symtab fallback、top hotspot、diff 和可选 flamegraph。
  • 增加 qperf performance report:report.jsonreport.mdhotspots.csvqperf/stack.folded
  • 修复 sys_ftruncate 对只读普通文件 fd 的 errno 映射,使其返回 EBADF,同时保留无效 fd 和 O_PATH fd 的 EBADF 行为。
  • 增强 test-ftruncate 回归测试,将只读 fd 场景严格检查为 EBADF
  • 调整 read-only ftruncate probe,以 not_open_for_write 语义字段进行对拍,避免不同宿主环境在 EBADF/EINVAL 表达上的差异造成 harness 误报;StarryOS 回归测试仍严格检查 EBADF
  • MCP server 在未传入 --repo 时从脚本路径自动定位仓库根目录,文档和 skill 示例改用 /path/to/tgoskits 占位路径,避免硬编码本机路径。
  • qperf plugin/analyzer 的 bincode 依赖改回 workspace 依赖,统一版本来源。
  • harness 在生成 rootfs 和执行 starry perf 前刷新 qemu-* defconfig,避免 rebase 到动态平台后复用旧生成配置导致拉入已移除的 QEMU feature。
  • 优化 qperf flamegraph 可读性:生成 3200px 宽 SVG、增大 frame 高度、稳定 hash 配色,并在 UI 中按 SVG 自身宽高展示和滚动。
  • 增加 harness README,并更新项目 skill,记录 syscall、qperf performance、local UI 的使用流程。

验证

  • 修复 --format all/svg 下 qperf analyzer 未启用 flamegraph feature 导致 flamegraph.svg 缺失的问题。
  • python3 -m py_compile tools/starry-syscall-harness/harness.py tools/starry-syscall-harness/mcp_server.py tools/starry-syscall-harness/ui_server.py
  • node --check tools/starry-syscall-harness/web/app.js
  • docker run --rm -v "$PWD":/work -w /work ghcr.io/rcore-os/tgoskits-container:latest bash -lc 'cargo fmt --all --check && cargo xtask clippy --package starry-kernel && cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings && cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings'
  • python3 tools/starry-syscall-harness/harness.py discover --arch riscv64 --timeout 120 --fail-on-diff
    • 结果:result: no syscall semantic differences detected
  • docker run --rm -v "$PWD":/work -w /work ghcr.io/rcore-os/tgoskits-container:latest bash -lc 'cargo xtask starry test qemu --arch riscv64 --test-case syscall'
    • 结果:PASS syscallall starry normal qemu tests passed
  • python3 tools/starry-syscall-harness/harness.py perf-profile --repo-root /home/cg24/tgoskits --arch riscv64 --timeout 10 --format all --freq 49 --max-depth 32 --mode tb --top 8 --min-percent 1 --output-dir target/starry-syscall-harness
    • 结果:result: ok,350 samples,flamegraph_generated = true,生成 qperf/flamegraph.svg
    • SVG 验证:width=3200height=123,UI /api/file 可读取,前端按 SVG 尺寸动态调整 iframe。
  • MCP schema/import 检查,确认 5 个工具均暴露,并验证 starry_harness_ui_command 返回 UI 启动命令。
  • python3 tools/starry-syscall-harness/harness.py ui --host 127.0.0.1 --port 8765
    • curl /api/statuscurl /curl /api/report?kind=syscall&arch=riscv64curl /api/report?kind=perf&arch=riscv64 均成功。
    • POST /api/jobs {"kind":"doctor"} 成功完成,Docker image 和 container tools 检查通过。
    • /work/... Docker artifact 路径映射到本地 target/starry-syscall-harness/... 后可通过 /api/file 读取。
  • python3 tools/starry-syscall-harness/harness.py perf-profile --arch riscv64 --timeout 10 --format folded --top 8 --freq 49 --max-depth 32 --min-percent 1
    • 结果:result: ok,350 samples,生成 report.jsonreport.mdhotspots.csvqperf/stack.folded
  • python3 tools/starry-syscall-harness/harness.py perf-diff --baseline target/starry-syscall-harness/perf/riscv64/latest --compare target/starry-syscall-harness/perf/riscv64/latest --top 3
  • docker run --rm -v "$PWD":/work -w /work ghcr.io/rcore-os/tgoskits-container:latest bash -lc 'cargo fmt --all --check && cargo xtask clippy --package axbuild'
  • docker run --rm -v "$PWD":/work -w /work ghcr.io/rcore-os/tgoskits-container:latest bash -lc 'cargo fmt --manifest-path tools/qperf/Cargo.toml --all --check && cargo fmt --manifest-path tools/qperf/analyzer/Cargo.toml --all --check && cargo clippy --manifest-path tools/qperf/Cargo.toml --all-targets -- -D warnings && cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-targets -- -D warnings'
  • git diff --check

@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 新增 StarryOS syscall/qperf harness 工具链,包含 syscall 差分探测、qperf 性能画像、本地 UI 和 MCP server。工具架构设计合理,Python/Rust 代码语法检查通过。qperf analyzer 的 resolve/diff 子命令、symtab fallback、flamegraph 生成、内核 .text 物理地址别名映射等功能实现完整。

但发现 sys_ftruncate errno 映射与 Linux 不一致,需要修改后才能合并。

关键问题

  1. sys_ftruncate 对只读 fd 返回 EINVAL 而非 EBADF(详见 inline comment)
    • Linux ftruncate(2) man page 明确:fd 未以写模式打开 → EBADF
    • Linux 内核源码 do_sys_ftruncate() 也返回 EBADF
    • 同文件中 file_or_espipe_write() 辅助函数对只读 fd 也返回 BadFileDescriptor
    • 当前代码对 O_PATH fd 正确返回 EBADF,但对普通只读 fd 返回 EINVAL(应为 EBADF

次要问题

  1. mcp_server.py 硬编码用户路径--repo 默认值 /home/cg24/tgoskits 应改为更通用的自动检测或无默认值
  2. bincode workspace dep 改动tools/qperf/Cargo.tomlanalyzer/Cargo.tomlbincode.workspace = true 改为硬编码 bincode = "2.0.1",虽然版本一致但破坏了 workspace 统一管理;建议保留 bincode.workspace = true

亮点

  • qperf analyzer 的 symtab_fallback 在 addr2line 失败时提供兜底符号解析
  • 内核 .text 段物理地址别名映射(通过 axconfig 的 kernel-base-vaddr/kernel-base-paddr)对 qperf 采样准确性至关重要
  • UI server 路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)做得好
  • perf-diff 子命令支持 SVG flamegraph 输出

Powered by mimo-v2.5-pro

Comment thread os/StarryOS/kernel/src/syscall/fs/io.rs Outdated
Comment thread tools/starry-syscall-harness/mcp_server.py Outdated

@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 新增 StarryOS syscall/qperf harness 工具链,包含 syscall 差分探测、qperf 性能画像、本地 UI 和 MCP server。工具架构设计合理,Python 语法检查通过(harness.py、mcp_server.py、ui_server.py 均编译成功)。qperf analyzer 的 resolve/diff 子命令、symtab fallback、flamegraph 生成、内核 .text 物理地址别名映射等功能实现完整。

但发现以下阻塞问题需修改后才能合并:

阻塞问题

  1. sys_ftruncate 对只读 fd 返回 EINVAL 而非 EBADF(详见 inline comment)

    • Linux ftruncate(2) man page:fd 未以写模式打开 → EBADF
    • Linux 内核 do_sys_ftruncate() 源码:error = -EBADF; if (!(f.file->f_mode & FMODE_WRITE)) goto out_putf;
    • POSIX 规定:ftruncate() shall fail with [EBADF] if fildes is not open for writing
    • 同文件中 file_or_espipe_write() 对只读 fd 也返回 BadFileDescriptor
    • 当前代码对 O_PATH fd 正确返回 EBADF,但对普通只读 fd 返回 EINVAL(应为 EBADF
  2. sys_ftruncate 修复缺少回归测试

    • PR body 声称修复了 ftruncate 的 errno 映射,但未包含对应的 syscall 测试用例
    • 验证部分仅描述了 harness 工具链验证,未提供直接的 ftruncate 只读 fd 场景测试
    • 建议在 test-suit/starryos/normal 下添加最小化 syscall 回归测试,验证只读 fd 调用 ftruncate 返回 EBADF

次要问题

  1. mcp_server.py 硬编码用户路径--repo 默认值 /home/cg24/tgoskits 应改为无默认值(required)或复用 harness.py 的 repo_root_from() 自动检测逻辑
  2. SKILL.mddocs 中硬编码路径:MCP 注册示例包含 /home/cg24/tgoskits,建议改为 /path/to/tgoskits 占位符
  3. bincode workspace dep 改动tools/qperf/Cargo.tomlanalyzer/Cargo.tomlbincode.workspace = true 改为硬编码 bincode = "2.0.1",虽然版本一致但破坏了 workspace 统一管理;建议保留 bincode.workspace = true

CI 状态

  • commit status: pending(0 个状态),CI 尚未触发或完成
  • 由于 CI 未运行,无法确认 Rust clippy 和 fmt 在 CI 环境中的通过情况

重复/重叠分析

  • 检查了 dev 分支上 sys_ftruncate 相关历史:PR #466 曾修复过 sys_truncate/sys_ftruncate 的空路径和只读文件检查
  • 检查了 open PRs:PR #995(syscall compatibility test)与本 PR 的 harness 工具链互补,不冲突;PR #976(block driver refactor)、PR #996(task scheduling)与本 PR 无重叠
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,qperf 的 analyzer 扩展(resolve/diff/flamegraph)也是新增功能

亮点

  • qperf analyzer 的 symtab_fallback 在 addr2line 失败时提供兜底符号解析
  • 内核 .text 段物理地址别名映射(通过 axconfig 的 kernel-base-vaddr/kernel-base-paddr)对 qperf 采样准确性至关重要
  • UI server 路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)做得好
  • perf-diff 子命令支持 SVG flamegraph 输出
  • harness.py 的 repo_root_from() 自动检测逻辑设计合理

Powered by mimo-v2.5-pro

Comment thread os/StarryOS/kernel/src/syscall/fs/io.rs Outdated
Comment thread tools/starry-syscall-harness/mcp_server.py Outdated
@cg24-THU
cg24-THU force-pushed the fix/starry-syscall-harness branch from 4b347d5 to 04427fe Compare May 27, 2026 17:37
@cg24-THU

Copy link
Copy Markdown
Contributor Author

已处理本轮 review 反馈并更新分支:

  • sys_ftruncate 对只读普通文件 fd 现在返回 EBADF
  • test-ftruncate 增加严格的只读 fd EBADF 回归检查。
  • MCP server 去掉本机硬编码默认路径,未指定 --repo 时自动定位仓库根目录;文档和 skill 示例改为 /path/to/tgoskits
  • qperf plugin/analyzer 的 bincode 改为 workspace 依赖。
  • harness 在 rootfs/perf 路径前刷新 qemu-* defconfig,避免旧生成配置在 rebase 到动态平台后复用失效 feature。

验证已完成:

  • cargo fmt --all --check
  • cargo xtask clippy --package starry-kernel
  • cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings
  • cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings
  • python3 -m py_compile tools/starry-syscall-harness/harness.py tools/starry-syscall-harness/mcp_server.py tools/starry-syscall-harness/ui_server.py
  • python3 tools/starry-syscall-harness/harness.py discover --arch riscv64 --timeout 120 --fail-on-diff
  • cargo xtask starry test qemu --arch riscv64 --test-case syscall

@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 新增 StarryOS syscall/qperf harness 工具链,并修复 sys_ftruncate 对只读 fd 的 errno 映射。当前 HEAD 已修复此前审查的所有阻塞问题,实现正确,验证通过,无阻塞项。

实现分析

sys_ftruncate 修复(os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增显式 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 行为
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范(fd 未以写模式打开 → EBADF
  • 后续 file.access(FileFlags::WRITE)?.set_len() 与原有 file_or_espipe_write() 模式一致,保持防御性检查

回归测试(test-ftruncate/c/src/main.c):

  • 只读 fd 场景从 EBADF || EINVAL 宽松检查改为严格 CHECK_ERR(..., EBADF, ...),确保修复后的行为可回归验证

harness 工具链:

  • harness.py:syscall 差分探测、Docker 执行、报告生成
  • mcp_server.py:MCP server,使用 repo_root_from() 自动检测仓库根,无硬编码路径
  • ui_server.py:本地 UI,路径安全校验、artifact 白名单
  • qperf profiler/analyzer:新增 resolve/diff 子命令、symtab fallback、kernel .text 物理地址别名映射、flamegraph SVG 生成
  • 文档使用 /path/to/tgoskits 占位符,无硬编码用户路径

此前审查问题修复确认

  1. sys_ftruncate errno 映射:当前 HEAD 返回 EBADF,符合 Linux/POSIX
  2. ✅ 回归测试:test-ftruncate 严格检查 EBADF
  3. ✅ 硬编码路径:mcp_server.py 使用自动检测,文档用占位符
  4. bincode workspace dep:保留 bincode.workspace = true

本地验证

命令 结果
cargo fmt --manifest-path tools/qperf/Cargo.toml --all --check ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/harness.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/mcp_server.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/ui_server.py ✅ 通过
git diff --check ✅ 无空白错误

重复/重叠分析

  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理了空路径和只读文件检查,本 PR 补充了 fd 级别的 O_PATH 和只读标志检查
  • 本 PR 的 harness 工具链在 dev 分支无已有实现
  • 检查了 open PRs:PR #1000(curl test)、PR #1001(ext4 readdir)与本 PR 无重叠
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,qperf 的 analyzer 扩展(resolve/diff/flamegraph)也是新增功能

亮点

  • qperf analyzer 的 symtab_fallback 在 addr2line 失败时提供兜底符号解析
  • 内核 .text 段物理地址别名映射对 qperf 采样准确性至关重要
  • UI server 路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)做得好

Powered by mimo-v2.5-pro

@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 新增 StarryOS syscall/qperf harness 工具链,包含 syscall 差分探测、qperf 性能画像、本地 UI 和 MCP server。同时修复了 sys_ftruncate 对只读 fd 返回 errno 不正确的问题。当前 HEAD (d968767) 已修复此前审查的所有阻塞问题,实现正确,验证通过,无阻塞项。

实现分析

sys_ftruncate 修复 (os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增显式 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 对 O_PATH fd 的行为
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范(fd 未以写模式打开 → EBADF
  • 后续 file.access(FileFlags::WRITE)?.set_len() 保持防御性检查,与 file_or_espipe_write() 模式一致

回归测试 (test-ftruncate/c/src/main.c):

  • 只读 fd 场景从 EBADF || EINVAL 宽松检查改为严格 CHECK_ERR(..., EBADF, ...),确保修复后的行为可回归验证

harness 工具链:

  • harness.py:syscall 差分探测、qperf 性能画像、Docker 执行、报告生成、CLI/MCP/UI 入口
  • mcp_server.py:MCP server,5 个工具(doctor/discover/perf-profile/perf-diff/ui-command),使用 repo_root_from() 自动检测仓库根
  • ui_server.py:本地 UI,路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)
  • qperf profiler/analyzer:新增 timeout flush、物理地址别名映射、symtab fallback、top hotspot、diff、flamegraph(3200px SVG、稳定 hash 配色)
  • 性能报告:生成 report.jsonreport.mdhotspots.csvqperf/stack.folded
  • 文档使用 /path/to/tgoskits 占位符,无硬编码用户路径

apk-curl 测试标记修复 (d968767):

  • 使用 printf '%s ' 替代 echo 输出 PASS/FAIL 标记,避免在 set -x 下标记本身被回显导致匹配误判

此前审查问题修复确认

  1. sys_ftruncate errno 映射:返回 EBADF(非 EINVAL),符合 Linux/POSIX
  2. ✅ 回归测试:test-ftruncate 严格检查 EBADF
  3. ✅ 硬编码路径:mcp_server.py 使用自动检测,文档用占位符
  4. bincode workspace dep:保留 bincode.workspace = true

本地验证

命令 结果
python3 -m py_compile tools/starry-syscall-harness/*.py ✅ 通过
cargo fmt --manifest-path tools/qperf/Cargo.toml --all --check ✅ 通过
cargo fmt --manifest-path tools/qperf/analyzer/Cargo.toml --all --check ✅ 通过
cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings ✅ 通过
cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings ✅ 通过
git diff --check ✅ 无空白错误

重复/重叠分析

  • PR #940feat/qperf-hotspot-enhancement,同一作者 cg24-THU):与本 PR 在 tools/qperf/scripts/axbuild/src/starry/perf.rs 有文件级重叠。PR #940 引入 qperf 基础架构(TCG 插件、analyzer、axbuild perf 集成),本 PR #990 在此基础上扩展(harness 封装、timeout flush、物理别名映射、symtab fallback、diff、flamegraph 增强、性能报告生成)。两者为同一作者的功能分支链,存在合并顺序依赖,建议 #940 先合入后再 rebase 本 PR,或确认本 PR 已包含 #940 的完整变更后关闭 #940
  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理了空路径和只读文件检查,本 PR 补充了 fd 级别的 O_PATH 和只读标志检查,不重复。
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,为全新功能。

亮点

  • qperf analyzer 的 symtab_fallback 在 DWARF 不可用时回退到 ELF .symtab,对 release 内核符号解析至关重要
  • 内核 .text 段物理地址别名映射(kernel-base-vaddr/kernel-base-paddr)对 qperf 采样准确性至关重要
  • UI server 路径安全校验和 artifact 白名单机制设计合理
  • harness 在生成 rootfs 和执行 starry perf 前刷新 qemu-* defconfig,避免 rebase 后复用旧配置导致 QEMU feature 缺失

Powered by deepseek-v4-pro

@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 新增 StarryOS syscall/qperf harness 工具链(CLI/MCP/UI)、修复 sys_ftruncate 对只读 fd 的 errno 映射、增强 qperf analyzer(flamegraph/diff/resolve/symtab fallback)、新增 qperf-metrics 内核计数器、修复 apk-curl 测试标记回显问题。

实现分析

sys_ftruncate 修复 (os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 行为 ✅
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范 ✅
  • 此前审查指出的 EINVAL 问题已修复为 BadFileDescriptor

回归测试 (test-ftruncate/c/src/main.c):

  • 只读 fd 场景从 EBADF || EINVAL 宽松检查改为严格 CHECK_ERR(..., EBADF, ...)
  • 确保修复后的行为可通过 QEMU 回归验证

apk-curl 标记修复 (qemu-*.toml):

  • 使用 printf '%s\n' "$pass_marker" 替代 echo 'APK_CURL_TEST_PASSED',避免 set -x 下标记回显导致匹配误判 ✅
  • scripts/axbuild/src/starry/test.rs 新增防御性单元测试,验证 shell_init_cmd 不嵌入完整 marker 字符串 ✅

harness 工具链:

  • harness.py:syscall 差分探测、qperf 性能画像、Docker 执行、报告生成
  • mcp_server.py:MCP server,5 个工具,使用 repo_root_from() 自动检测仓库根,无硬编码路径 ✅
  • ui_server.py:本地 UI,路径安全校验(禁止逃逸、artifact 白名单)✅
  • Python 语法编译全部通过 ✅

qperf-metrics 内核计数器:

  • drivers/ax-driver/src/qperf_metrics.rs:原子计数器,feature-gated (#[cfg(feature = "qperf-metrics")]) ✅
  • VirtIO block/net 路径注入指标调用,默认构建无性能影响 ✅
  • procfs/qperf_metrics 端点支持读取和 reset ✅

此前审查问题修复确认

  1. sys_ftruncate errno 映射:返回 EBADF(非 EINVAL),符合 Linux/POSIX
  2. ✅ 回归测试:test-ftruncate 严格检查 EBADF
  3. ✅ 硬编码路径:mcp_server.py 使用自动检测,文档用 /path/to/tgoskits 占位符
  4. bincode workspace dep:保留 bincode.workspace = true

本地验证结果

命令 结果
cargo fmt --check ✅ 通过
cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings ✅ 通过
cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/*.py ✅ 通过
git diff --check ✅ 无空白错误
cargo xtask starry test qemu --arch riscv64 --test-case syscall ✅ PASS syscall(含 ftruncate 严格 EBADF 检查)

QEMU 验证详情:在实际 StarryOS QEMU riscv64 环境中运行了完整 syscall 测试组,包括 test-ftruncate 的只读 fd EBADF 严格检查、test_ioctl_fionbio_int(12 pass, 0 fail)、test_sa_restart(4 pass, 0 fail),全部通过。这证明 sys_ftruncate 修复在真实 StarryOS 内核中正确返回 EBADF

CI 状态

  • 无 check runs(CI 尚未触发或不需要 CI)
  • 本地验证覆盖了 fmt、clippy、Python 编译和 QEMU syscall 测试

重复/重叠分析

  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理空路径和只读文件检查,本 PR 补充 fd 级别 O_PATH 和只读标志检查,不重复
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,为全新功能
  • qperf 的 analyzer 扩展(resolve/diff/flamegraph/symtab fallback)也是新增功能
  • 检查了其他 open PRs,无与本 PR 的 harness/qperf/ftruncate 变更重叠的 PR

阻塞问题

合并冲突:当前 PR 的 mergeable_statedirty,与 dev 分支存在冲突。虽然 maintainer_can_modify=true,但需作者 rebase 或合并最新 dev 代码后解决冲突,然后重新验证。建议作者执行:

git fetch upstream dev
git merge upstream/dev  # 或 git rebase upstream/dev
# 解决冲突后重新验证
cargo fmt --check
cargo xtask clippy --package starry-kernel
cargo xtask starry test qemu --arch riscv64 --test-case syscall

亮点

  • qperf analyzer 的 symtab_fallback 在 DWARF 不可用时回退到 ELF .symtab
  • 内核 .text 段物理地址别名映射对 qperf 采样准确性至关重要
  • UI server 路径安全校验和 artifact 白名单机制设计合理
  • apk-curl test.rs 中的防御性断言(禁止完整 marker 出现在 shell_init_cmd)是很好的工程实践
  • vsock 惰性分配优化减少不必要的内存分配

Powered by mimo-v2.5-pro

@mai-team-app
mai-team-app Bot requested review from ZCShou and yfblock May 29, 2026 07:54

@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 新增 StarryOS syscall/qperf harness 工具链(CLI/MCP/UI)、修复 sys_ftruncate 对只读 fd 的 errno 映射、增强 qperf analyzer(flamegraph/diff/resolve/symtab fallback)、新增 qperf-metrics 内核计数器、修复 apk-curl 测试标记回显问题。代码实现正确,验证通过。唯一阻塞项是合并冲突,需要作者 rebase/merge 最新 dev 后解决。

实现分析

sys_ftruncate 修复 (os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 对 O_PATH fd 的行为 ✅
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范 ✅
  • 此前审查指出的 EINVAL 问题已修复为 BadFileDescriptor

回归测试 (test-ftruncate/c/src/main.c):

  • 16 个测试用例覆盖正常截断、扩展、清零、负数 length、无效 fd、已关闭 fd、只读 fd(严格 EBADF)、pipe fd、目录 fd、超大 length、多次截断等场景 ✅
  • 只读 fd 场景严格检查 EBADF,不再接受 EINVAL

harness 工具链:

  • harness.py:syscall 差分探测、qperf 性能画像、Docker 执行、报告生成
  • mcp_server.py:MCP server,5 个工具,使用 repo_root_from() 自动检测仓库根,无硬编码路径 ✅
  • ui_server.py:本地 UI,路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)✅

qperf-metrics 内核计数器:

  • drivers/ax-driver/src/qperf_metrics.rs:原子计数器,feature-gated (#[cfg(feature = "qperf-metrics")]) ✅
  • VirtIO block/net 路径注入指标调用,默认构建无性能影响 ✅
  • procfs/qperf_metrics 端点支持读取和 reset,同样 feature-gated ✅

apk-curl 标记修复:

  • 使用 printf '%s\n' "$pass_marker" + 变量拼接替代 echo 'APK_CURL_TEST_PASSED',避免 set -x 下标记回显导致匹配误判 ✅
  • scripts/axbuild/src/starry/test.rs 新增防御性断言:禁止完整 marker 出现在 shell_init_cmd 中 ✅

此前审查问题修复确认

  1. sys_ftruncate errno 映射:返回 EBADF(非 EINVAL),符合 Linux/POSIX
  2. ✅ 回归测试:test-ftruncate 严格检查 EBADF,16 个用例
  3. ✅ 硬编码路径:mcp_server.py 使用自动检测,文档用 /path/to/tgoskits 占位符
  4. bincode workspace dep:保留 bincode.workspace = true

本地验证结果

命令 结果
cargo fmt --check ✅ 通过
cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings ✅ 通过
cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings ✅ 通过
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/*.py ✅ 通过
git diff --check ✅ 无空白错误
cargo xtask starry test qemu --arch riscv64 --test-case syscall ✅ PASS syscall(含 ftruncate 严格 EBADF 检查)

QEMU 验证详情:在实际 StarryOS QEMU riscv64 环境中运行了完整 syscall 测试组。test-ftruncate 全部 16 个用例通过,关键场景包括:

  • 只读 fd ftruncate 应返回 EBADF → errno=9 as expected
  • fd=-1 应返回 EBADF → errno=9 as expected
  • 已关闭 fd 应返回 EBADF → errno=9 as expected
  • pipe fd 应返回 EINVAL → errno=22 as expected
  • 目录 fd 应返回 EINVAL → errno=22 as expected

其他 syscall 测试(test-xattr 20 pass, test_ioctl_fionbio_int 12 pass, test_sa_restart 4 pass)全部通过。

阻塞问题

合并冲突mergeable_statedirty,与 dev 分支存在 5 处冲突:

  1. drivers/ax-driver/Cargo.toml
  2. drivers/ax-driver/src/block/binding.rs
  3. drivers/ax-driver/src/virtio/block.rs
  4. scripts/axbuild/src/starry/mod.rs
  5. scripts/axbuild/src/starry/perf.rs

虽然 maintainer_can_modify=true,但需要作者 rebase 或 merge 最新 dev 代码后解决冲突,然后重新验证。建议执行:

git fetch upstream dev
git merge upstream/dev  # 或 git rebase upstream/dev
# 解决冲突后重新验证
cargo fmt --check
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings
cargo xtask starry test qemu --arch riscv64 --test-case syscall

重复/重叠分析

  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理空路径和只读文件检查,本 PR 补充 fd 级别 O_PATH 和只读标志检查,不重复
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,为全新功能
  • qperf 的 analyzer 扩展(resolve/diff/flamegraph/symtab fallback)也是新增功能
  • 由于 GitHub API 超时未能完成完整的 open PR 列表扫描,但基于已知数据(PR #940 同一作者的功能分支链),本 PR 与其他 open PR 无冲突

亮点

  • qperf analyzer 的 symtab_fallback 在 DWARF 不可用时回退到 ELF .symtab,对 release 内核符号解析至关重要
  • 内核 .text 段物理地址别名映射(kernel-base-vaddr/kernel-base-paddr)对 qperf 采样准确性至关重要
  • UI server 路径安全校验和 artifact 白名单机制设计合理
  • apk-curl test.rs 中的防御性断言是很好的工程实践

Powered by claude-sonnet-4-20250514

Powered by mimo-v2.5-pro

@mai-team-app mai-team-app Bot mentioned this pull request May 29, 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 新增 StarryOS syscall/qperf harness 工具链(CLI/MCP/UI)、修复 sys_ftruncate 对只读 fd 的 errno 映射、增强 qperf analyzer(flamegraph/diff/resolve/symtab fallback)、新增 qperf-metrics 内核计数器、修复 apk-curl 测试标记回显问题。代码实现正确,本地验证和 QEMU 测试均通过。

唯一阻塞项是合并冲突,需要作者 rebase/merge 最新 dev 后解决。

实现分析

sys_ftruncate 修复(os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 对 O_PATH fd 的行为 ✅
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范 ✅
  • 后续 file.access(FileFlags::WRITE)?.set_len() 保持防御性检查 ✅

回归测试(test-ftruncate/c/src/main.c):

  • 16 个测试用例覆盖正常截断、扩展、清零、负数 length、无效 fd、已关闭 fd、只读 fd(严格 EBADF)、pipe fd、目录 fd、超大 length、多次截断等场景 ✅
  • 只读 fd 场景严格检查 EBADF,不再接受 EINVAL

apk-curl 标记修复(qemu-*.toml):

  • 使用 printf '%s\n' "$pass_marker" 替代 echo 'APK_CURL_TEST_PASSED',避免 set -x 下标记回显导致匹配误判 ✅
  • scripts/axbuild/src/starry/test.rs 新增防御性断言:禁止完整 marker 出现在 shell_init_cmd 中 ✅

harness 工具链:

  • harness.py:syscall 差分探测、qperf 性能画像、Docker 执行、报告生成
  • mcp_server.py:MCP server,5 个工具,使用 repo_root_from() 自动检测仓库根,无硬编码路径 ✅
  • ui_server.py:本地 UI,路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)✅

qperf-metrics 内核计数器:

  • drivers/ax-driver/src/qperf_metrics.rs:原子计数器,feature-gated(#[cfg(feature = "qperf-metrics")])✅
  • VirtIO block/net 路径注入指标调用,默认构建无性能影响 ✅
  • procfs/qperf_metrics 端点支持读取和 reset ✅

vsock 惰性分配优化:

  • poll_vsock_interfaces 中 VSOCK_RX_TMPBUF_SIZE 缓冲区改为 Option 惰性分配,无事件时不分配内存 ✅

Box 枚举优化:

  • starry::Command 枚举包装为 Box<Command>,减小 Cli 枚举栈大小 ✅

本地验证结果

命令 结果
cargo fmt --all --check ✅ 通过
cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings ✅ 通过
cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/harness.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/mcp_server.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/ui_server.py ✅ 通过
git diff --check ✅ 无空白错误
cargo xtask starry test qemu --arch riscv64 --test-case syscall ✅ PASS syscall

QEMU 验证详情:在实际 StarryOS QEMU riscv64 环境中运行了完整 syscall 测试组。test-ftruncate 全部 16 个用例通过,关键场景包括:

  • 只读 fd ftruncate 应返回 EBADF → errno=9 as expected
  • fd=-1 应返回 EBADF → errno=9 as expected
  • 已关闭 fd 应返回 EBADF → errno=9 as expected
  • pipe fd 应返回 EINVAL → errno=22 as expected
  • 目录 fd 应返回 EINVAL → errno=22 as expected
  • 其他 syscall 测试(test-xattr 20 pass, test_ioctl_fionbio_int 12 pass, test_sa_restart 4 pass)全部通过。

阻塞问题

合并冲突:当前 PR 的 mergeable_statedirty,本地验证确认与 dev 分支存在 5 处冲突:

  1. drivers/ax-driver/Cargo.toml
  2. drivers/ax-driver/src/block/binding.rs
  3. drivers/ax-driver/src/virtio/block.rs
  4. scripts/axbuild/src/starry/mod.rs
  5. scripts/axbuild/src/starry/perf.rs

虽然 maintainer_can_modify=true,但需作者 rebase 或 merge 最新 dev 代码后解决冲突,然后重新验证。建议执行:

git fetch upstream dev
git merge upstream/dev  # 或 git rebase upstream/dev
# 解决冲突后重新验证
cargo fmt --check
cargo xtask starry test qemu --arch riscv64 --test-case syscall

CI 状态

  • 无 check runs(CI 尚未触发或不需要 CI)
  • 本地验证覆盖了 fmt、clippy、Python 编译和 QEMU syscall 测试

重复/重叠分析

  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理空路径和只读文件检查,本 PR 补充 fd 级别 O_PATH 和只读标志检查,不重复
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,为全新功能
  • qperf 的 analyzer 扩展(resolve/diff/flamegraph/symtab fallback)也是新增功能
  • 检查了 open PRs(#1002 pip test, #1035 eBPF, #1036 K230 KPU 等),均与本 PR 无重叠

亮点

  • qperf analyzer 的 symtab_fallback 在 DWARF 不可用时回退到 ELF .symtab,对 release 内核符号解析至关重要
  • 内核 .text 段物理地址别名映射(kernel-base-vaddr/kernel-base-paddr)对 qperf 采样准确性至关重要
  • UI server 路径安全校验和 artifact 白名单机制设计合理
  • apk-curl test.rs 中的防御性断言是很好的工程实践
  • vsock 惰性分配优化减少不必要的内存分配

Powered by mimo-v2.5-pro

@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 新增 StarryOS syscall/qperf harness 工具链(CLI/MCP/UI)、修复 sys_ftruncate 对只读 fd 的 errno 映射、增强 qperf analyzer(flamegraph/diff/resolve/symtab fallback)、新增 qperf-metrics 内核计数器、修复 apk-curl 测试标记回显问题。代码实现正确,本地验证和 QEMU 测试均通过。

唯一阻塞项是合并冲突,需要作者 rebase/merge 最新 dev 后解决。

实现分析

sys_ftruncate 修复(os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 对 O_PATH fd 的行为 ✅
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范 ✅
  • 后续 file.access(FileFlags::WRITE)?.set_len() 保持防御性检查 ✅

回归测试(test-ftruncate/c/src/main.c):

  • 只读 fd 场景从 EBADF || EINVAL 宽松检查改为严格 CHECK_ERR(..., EBADF, ...)
  • 16 个测试用例覆盖正常截断、扩展、清零、负数 length、无效 fd、已关闭 fd、只读 fd、pipe fd、目录 fd、超大 length、多次截断等场景 ✅

apk-curl 标记修复(qemu-*.toml):

  • 使用变量拼接 + printf '%s\n' 替代 echo,避免 set -x 下标记回显导致匹配误判 ✅
  • scripts/axbuild/src/starry/test.rs 新增防御性断言:禁止完整 marker 出现在 shell_init_cmd 中 ✅

harness 工具链:

  • harness.py:syscall 差分探测、qperf 性能画像、Docker 执行、报告生成
  • mcp_server.py:MCP server,5 个工具,使用 repo_root_from() 自动检测仓库根,无硬编码路径 ✅
  • ui_server.py:本地 UI,路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)✅
  • Python 语法编译全部通过 ✅

qperf-metrics 内核计数器:

  • drivers/ax-driver/src/qperf_metrics.rs:原子计数器,feature-gated ✅
  • VirtIO block/net 路径注入指标调用,默认构建无性能影响 ✅
  • procfs/qperf_metrics 端点支持读取和 reset ✅

本地验证结果

命令 结果
cargo fmt --all --check ✅ 通过
cargo xtask clippy --package starry-kernel ✅ 通过(14 个 feature 组合)
cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings ✅ 通过
cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/harness.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/mcp_server.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/ui_server.py ✅ 通过
git diff --check ✅ 无空白错误
cargo xtask starry test qemu --arch riscv64 --test-case syscall ✅ PASS syscall

QEMU 验证详情:在实际 StarryOS QEMU riscv64 环境中运行了完整 syscall 测试组。test-ftruncate 全部 16 个用例通过,关键场景:

  • 只读 fd ftruncate 应返回 EBADF → errno=9 as expected
  • fd=-1 应返回 EBADF → errno=9 as expected
  • 已关闭 fd 应返回 EBADF → errno=9 as expected
  • pipe fd 应返回 EINVAL → errno=22 as expected
  • 目录 fd 应返回 EINVAL → errno=22 as expected

其他 syscall 测试全部通过(test-xattr、test_ioctl_fionbio_int、test_sa_restart 等)。

未新增 apps 测试,变更仅涉及 test-suit/starryos/normal/ 下的已有用例。

阻塞问题

合并冲突(详见 inline comment):当前 PR 与 dev 分支存在 7 处冲突:

  1. drivers/ax-driver/Cargo.toml:PR 新增 qperf-metrics feature,dev 新增 pci-list-devices feature
  2. drivers/ax-driver/src/block/binding.rs:PR 的 read/write 逻辑与 dev 重构的 DMA segment 方案冲突
  3. drivers/ax-driver/src/virtio/block.rs:PR 的 rd_block API 与 dev 替换为 rdif_block API 冲突
  4. drivers/blk/rd-block/src/lib.rs:dev 已删除该文件,PR 仍在修改
  5. drivers/interface/rdif-block/src/lib.rs:两边均有修改
  6. scripts/axbuild/src/starry/mod.rs:PR 的 perf 参数与 dev 新增的 --smp 参数冲突
  7. scripts/axbuild/src/starry/perf.rs:PR 的 debug 参数与 dev 的 smp 参数映射冲突

冲突性质:dev 分支对 VirtIO block 驱动进行了重大 API 重构(从 rd_block 接口迁移到 rdif_block 接口,引入 DMA buffer、segment、transfer plan 等新概念)。PR 的 qperf-metrics 指标注入(record_blk_read/record_blk_write 的字节计数)需要适配新 API 的 segment-based 方式计算字节数。

建议作者:

git fetch upstream dev
git merge upstream/dev  # 或 git rebase upstream/dev
# 重点解决:
# 1. 将 qperf-metrics 的 block I/O 字节计数适配到 rdif_block segment API
# 2. 保留 qperf-metrics feature gate 和所有 perf CLI 参数
# 3. Cargo.toml 保留 qperf-metrics 和 pci-list-devices 两个 feature
# 解决冲突后重新验证:
cargo fmt --all --check
cargo xtask clippy --package starry-kernel
cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings
cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings
cargo xtask starry test qemu --arch riscv64 --test-case syscall

CI 状态

  • 无 check runs(CI 尚未触发或不需要 CI)
  • 本地验证覆盖了 fmt、clippy、Python 编译和 QEMU syscall 测试

重复/重叠分析

  • PR #940feat/qperf-hotspot-enhancement,同一作者 cg24-THU):与本 PR 在 tools/qperf/scripts/axbuild/src/starry/perf.rs 有文件级重叠。PR #940 引入 qperf 基础架构,本 PR #990 在此基础上扩展。两者为同一作者的功能分支链。
  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理空路径和只读文件检查,本 PR 补充 fd 级别 O_PATH 和只读标志检查,不重复。
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,为全新功能。

亮点

  • qperf analyzer 的 symtab_fallback 在 DWARF 不可用时回退到 ELF .symtab
  • 内核 .text 段物理地址别名映射对 qperf 采样准确性至关重要
  • UI server 路径安全校验和 artifact 白名单机制设计合理
  • apk-curl test.rs 中的防御性断言是很好的工程实践
  • vsock 惰性分配优化减少不必要的内存分配

Powered by mimo-v2.5-pro

@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 新增 StarryOS syscall/qperf harness 工具链(CLI/MCP/UI)、修复 sys_ftruncate 对只读 fd 的 errno 映射、增强 qperf analyzer(flamegraph/diff/resolve/symtab fallback)、新增 qperf-metrics 内核计数器、修复 apk-curl 测试标记回显问题、增加 ext4 readahead。代码实现正确,Python 验证通过。

唯一阻塞项是合并冲突,需要作者 rebase/merge 最新 dev 后解决。

实现分析

sys_ftruncate 修复 (os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 对 O_PATH fd 的行为 ✅
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范 ✅
  • 后续 file.access(FileFlags::WRITE)?.set_len() 保持防御性检查 ✅

回归测试 (test-ftruncate/c/src/main.c):

  • 只读 fd 场景从 EBADF || EINVAL 宽松检查改为严格 CHECK_ERR(..., EBADF, ...)

harness 工具链:

  • harness.py:syscall 差分探测、qperf 性能画像、Docker 执行、报告生成 ✅
  • mcp_server.py:MCP server,使用 repo_root_from() 自动检测仓库根,无硬编码路径 ✅
  • ui_server.py:本地 UI,路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)✅

qperf-metrics 内核计数器:

  • drivers/ax-driver/src/qperf_metrics.rs:原子计数器,feature-gated ✅
  • VirtIO block/net 路径注入指标调用,默认构建无性能影响 ✅
  • procfs/qperf_metrics 端点支持读取和 reset ✅

ext4 readahead (components/rsext4/src/cache/data_block.rs):

  • DATA_BLOCK_READAHEAD=8readahead_count + load_readahead 实现 ✅
  • get_or_load 改用 load_readahead,减少逐块 I/O 次数 ✅

apk-curl 标记修复 (qemu-*.toml):

  • 使用 printf '%s\n' "$pass_marker" 替代 echo,避免 set -x 下标记回显导致匹配误判 ✅

本地验证结果

命令 结果
python3 -m py_compile tools/starry-syscall-harness/harness.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/mcp_server.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/ui_server.py ✅ 通过

阻塞问题:合并冲突

当前 PR 的 mergeable_statedirty,与 dev 分支存在 7 处冲突

  1. drivers/ax-driver/Cargo.toml:PR 添加 qperf-metrics = [],dev 添加 pci-list-devices = ["list-pci-devices"]
  2. drivers/ax-driver/src/block/binding.rs:dev 已大幅重构 Block binding(使用 Box<dyn Interface> + TransferPlanner + BlockBufferPool),PR 在旧结构上添加 read_blocks_direct 和 qperf 计数
  3. drivers/ax-driver/src/virtio/block.rs:dev 重构了 VirtIO block 实现(新 IQueue trait),PR 添加的 read_blocks_direct 需要移植到新 API
  4. drivers/blk/rd-block/src/lib.rsdev 已删除此文件(被 drivers/interface/rdif-block/ 替代),PR 对此文件的修改无法自动合并
  5. drivers/interface/rdif-block/src/lib.rs:dev 的 IQueue trait 结构已变化,需要将 read_blocks_direct 适配到新的 trait
  6. scripts/axbuild/src/starry/mod.rs:两方都在扩展 ArgsQemu 和相关结构
  7. scripts/axbuild/src/starry/perf.rs:两方都在大幅扩展 perf 子命令

关键问题drivers/blk/rd-block/ 已在 dev 上删除,整个 block driver 架构已重构为 drivers/interface/rdif-block/ + drivers/ax-driver/src/block/。本 PR 添加的 read_blocks_direct 方法和 qperf-metrics 集成需要移植到新的 block driver 接口上。

建议的 rebase 步骤

git fetch upstream dev
git merge upstream/dev  # 或 git rebase upstream/dev

解决冲突时需特别注意:

  • 删除 drivers/blk/rd-block/src/lib.rs(dev 已不使用此文件)
  • read_blocks_direct 移植到 drivers/interface/rdif-block/ 的新 IQueue trait
  • 将 qperf-metrics 的 block 计数注入到 drivers/ax-driver/src/block/binding.rs 的新结构中
  • 将 VirtIO block 的 read_blocks_direct 实现适配到新的 VirtIO block queue API

CI 状态

  • 无 check runs(CI 尚未触发)
  • 本地 Python 验证通过

重复/重叠分析

  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理空路径和只读文件检查,本 PR 补充 fd 级别 O_PATH 和只读标志检查,不重复
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,为全新功能
  • 检查了 open PRs(#1036 K230 KPU, #1035 eBPF, #1002 pip test),均与本 PR 无重叠
  • 同作者的 PR #940(qperf hotspot enhancement)与本 PR 在 tools/qperf/ 有功能链关系,建议确认已包含或关闭

亮点

  • qperf analyzer 的 symtab_fallback 在 DWARF 不可用时回退到 ELF .symtab
  • 内核 .text 段物理地址别名映射对 qperf 采样准确性至关重要
  • UI server 路径安全校验和 artifact 白名单机制设计合理
  • ext4 readahead 对 block I/O 性能有明显提升

Powered by mimo-v2.5-pro

@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 新增 StarryOS syscall/qperf harness 工具链(CLI/MCP/UI)、修复 sys_ftruncate 对只读 fd 的 errno 映射、增强 qperf analyzer(flamegraph/diff/resolve/symtab fallback)、修复 apk-curl 测试标记回显问题。代码实现正确,本地验证通过。

唯一阻塞项是合并冲突,需要作者 rebase/merge 最新 dev 后解决。

实现分析

sys_ftruncate 修复(os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 对 O_PATH fd 的行为 ✅
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范(fd 未以写模式打开 → EBADF)✅
  • 后续 file.access(FileFlags::WRITE)?.set_len() 保持防御性检查 ✅

回归测试(test-ftruncate/c/src/main.c):

  • 16 个测试用例覆盖正常截断、扩展、清零、负数 length、无效 fd、已关闭 fd、只读 fd(严格 EBADF)、pipe fd、目录 fd、超大 length、多次截断等场景 ✅
  • 只读 fd 场景严格检查 EBADF,不再接受 EINVAL

apk-curl 标记修复(qemu-*.toml):

  • 使用 printf '%s\n' "$pass_marker" 替代 echo,避免 set -x 下标记回显导致匹配误判 ✅
  • 标记变量通过拼接拆分(pass_marker=APK_CURL_TEST_ + pass_marker="${pass_marker}PASSED"),防止完整的 PASSED/FAILED 标记出现在 shell_init_cmd 中 ✅
  • scripts/axbuild/src/starry/test.rs 新增防御性断言:禁止完整 marker 出现在 shell_init_cmd 中 ✅

harness 工具链:

  • harness.py:syscall 差分探测、qperf 性能画像、Docker 执行、报告生成
  • mcp_server.py:MCP server,5 个工具,使用 repo_root_from() 自动检测仓库根,无硬编码路径 ✅
  • ui_server.py:本地 UI,路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)✅

qperf analyzer 增强:

  • inferno + object + regex + rustc-demangle 依赖,支持 folded stack → flamegraph SVG 生成 ✅
  • symtab fallback:DWARF 不可用时回退到 ELF .symtab
  • 物理地址别名映射(kernel-base-vaddr/kernel-base-paddr)✅

本地验证结果

命令 结果
cargo fmt --all --check ✅ 通过
cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings ✅ 通过
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings ✅ 通过
cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/*.py ✅ 通过
git diff --check ✅ 无空白错误

Apps 测试 QEMU 验证说明

本 PR 未新增 StarryOS apps 测试用例。修改的测试文件均为已有测试的增强:

  • test-ftruncate:从宽松 EBADF || EINVAL 改为严格 EBADF 检查(回归加强)
  • apk-curl toml:修复 set -x 标记回显问题(测试正确性修复)

无需额外 QEMU 验证。此前多轮审查已在实际 QEMU riscv64 环境验证过 syscall 测试(含 ftruncate 16 个用例),全部通过。

此前审查问题修复确认

  1. sys_ftruncate errno 映射:返回 EBADF(非 EINVAL),符合 Linux/POSIX
  2. ✅ 回归测试:test-ftruncate 严格检查 EBADF,16 个用例
  3. ✅ 硬编码路径:mcp_server.py 使用自动检测,文档用 /path/to/tgoskits 占位符
  4. bincode workspace dep:保留 bincode.workspace = true

阻塞问题

合并冲突:当前 PR 的 mergeable_statedirty,与 dev 分支存在 7 处冲突:

  1. drivers/ax-driver/Cargo.toml
  2. drivers/ax-driver/src/block/binding.rs
  3. drivers/ax-driver/src/virtio/block.rs
  4. drivers/blk/rd-block/src/lib.rs(dev 中已删除,PR 中修改)
  5. drivers/interface/rdif-block/src/lib.rs
  6. scripts/axbuild/src/starry/mod.rs
  7. scripts/axbuild/src/starry/perf.rs

需要作者 rebase 或 merge 最新 dev 代码后解决冲突,然后重新验证。建议执行:

git fetch upstream dev
git merge upstream/dev  # 或 git rebase upstream/dev
# 解决冲突后重新验证
cargo fmt --check
cargo clippy --manifest-path os/StarryOS/kernel/Cargo.toml --all-features -- -D warnings
cargo clippy --manifest-path tools/qperf/Cargo.toml --all-features -- -D warnings
cargo clippy --manifest-path tools/qperf/analyzer/Cargo.toml --all-features -- -D warnings

CI 状态

  • 无 check runs(CI 尚未触发)
  • 本地验证覆盖了 fmt、clippy、Python 编译

重复/重叠分析

  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理空路径和只读文件检查,本 PR 补充 fd 级别 O_PATH 和只读标志检查,不重复
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,为全新功能
  • qperf 的 analyzer 扩展(resolve/diff/flamegraph/symtab fallback)也是新增功能

亮点

  • qperf analyzer 的 symtab_fallback 在 DWARF 不可用时回退到 ELF .symtab,对 release 内核符号解析至关重要
  • 内核 .text 段物理地址别名映射对 qperf 采样准确性至关重要
  • UI server 路径安全校验和 artifact 白名单机制设计合理
  • apk-curl test.rs 中的防御性断言是很好的工程实践

Powered by mimo-v2.5-pro

@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 新增 StarryOS syscall/qperf harness 工具链(CLI/MCP/UI),修复 sys_ftruncate 对只读 fd 的 errno 映射,增强 qperf analyzer(flamegraph/diff/resolve/symtab fallback),新增 qperf-metrics 内核计数器,修复 apk-curl 测试标记回显问题。

代码实现正确,本地验证通过。唯一阻塞项是合并冲突,需要作者 rebase/merge 最新 dev 后解决。

实现分析

sys_ftruncate 修复(os/StarryOS/kernel/src/syscall/fs/io.rs):

  • 新增 FileFlags::PATH 检查 → EBADF,匹配 Linux do_sys_ftruncate() 对 O_PATH fd 的行为 ✅
  • 新增 !FileFlags::WRITE 检查 → EBADF,匹配 POSIX/Linux 规范 ✅
  • 后续 file.access(FileFlags::WRITE)?.set_len() 保持防御性检查 ✅

回归测试(test-ftruncate/c/src/main.c):

  • 只读 fd 场景从 EBADF || EINVAL 宽松检查改为严格 CHECK_ERR(..., EBADF, ...)
  • 该修改是对已有测试用例的收紧,非新增 apps 测试

apk-curl 标记修复(qemu-*.toml):

  • 使用 printf '%s\n' "$pass_marker" 替代 echo 'APK_CURL_TEST_PASSED',避免 set -x 下标记回显导致匹配误判 ✅
  • 修改了 4 个架构的 qemu toml 配置文件

harness 工具链:

  • harness.py:syscall 差分探测、qperf 性能画像、Docker 执行、报告生成
  • mcp_server.py:MCP server,5 个工具,使用 repo_root_from() 自动检测仓库根,无硬编码路径 ✅
  • ui_server.py:本地 UI,路径安全校验(resolve_repo_path 禁止逃逸、artifact 白名单)✅
  • knowledge_graph.py:OS 知识图谱可视化

qperf-metrics 内核计数器:

  • drivers/ax-driver/src/qperf_metrics.rs:原子计数器,feature-gated ✅
  • VirtIO block/net 路径注入指标调用,默认构建无性能影响 ✅
  • procfs/qperf_metrics 端点支持读取和 reset ✅

本地验证结果

命令 结果
python3 -m py_compile tools/starry-syscall-harness/harness.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/mcp_server.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/ui_server.py ✅ 通过
python3 -m py_compile tools/starry-syscall-harness/knowledge_graph.py ✅ 通过
cargo fmt --manifest-path tools/qperf/Cargo.toml --all --check ✅ 通过
git diff --check ⚠️ docs/tg-arceos-tutorial-knowledge-graph-analysis.md:348 多余空行

阻塞问题

合并冲突(阻塞):当前 PR 与 dev 分支存在 7 处冲突:

  1. drivers/ax-driver/Cargo.toml
  2. drivers/ax-driver/src/block/binding.rs
  3. drivers/ax-driver/src/virtio/block.rs
  4. drivers/blk/rd-block/src/lib.rs(dev 分支已删除,PR 中修改)
  5. drivers/interface/rdif-block/src/lib.rs
  6. scripts/axbuild/src/starry/mod.rs
  7. scripts/axbuild/src/starry/perf.rs

需作者 rebase 或 merge 最新 dev 代码后解决冲突,然后重新验证。建议执行:

git fetch upstream dev
git merge upstream/dev  # 或 git rebase upstream/dev
# 解决冲突后重新验证
cargo fmt --check
cargo xtask clippy --package starry-kernel
cargo xtask starry test qemu --arch riscv64 --test-case syscall

次要问题

  1. web/index.html 仍有硬编码路径:第 229-230 行包含 /home/cg24/tg-arceos-tutorial,建议改为 /path/to/repo
  2. docs/tg-arceos-tutorial-knowledge-graph-analysis.md 第 348 行多余空行:建议删除
  3. docs/ 中大量硬编码路径tg-arceos-tutorial-knowledge-graph-analysis.md 包含多个 /home/cg24/ 路径(第 12、20、54、61、105、108、334 行),建议替换为占位符
  4. PR 规模较大:94 文件 +27501 行,包含 PPT 构建脚本(1198 行)、flamegraph 图片和大量文档。核心工具链可考虑独立提交

重复/重叠分析

  • dev 分支上 sys_ftruncate 历史修复(PR #466)仅处理空路径和只读文件检查,本 PR 补充 fd 级别 O_PATH 和只读标志检查,不重复
  • 本 PR 的 harness 工具链在 dev 分支无已有实现,为全新功能
  • 检查了其他 open PRs(#1035 eBPF JIT、#1036 K230 KPU),均与本 PR 无重叠

亮点

  • qperf analyzer 的 symtab_fallback 在 DWARF 不可用时回退到 ELF .symtab
  • 内核 .text 段物理地址别名映射对 qperf 采样准确性至关重要
  • UI server 路径安全校验和 artifact 白名单机制设计合理
  • apk-curl test.rs 中的防御性断言是很好的工程实践

Powered by mai-reviewer

Powered by mimo-v2.5-pro

@ZR233 ZR233 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

这轮先继续请求修改,主要是当前 head 仍不可合入:

  • git merge-tree --write-tree --name-only origin/dev origin/pr/990 仍报告冲突:Cargo.lock、qperf 文档、ax-driver/rdif-block/rd-block、Starry Cargo/axbuild/qperf、apk-curl qemu 配置等。devapk-curl 已迁到 apps/starry/qemu/apk-curl/...,block 侧也已有新的 rdif_block 接口,需要先按当前 dev 语义重放这些改动;Cargo.lock 请在其它冲突解决后用 Cargo 重新生成。
  • 仍有个人本机路径 /home/cg24/...,UI 默认值和文档示例都还会把复现流程绑到作者环境。
  • git diff --check origin/dev...HEAD 失败:docs/qperf-work-handoff.md:648docs/tg-arceos-tutorial-knowledge-graph-analysis.md:348 都有 EOF 空行问题。

本地验证:

  • cargo fmt --check 通过。
  • gh pr checks 990 没有返回检查项。
  • 因分支仍 dirty/conflicted 且 diff check 未过,暂未继续跑 clippy 或 Starry/qperf 用例。

复查了当前 open PR,没有找到与这个 syscall/qperf harness 直接重复的开放 PR;ftruncate 的 BadFileDescriptor 修正本身仍有价值。请先完成 rebase/冲突语义整理、去掉个人路径并修复 diff check,再补充相应的 xtask/clippy/qperf 或 syscall harness 验证。

let use_irq = self.use_irq_completion();
let mut queue = self.queue.lock();
let block_count = buf.len() / block_size;
match queue.read_blocks_direct(block_id as usize, buf) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

这里的 qperf direct-read 改动当前和 dev 上的 block driver / rdif-block 重构冲突。需要先 rebase 到现有的 rdif_block segment/transfer-plan 接口,避免把已经在 dev 删除的 rd-block 路径重新带回来;Cargo.lock 也应在语义冲突解决后重新生成,而不是手工拼接。

<input
id="kg-repo-root"
type="text"
value="/home/cg24/tg-arceos-tutorial"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

这里还保留了作者本机路径作为默认值。UI 默认值建议为空或自动使用当前仓库,示例只放在 placeholder 且使用 /path/to/tgoskits 这类通用路径;否则其他开发者打开页面会直接扫描不存在或错误的目录。


```bash
codex mcp add starry-syscall-harness -- \
python3 /home/cg24/tgoskits/tools/starry-syscall-harness/mcp_server.py \

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

文档里也还保留了 /home/cg24/tgoskits。请把 MCP 注册示例改成 repo-relative、$REPO/path/to/tgoskits,并同步检查其它 docs 里的同类个人路径,保证复现步骤不依赖作者机器。

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