W07 - 网卡中断诊断 + 性能测试矩阵收口¶
周期:2026-08-02 ~ 2026-08-08
分支:net-k3
本周做了什么¶
本周完成了两项工作:MMIO 网卡中断链路打通,吸取异步串口经验,提前设计网卡性能测试矩阵。
VirtIO-MMIO 可诊断中断基线¶
为什么先做 IRQ 诊断:异步 RX 需要 ISR → waker → queue task。如果 IRQ 投递没被证明可重复,排障时无法区分是 waker 漏了还是 IRQ 没到。先单独把中断路径跑通,再往上叠异步。
做法:QEMU UART 从全局 hook 迁到 IRQ 10 设备 handler。VirtIO-net 注册 IRQ 7 诊断 handler。诊断 handler 只读 status、分类 cause、写 ACK、更新 Relaxed atomics。不唤醒 queue task,不碰 descriptor。数据面保持 10ms 轮询兜底不变。
三个独立模块:
| 模块 | 文件 | 职责 |
|---|---|---|
| status decoder | classify_mmio_status() |
纯逻辑,将 32-bit 寄存器值解码为可用/已用/错误 cause |
| telemetry | IrqTelemetry |
Relaxed atomic 计数器,记录各类中断发生次数 |
| host harness | 20 个测试 | 覆盖正常、错误、边界与组合 |
VirtIoNetDev 仍以 irq=None 构造,轮询数据面不退化。
验证:12/12 QEMU gates PASS:
- 启动签名、idle 无 spurious IRQ
- UART IRQ 10 独立于 net IRQ 7
- RX、TX、Both 各两次
- 轮询网络阶段 TCP/UDP 回归、协议栈本地化 14/14 回归
- guest C probe 5 modes 全部通过
- ioctl
0x4e494431snapshot 正常
三个 runtime bug 修复:
InterruptStatus/InterruptACK是 32-bit 寄存器(非 u8),按 u8 读写导致计数器全零- device_id=1 是网卡(非 2)
axhal::irq::register接受fn()handler,不是带参数的
commit 2a9319a
网卡性能测试矩阵收口¶
为什么在异步 RX 前做:异步 RX 引入后,性能变化需要对照基线才能判断是改善还是退化。先在轮询态固定 workload、指标、完成语义和记录格式,异步 RX 阶段再用同一套口径比较。
做法:基于已有轮询数据面,定义统一测试体系:
三层结构:
测试目录 N00-N54 覆盖吞吐、延迟、丢包、burst、背压、CPU/IRQ/指令效率。每个测试固定 protocol、direction、payload、flow、profile。
三个拓扑不得合并统计:
| 拓扑 | 用途 | 能证明什么 | 不能证明什么 |
|---|---|---|---|
| guest loopback | 协议栈对照 | syscall、buffer、smoltcp 上层成本 | VirtIO 设备路径 |
| QEMU user-net | 兼容 smoke | hostfwd 下的功能 | 设备路径上限 |
| QEMU TAP | 正式性能基线 | guest 到 host 完整 VirtIO 路径 | 真板 DMA/cache/PHY |
六方向(TCP/UDP × RX/TX/BIDI)是基本执行单位。每个方向输出 manifest、round 和 reason-coded 结果。
三级结果判定:
| 层 | PASS | FAIL |
|---|---|---|
| 执行 | 双端启动并输出 manifest/round | hang、crash、无法建连 |
| 正确性 | fingerprint 一致,C6 账本闭合 | invalid、异常计数或账本不符 |
| 性能 | valid round、采样覆盖负载 | invalid round 或 capability 缺失 |
user-net 六方向已跑通执行资格。有 3 个 invalid(TCP RX partial、UDP RX buffer full、UDP TX late),2 个 valid(TCP TX、部分方向)。这些结果证明命令、协议记录和失败分类机制可运行。不代表性能结论。
不变量:
send()返回只代表 C1 enqueue,不是链路送达- goodput 必须用 C6 receiver 校验字节
- RTT 只在同一时钟域测量
- 缺失 capability 写
unavailable,不写零 - QEMU 与真板分别建立独立基线
- A/B 只允许
treatment字段不同
覆盖状态:
已执行:user-net 六方向执行资格、manifest 校验、工具自测、CPU collector 校准。
已有入口但未运行:TAP 六方向、2/4/8 flows、payload 阶梯、quick/standard profile、UDP pacing、idle CPU 对照。记为 not-run,不等于 PASS。
基础设施缺失:TCP RTT、UDP burst 精确数、背压恢复指标、guest inst/byte、IRQ/packet、timer interference、allocator/descriptor 内部遥测。记为 infrastructure-unavailable。新增支持需要独立的功能需求。
缺口分类规则见资格扫描操作手册。
两张关键文档:
commit 2ccb836
下周¶
两个任务。
轮询网卡测试基线:把测试代码写完,在 QEMU 上跑通轮询网卡的 TAP 六方向、多流和 payload 阶梯,证明测试矩阵可用。
异步网卡开发启动:新开分支,推进异步收包队列的需求分析、方案设计和任务分解。这是第一条异步路径的规划入口,预计持续数周。
参考¶
证据¶
| 阶段 | 证据 | 说明 |
|---|---|---|
| 中断诊断 | 12/12 QEMU gates PASS | IRQ 7 独立于 UART IRQ 10,无 spurious events |
| 中断诊断 | guest C probe 5 modes PASS | idle/tx/rx/both/repeat 全部通过 |
| 中断诊断 | host harness 20/20 PASS | status decoder + telemetry 纯逻辑测试 |
| 测试矩阵 | user-net 六方向 | 证明命令、协议和失败分类可运行 |
| 测试矩阵 | 基准分析文档 | manifest、checksum、collector 均通过 |
| 中断诊断 | 操作记录 | 详细执行步骤与门禁结果 |