mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
After a vDPA device reset, activate_vdpa() read avail_idx from guest memory to pass as the vring base via VHOST_SET_VRING_BASE. However, the guest memory still contained the stale avail_idx from the previous session. For a 256-entry ring, this meant base=256, causing the hardware to believe the entire RX ring was consumed with no available buffers — RX silently stopped while TX continued to work. QEMU handles this correctly by tracking last_avail_idx internally (reset to 0 in virtio_reset()) and passing that value, rather than reading from guest memory. Fix by always passing base=0 to set_vring_base(). After a device reset, both the guest driver and the vhost backend restart their rings from index 0. For live migration, the correct base should come from VHOST_GET_VRING_BASE (saved before the migration), not guest memory. Tested with mlx5_vdpa (ConnectX-6 Dx) + Windows Server 2025 (netkvm). Before: RX=0 after 3rd driver activation. After: full connectivity. Signed-off-by: Max Makarov <maxpain@linux.com>