mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
Walk the input snapshot file extent by extent via lseek(SEEK_DATA) / lseek(SEEK_HOLE) within each region's slot and read only those bytes into guest RAM via the existing read_volatile_from primitive. Holes are left as the guest mapping's natural zero-fill, which matches the source content. Symmetric counterpart to sparse-write on snapshot. Works for both new sparse snapshots and old dense snapshots: a dense file has no holes, so SEEK_DATA returns the full range as one extent and the I/O pattern matches the previous behaviour. If the input file's filesystem does not support SEEK_HOLE the code falls back to the existing dense read path. Measured on a 4 GiB shared-memory VM (2 vCPUs, ~340 MiB touched), total restore time as reported by the in-tree timing instrumentation: Before (dense): ~1487ms, reads 4.0 GiB from file After (sparse): ~136ms, reads 340 MiB from file (92% less I/O, 11x faster) Assisted-by: Claude:Opus-4.7 Signed-off-by: Rob Bradford <rbradford@meta.com>