Added missing qemu_fflush() on buffer file holding precopy device state.
Increased initial QIOChannelBuffer allocation to 512KB to avoid reallocs.
Typical configurations often require >200KB for device state and VMDESC.
Signed-off-by: Andrey Gruzdev <andrey.gruzdev@virtuozzo.com>
---
migration/migration.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/migration/migration.c b/migration/migration.c
index 36768391b6..496cf6e17b 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -3857,7 +3857,7 @@ static void *bg_migration_thread(void *opaque)
* with vCPUs running and, finally, write stashed non-RAM part of
* the vmstate from the buffer to the migration stream.
*/
- s->bioc = qio_channel_buffer_new(128 * 1024);
+ s->bioc = qio_channel_buffer_new(512 * 1024);
qio_channel_set_name(QIO_CHANNEL(s->bioc), "vmstate-buffer");
fb = qemu_fopen_channel_output(QIO_CHANNEL(s->bioc));
object_unref(OBJECT(s->bioc));
@@ -3911,6 +3911,8 @@ static void *bg_migration_thread(void *opaque)
if (qemu_savevm_state_complete_precopy_non_iterable(fb, false, false)) {
goto fail;
}
+ qemu_fflush(fb);
+
/* Now initialize UFFD context and start tracking RAM writes */
if (ram_write_tracking_start()) {
goto fail;
--
2.25.1
On 18.03.21 18:46, Andrey Gruzdev wrote:
> Added missing qemu_fflush() on buffer file holding precopy device state.
> Increased initial QIOChannelBuffer allocation to 512KB to avoid reallocs.
> Typical configurations often require >200KB for device state and VMDESC.
>
> Signed-off-by: Andrey Gruzdev <andrey.gruzdev@virtuozzo.com>
> ---
> migration/migration.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/migration/migration.c b/migration/migration.c
> index 36768391b6..496cf6e17b 100644
> --- a/migration/migration.c
> +++ b/migration/migration.c
> @@ -3857,7 +3857,7 @@ static void *bg_migration_thread(void *opaque)
> * with vCPUs running and, finally, write stashed non-RAM part of
> * the vmstate from the buffer to the migration stream.
> */
> - s->bioc = qio_channel_buffer_new(128 * 1024);
> + s->bioc = qio_channel_buffer_new(512 * 1024);
^ would that better be a separate patch? It sounds more like an
improvement than a fix.
> qio_channel_set_name(QIO_CHANNEL(s->bioc), "vmstate-buffer");
> fb = qemu_fopen_channel_output(QIO_CHANNEL(s->bioc));
> object_unref(OBJECT(s->bioc));
> @@ -3911,6 +3911,8 @@ static void *bg_migration_thread(void *opaque)
> if (qemu_savevm_state_complete_precopy_non_iterable(fb, false, false)) {
> goto fail;
> }
> + qemu_fflush(fb);
Fixes: ?
> +
> /* Now initialize UFFD context and start tracking RAM writes */
> if (ram_write_tracking_start()) {
> goto fail;
>
--
Thanks,
David / dhildenb
On 19.03.2021 15:39, David Hildenbrand wrote:
> On 18.03.21 18:46, Andrey Gruzdev wrote:
>> Added missing qemu_fflush() on buffer file holding precopy device state.
>> Increased initial QIOChannelBuffer allocation to 512KB to avoid
>> reallocs.
>> Typical configurations often require >200KB for device state and VMDESC.
>>
>> Signed-off-by: Andrey Gruzdev <andrey.gruzdev@virtuozzo.com>
>> ---
>> migration/migration.c | 4 +++-
>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/migration/migration.c b/migration/migration.c
>> index 36768391b6..496cf6e17b 100644
>> --- a/migration/migration.c
>> +++ b/migration/migration.c
>> @@ -3857,7 +3857,7 @@ static void *bg_migration_thread(void *opaque)
>> * with vCPUs running and, finally, write stashed non-RAM part of
>> * the vmstate from the buffer to the migration stream.
>> */
>> - s->bioc = qio_channel_buffer_new(128 * 1024);
>> + s->bioc = qio_channel_buffer_new(512 * 1024);
>
> ^ would that better be a separate patch? It sounds more like an
> improvement than a fix.
>
>> qio_channel_set_name(QIO_CHANNEL(s->bioc), "vmstate-buffer");
>> fb = qemu_fopen_channel_output(QIO_CHANNEL(s->bioc));
>> object_unref(OBJECT(s->bioc));
>> @@ -3911,6 +3911,8 @@ static void *bg_migration_thread(void *opaque)
>> if (qemu_savevm_state_complete_precopy_non_iterable(fb, false,
>> false)) {
>> goto fail;
>> }
>> + qemu_fflush(fb);
>
> Fixes: ?
>
It fixes unflushed QEMUFile, not an improvement. If not flushed, the
migrate_get_current()->bioc->data
would stay missing some bytes at the tail.
>> +
>> /* Now initialize UFFD context and start tracking RAM writes */
>> if (ram_write_tracking_start()) {
>> goto fail;
>>
>
>
--
Andrey Gruzdev, Principal Engineer
Virtuozzo GmbH +7-903-247-6397
virtuzzo.com
© 2016 - 2026 Red Hat, Inc.