Skip to content

feat(axvisor): add dual-guest virtio-net support - #1927

Open
luodeb wants to merge 4 commits into
rcore-os:devfrom
doubao-coding:debin/virtio-net-feature
Open

feat(axvisor): add dual-guest virtio-net support#1927
luodeb wants to merge 4 commits into
rcore-os:devfrom
doubao-coding:debin/virtio-net-feature

Conversation

@luodeb

@luodeb luodeb commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

依赖

#1926 的 guest FDT/PSCI 修复已合入 dev;本分支已基于合入后的 dev 重放,仅保留 VirtIO 功能差异。

问题

AxVisor 当前缺少基于统一设备模型、scoped guest DMA 和 VirtIO MMIO 的网络设备实现,无法让两个 ArceOS guest 通过内部虚拟网络完成通信验证。

修改

  • 在本 PR 中提供 DMA polling capability,并接入真实的 AxVisor VirtioNetRuntimeDevice 生产消费者、设备注册和端到端测试。
  • 新增可复用的 axvirtio-commonaxvirtio-net crate,提供 VirtIO MMIO transport、split virtqueue、网络设备核心和二层虚拟交换机。axvirtio-blk 延后到具有真实 block consumer 和运行验证的独立 PR。
  • AxVisor 新增配置驱动的 virtio-net device model,支持 scoped DMA、TX/RX queue、wired IRQ 和两个 guest 共享的内部 L2 switch。
  • ArceOS ax-driver 增加 virtio,mmio FDT 探测,并保留 FDT IRQ binding。
  • AxVM 为配置的 virtio-net 安装包含 MMIO、IRQ、interrupt-parentdma-coherent 的 guest FDT 节点。
  • 增加双 ArceOS guest TCP 测试,传输 64 KiB 确定性数据并校验 checksum。
  • 限制 guest TX descriptor 总长度,避免不可信 guest 触发无界内存分配。
  • ingress 成功入队后,通过显式 wake capability 唤醒目标 VM 的 vCPU0;vCPU0 在下一次运行循环顶部执行 DMA poll,避免接收端已进入 WFI 时帧长期滞留,也避免在发送端设备访问栈中同步重入目标设备运行时。
  • 增加 switch 回归断言,验证只有成功接收帧的目标端口会收到 wake 通知。
  • 将 QEMU 成功条件改为顺序无关但同时要求 VM1/VM2 两个 PASS 标记的单一正则,并增加仅出现一个标记必须失败、两种完成顺序均通过的 runner 回归测试。

实现逻辑

VirtIO queue 与设备协议逻辑保持在独立 no_std crate 中;AxVisor glue 负责设备资源、DMA capability、IRQ 和 switch port 生命周期。DMA polling API 与实际消费者处于同一 PR:设备注册后,vCPU 运行循环驱动 VirtioNetRuntimeDevice 处理队列,每次 poll 仅使用短生命周期 guest-memory capability。交换机只复制帧到有界 ingress queue,不持有 VM 或 VirtIO 设备内部对象。

验证

cargo test -p axvirtio-common -p axvirtio-net -p axdevice
cargo test -p axbuild qemu_success --lib
cargo xtask clippy --package axvirtio-common
cargo xtask clippy --package axvirtio-net
cargo xtask clippy --package axdevice
cargo xtask clippy --package axvm
cargo xtask clippy --package ax-driver
cargo xtask clippy --package axbuild
scripts/axvisor/build-virtio-net-peer.sh

端到端测试在“服务端先进入 accept、客户端随后连接”的场景下已通过:

VM1_VIRTIO_NET_READY
VM2_VIRTIO_NET_READY
VM1_VIRTIO_NET_PASS
VM2_VIRTIO_NET_PASS

非目标

本 PR 不包含物理 NIC uplink、multi-queue、offload、live migration 或设备直通。

@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 新增基于 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.mdstarry/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 --checkcargo clippy --manifest-path virtualization/axvirtio-common/Cargo.toml --all-features -- -D warningscargo 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

@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 新增基于 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

Comment thread os/axvisor/src/virtio_net.rs
@luodeb
luodeb force-pushed the debin/virtio-net-feature branch from 3b38d58 to c2c7c31 Compare August 9, 2026 09:22

@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 新增 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.mdstarry/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 --checkgit diff --check origin/dev...HEADcargo 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_PASSVM2_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

Comment thread Cargo.toml Outdated
@mai-team-app
mai-team-app Bot requested review from ZCShou and ZR233 August 9, 2026 09:40
@luodeb
luodeb force-pushed the debin/virtio-net-feature branch from 50b6bcb to e44f6c9 Compare August 9, 2026 10:08

@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 新增 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.mdstarry/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 --checkgit diff --check origin/dev...HEADcargo test -p axbuild qemu_success --libcargo 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

Comment thread os/axvisor/configs/qemu/qemu-aarch64-virtio-net-peer.toml Outdated
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