refactor(axvm): layer RISC-V SBI IPI routing - #1920
Conversation
There was a problem hiding this comment.
本 PR 将 RISC-V guest SBI IPI 的解码、guest hart→vCPU 拓扑解析和通用中断队列投递重新分层;linux-smp1 保持单核,新增三核 QEMU IPI 冒烟用例。book/guideline/feature-development.md 适用:这是共享虚拟化能力,按中风险功能审查;设计材料位于 book/design/axvm-riscv-sbi-ipi.md,方案选择与现有 VmInterruptSender 边界一致,未发现与 base 已合入的 #1681 之外的重复开放 PR。
实现将协议状态留在 riscv_vcpu,由 AxVM RISC-V 层解析拓扑并经 VmInterruptSender 以 level-triggered VSSIP 发布;该方向与 SBI IPI 规范的目标和错误语义一致,改动对其他架构应保持隔离。历史 review/comment 均为空。组织 CI 当前 head 共 75 项完成(38 success、37 预期矩阵 skipped、0 failure),包含 RISC-V Axvisor QEMU 任务成功。
本地已通过:git diff --check origin/dev...HEAD、cargo fmt --check、cargo test -p axvm --test arch_boundary_contract、cargo test -p axvm --features host-test irq::sender::tests、cargo xtask clippy --package axvm、cargo xtask clippy --package riscv_vcpu;并用 cargo xtask axvisor test qemu --arch riscv64 --list 确认 smp-ipi 已被发现。未重复执行组织 CI 已成功的完整 QEMU workload。
阻塞项:新增 QEMU 测试仅证明一个成功工作负载,且 arch_boundary_contract 仅检查源码文本;SBI IPI 路由的可观察边界/失败语义没有行为回归覆盖,见下方。补齐后请重新请求审核。
Powered by gpt-5.6-terra
问题
PR #1681 补齐了 RISC-V guest SMP IPI,但协议细节被放进了 AxVM 公共架构位置:
ArchOps出现 RISC-V 专用 cfg,公共arch/mod.rs承担 hart-mask 解释与投递,退出原因还依赖send_to_all、send_to_self、vector等布尔式字段。这样会混淆 SBI 协议、guest hart 拓扑和 VM 中断传输三个层次,也让当前 vCPU 与远端 vCPU 走不同发布路径。此外,原有
linux-smp1.toml被改成了三核配置,失去了单核用例的原始含义。修改
riscv_vcpu内收口 SBI IPI 协议:RiscvIpiRequest,显式区分 Legacy 与 SBI v0.2 ABI;Success、InvalidParameter、Failed,由 vCPU 负责按 ABI 写回寄存器;sbi_ipi模块负责 extension 探测、标准/legacy mask 解码和短读错误;CLEAR_IPI与 S_SOFT/S_TIMER/S_EXT 注入统一更新保存的 HVIP 和已绑定硬件 CSR。vcpu_id_for_arch_cpu_id,CPU-up 与 RISC-V IPI 共用同一拓扑解析;arch/riscv64/ipi.rs解释 hart mask、完整校验目标集合并映射 guest hart 到 vCPU;VmInterruptSender发布 level-triggered VSSIP,复用队列、唤醒和目标侧 drain 路径;ArchOps::ipi_targets、公共arch/mod.rs的 RISC-V helper/测试 cfg,以及旧的布尔式SendIPI路径。linux-smp1.toml的单核含义,新增独立linux-smp3-ipi.toml和normal/smp-ipi回归用例。关键语义
hart_mask_base == usize::MAX选择 VM 的全部 guest hart;零 mask 成功且不投递。base + bit,溢出、重复映射或任一未映射 hart 均返回SBI_ERR_INVALID_PARAM。SBI_ERR_FAILED;已经发布的软件中断不做不可实现的回滚。CLEAR_IPI只清当前 vCPU 的 VSSIP,不影响 timer、external 或其他 vCPU。验证
功能合入前的 dev 基线上,新增的 SMP IPI 用例会因 Linux 无法检测 SBI IPI extension 确定失败;本分支完成实现后通过同一用例。
cargo fmt --allcargo test -p axvm --test arch_boundary_contractcargo test -p axvm --features host-test irq::sender::testscargo xtask clippy --package riscv_vcpucargo xtask clippy --package axvmcargo xtask axvisor test qemu --arch riscv64 --listcargo xtask axvisor test qemu --arch riscv64 --test-group normal --test-case smp-ipiSBI IPI extension detected/proc/interrupts出现非零 IPI 计数guest smp ipi pass!cargo xtask axvisor build --arch aarch64git diff --check origin/dev...HEAD非目标
不引入独立 SBI IPI crate,不修改 vPLIC、宿主 IPI 传输、其他架构协议或共享 QEMU rootfs/success-check 实现。