feat(axvisor): add dual-guest virtio-net support - #1927
Conversation
There was a problem hiding this comment.
本 PR 新增基于 virtio-mmio 的双 ArceOS guest 内部 L2 网络:通用 VirtIO 队列/MMIO、net/blk crate、AxVisor DMA 访问边界、FDT/VM 配置及 peer TCP 场景。feature-development.md 适用;这是跨 crate、跨 VM、涉及 DMA/IRQ 的高风险共享能力,设计材料位于 docs/design/axvisor-virtio-net.md。starry/syscall.md 不适用,因为未改变 StarryOS 用户 ABI。
阻塞(os/axvisor/src/virtio_net.rs:196):这里的发送路径只把帧写入目标端口的 ingress 队列,没有触发目标 VM 的 poll_dma 或唤醒其 vCPU。RX 帧和 virtio IRQ 仅在 poll_vm_devices 中处理;若服务端已在 accept 中进入 WFI,客户端的 ARP/TCP 帧会留在队列中且没有新的退出事件使服务端再次轮询,双 guest 握手将一直等待到超时。请在成功入队后通过明确的 VM 唤醒/延迟轮询能力调度目标端口(不要在 switch 锁内做),并补充“接收端先阻塞、发送端随后发送”的端到端回归测试。
影响范围是 AxVisor 的 VM 运行时、FDT 中的 virtio-mmio 节点、DMA capability 和 ArceOS virtio-net 驱动路径,非隔离的纯 crate 变更。base 中未发现同等 virtio-mmio net 实现,也未引入 [patch.crates-io];现有评论/审查线程为空,未发现需保留的历史问题。开放 PR 搜索未得到可确认的重复实现(搜索 API 受项目侧限制),已以 base 和变更路径完成比对。
验证:组织 CI 当前 head 的格式、clippy、AxVisor aarch64 QEMU 相关检查为成功(总计 success=28、skipped=37、cancelled=9、failure=1;失败项未显示为本改动专属)。本地 cargo fmt --check、cargo clippy --manifest-path virtualization/axvirtio-common/Cargo.toml --all-features -- -D warnings、cargo clippy --manifest-path virtualization/axvirtio-net/Cargo.toml --all-features -- -D warnings 通过;cargo test -p axvirtio-common -p axvirtio-net -p axvirtio-blk -p axdevice 通过。已依文档启动 scripts/axvisor/build-virtio-net-peer.sh,但首次完整依赖构建未在审查窗口内进入 QEMU;无论该环境限制,当前静态路径已足以证明无法唤醒已阻塞的接收 VM。
测试已覆盖队列、MMIO、单设备 TX/RX 和 switch 转发,但没有覆盖“接收 VM 已 WFI 后对端发送”的跨 VM 唤醒回归。请修复后补充该测试,并重新运行文档中的双 guest QEMU 命令,确认两个 PASS 标记。
Todo 审计:约束、实现、DMA/IRQ/FDT、重复检查、CI 和聚焦验证均已完成;端到端 QEMU 因上述阻塞及首次构建未完成,不能支持批准。
Powered by gpt-5.6-terra
df28b48 to
3b38d58
Compare
There was a problem hiding this comment.
本 PR 新增基于 virtio-mmio 的双 ArceOS guest 内部 L2 网络:通用 VirtIO 队列/MMIO、net/blk crate、AxVisor DMA 访问边界、FDT/VM 配置和 peer TCP 场景。它影响 AxVisor VM 运行时、FDT virtio-mmio 节点、DMA capability、wired IRQ 以及 ArceOS virtio-net 驱动路径,不是隔离的纯 crate 改动。
存在 1 个阻塞问题,见行内评论:目的 guest 已在 accept 的 WFI 中等待时,交换机入队不会触发其 device poll 或 vCPU 唤醒,ARP/TCP 帧会滞留在 ingress 队列,导致双 guest 连接无法推进。
已检查历史 review:此前针对同一 wake/poll 风险的建议在旧 commit 上提出,技术上合理;当前 head 仍保留该路径,尚未解决。PR 评论为空。base 中未发现等价 virtio-mmio net 实现;开放 PR 中仅 #1926 是本分支已包含的 PSCI/FDT 前置提交,未发现重复的网络实现。
CI:当前 head 的组织检查共 75 项,格式、clippy 和 AxVisor aarch64 QEMU(smoke + axtest)相关检查成功;有 1 项失败,但检查汇总未表明其由本改动导致,另有路径选择产生的 skipped 项。根据已通过的 CI,不重复运行同类本地测试。已额外确认工作区 head 为 3b38d5819a6d03345f2f2d20bd033a71843d9ce7、工作区干净,且 git diff --check origin/dev...HEAD 通过。
现有单元测试覆盖队列、MMIO、单设备 TX/RX 和 switch 转发;但缺少“接收 VM 已阻塞、对端随后发送”的跨 VM 唤醒回归。请修复后补充该场景,并重新运行文档中的双 guest QEMU 命令,确认两个 PASS 标记。
Powered by gpt-5.6-terra
3b38d58 to
c2c7c31
Compare
There was a problem hiding this comment.
本 PR 新增 AxVisor 内部 virtio-mmio 双 ArceOS guest L2 网络:通用 VirtIO 队列/MMIO、virtio-net、DMA capability、FDT/VM 配置和双 guest TCP peer 场景。book/guideline/feature-development.md 适用;这是跨 crate、跨 VM 且涉及 DMA/IRQ 的高风险共享能力,设计材料在 docs/design/axvisor-virtio-net.md。starry/syscall.md 不适用,因为没有改变 StarryOS 用户 ABI。
存在 1 个阻塞问题,见行内评论:axvirtio-blk 是完整的新公共设备 crate,却没有 AxVisor 调用方、设备注册、VM 配置、FDT 节点或端到端运行验证;它不应作为本次仅完成 virtio-net 主路径的附带维护面合入。
已复核此前的 wake/poll 评论:其技术前提合理,当前 head 已通过 switch 的锁外 wake capability、notify_vm_vcpu 和 vCPU 顶部 DMA poll 修复该路径;本地双 guest QEMU 实际出现两个 PASS 标记,因此该旧问题不再阻塞。PR 评论为空。base 中未发现等价 virtio-mmio net 实现;与本 PR 的两条提交、变更路径比对后未发现可确认的重复实现或依赖 PR。
验证:cargo fmt --all --check、git diff --check origin/dev...HEAD、cargo test -p axvirtio-common -p axvirtio-net -p axvirtio-blk -p axdevice 均通过;cargo xtask clippy --package axvirtio-common|axvirtio-net|axvirtio-blk|axdevice 均通过。按文档执行 scripts/axvisor/build-virtio-net-peer.sh:两个 ArceOS aarch64 guest 均构建完成,QEMU 在当前 head 运行结束且匹配 VM1_VIRTIO_NET_PASS 与 VM2_VIRTIO_NET_PASS。组织 CI 的路径检测与 container lint 成功;有一个 Check formatting / run_host 失败,但本地同一格式检查通过,未取得可归因的失败日志,需作者同时确认该 job。
测试覆盖队列、MMIO、描述符、net 收发、switch 转发、资源/DMA grant 和双 guest QEMU;新 net 主路径的运行证据充分。阻塞项仅为未接入的 virtio-blk 额外 surface。Todo 审计已完成:约束/设计、实现、DMA/IRQ/FDT、历史评论、重复检查、CI 和运行验证均已检查;须先处理行内 blocker 才能合入。
Powered by gpt-5.6-terra
50b6bcb to
e44f6c9
Compare
There was a problem hiding this comment.
本 PR 新增 AxVisor 内部 virtio-mmio 双 ArceOS guest L2 网络:通用 VirtIO 队列/MMIO、virtio-net、DMA capability、FDT/VM 配置,以及双 guest TCP peer 场景。book/guideline/feature-development.md 适用;这是跨 crate、跨 VM、涉及 DMA/IRQ 的高风险共享能力,设计材料位于 docs/design/axvisor-virtio-net.md。starry/syscall.md 不适用,因为未改变 StarryOS 用户 ABI。
存在 1 个阻塞问题,见行内评论:新增 QEMU peer case 把两个 PASS 标记列为 success_regex,但 runner 对列表采用任一匹配语义,不能保证两个 guest 都完成。因此该端到端回归可在另一 guest 随后失败、退出或卡死时仍报告成功。
影响范围包括 AxVisor VM 运行时、FDT virtio-mmio 节点、DMA capability、wired IRQ 及 ArceOS virtio-net 驱动路径,非隔离的纯 crate 变更。已复核历史 wake/poll blocker:当前 head 的 switch 锁外 wake capability、notify_vm_vcpu 与 vCPU0 顶部 DMA poll 已解决该路径;现有历史评论对此有具体修复说明。此前未接入的 axvirtio-blk crate 也已从当前 head 移除。base 中未发现等价 virtio-mmio net 实现;开放 PR 搜索和变更路径比对未发现可确认的重复实现。工作区已有 [patch.crates-io],但本 PR 没有新增或修改该 override。
CI:当前 head 共 75 项,格式、clippy 与 AxVisor aarch64 QEMU 相关检查成功;唯一失败为 Test axvisor x86_64 ACPI direct and OVMF boot (vmx) / run_host,其 annotation 仅为 exit 1,且与新增的 aarch64 virtio-net peer 路径没有可确认归因。组织 CI 已覆盖同类 crate 检查;本地补充验证:cargo fmt --check、git diff --check origin/dev...HEAD、cargo test -p axbuild qemu_success --lib、cargo test -p axvirtio-common -p axvirtio-net -p axdevice、以及 axvirtio-common/net 的 cargo clippy --all-features -- -D warnings 均通过。
测试覆盖队列、MMIO、net 收发、switch 转发和双 guest QEMU,但其成功契约是当前遗漏:测试 runner 的实现明确以 OR 处理多个 success_regex。请改为单一、顺序无关且同时要求两个 PASS 标记的正则,或为 runner 增加 all-of 语义,并加入“仅一个标记出现必须失败”的回归测试。修复后请重新运行文档中的双 guest QEMU 命令。
Todo 审计:约束/设计、实现、DMA/IRQ/FDT、历史评论、重复检查、CI 和聚焦验证均完成;上述测试成功条件未能证明功能完成,故不能批准。
Powered by gpt-5.6-terra
依赖
#1926 的 guest FDT/PSCI 修复已合入
dev;本分支已基于合入后的dev重放,仅保留 VirtIO 功能差异。问题
AxVisor 当前缺少基于统一设备模型、scoped guest DMA 和 VirtIO MMIO 的网络设备实现,无法让两个 ArceOS guest 通过内部虚拟网络完成通信验证。
修改
VirtioNetRuntimeDevice生产消费者、设备注册和端到端测试。axvirtio-common和axvirtio-netcrate,提供 VirtIO MMIO transport、split virtqueue、网络设备核心和二层虚拟交换机。axvirtio-blk延后到具有真实 block consumer 和运行验证的独立 PR。virtio-netdevice model,支持 scoped DMA、TX/RX queue、wired IRQ 和两个 guest 共享的内部 L2 switch。ax-driver增加virtio,mmioFDT 探测,并保留 FDT IRQ binding。interrupt-parent和dma-coherent的 guest FDT 节点。实现逻辑
VirtIO queue 与设备协议逻辑保持在独立
no_stdcrate 中;AxVisor glue 负责设备资源、DMA capability、IRQ 和 switch port 生命周期。DMA polling API 与实际消费者处于同一 PR:设备注册后,vCPU 运行循环驱动VirtioNetRuntimeDevice处理队列,每次 poll 仅使用短生命周期 guest-memory capability。交换机只复制帧到有界 ingress queue,不持有 VM 或 VirtIO 设备内部对象。验证
端到端测试在“服务端先进入
accept、客户端随后连接”的场景下已通过:非目标
本 PR 不包含物理 NIC uplink、multi-queue、offload、live migration 或设备直通。