This is the deivce part implementation to add a new feature, VIRTIO_BALLOON_F_FREE_PAGE_HINT to the virtio-balloon device. The device receives the guest free page hints from the driver and clears the corresponding bits in the dirty bitmap, so that those free pages are not transferred by the migration thread to the destination.
- Test Environment Host: Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz Guest: 8G RAM, 4 vCPU Migration setup: migrate_set_speed 100G, migrate_set_downtime 2 second - Test Results - Idle Guest Live Migration Time (results are averaged over 10 runs): - Optimization v.s. Legacy = 259ms vs 1769ms --> ~86% reduction - Guest with Linux Compilation Workload (make bzImage -j4): - Live Migration Time (average) Optimization v.s. Legacy = 1290ms v.s. 2634ms --> ~51% reduction - Linux Compilation Time Optimization v.s. Legacy = 5min v.s. 5min3s --> no obvious difference - Source Code - QEMU: https://github.com/wei-w-wang/qemu-free-page-lm.git - Linux: https://github.com/wei-w-wang/linux-free-page-lm.git ChangeLog: v2->v3: 1) virtio-balloon - virtio_balloon_free_page_start: poll the hints using a new thread; - use cmd id between [0x80000000, UINT_MAX]; - virtio_balloon_poll_free_page_hints: - stop the optimization only when it has started; - don't skip free pages when !poison_val; - add poison_val to vmsd to migrate; - virtio_balloon_get_features: add the F_PAGE_POISON feature when host has F_FREE_PAGE_HINT; - remove the timer patch which is not needed now. 2) migration - new api, qemu_guest_free_page_hint; - rs->free_page_support set only in the precopy case; - use the new balloon APIs. v1->v2: 1) virtio-balloon - use subsections to save free_page_report_cmd_id; - poll the free page vq after sending a cmd id to the driver; - change the free page vq size to VIRTQUEUE_MAX_SIZE; - virtio_balloon_poll_free_page_hints: handle the corner case that the free page block reported from the driver may cross the RAMBlock boundary. 2) migration/ram.c - use balloon_free_page_poll to start the optimization Wei Wang (3): migration: API to clear bits of guest free pages from the dirty bitmap virtio-balloon: VIRTIO_BALLOON_F_FREE_PAGE_HINT migration: use the free page hint feature from balloon balloon.c | 49 +++++-- hw/virtio/virtio-balloon.c | 172 +++++++++++++++++++++--- include/hw/virtio/virtio-balloon.h | 14 +- include/migration/misc.h | 2 + include/standard-headers/linux/virtio_balloon.h | 7 + include/sysemu/balloon.h | 15 ++- migration/ram.c | 39 +++++- 7 files changed, 268 insertions(+), 30 deletions(-) -- 1.8.3.1