mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-09-06 09:55:55 +00:00
![Fabiano Rosas](/assets/img/avatar_default.png)
The memory for the io channels is being leaked in three different ways during file migration: 1) if the offset check fails we never drop the ioc reference; 2) we allocate an extra channel for no reason; 3) if multifd is enabled but channel creation fails when calling dup(), we leave the previous channels around along with the glib polling; Fix all issues by restructuring the code to first allocate the channels and only register the watches when all channels have been created. For multifd, the file and fd migrations can share code because both are backed by a QIOChannelFile. For the non-multifd case, the fd needs to be separate because it is backed by a QIOChannelSocket. Fixes:2dd7ee7a51
("migration/multifd: Add incoming QIOChannelFile support") Fixes:decdc76772
("migration/multifd: Add mapped-ram support to fd: URI") Reported-by: Peter Xu <peterx@redhat.com> Signed-off-by: Fabiano Rosas <farosas@suse.de> Link: https://lore.kernel.org/r/20240313212824.16974-2-farosas@suse.de Signed-off-by: Peter Xu <peterx@redhat.com>
28 lines
1 KiB
C
28 lines
1 KiB
C
/*
|
|
* Copyright (c) 2021-2023 Oracle and/or its affiliates.
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#ifndef QEMU_MIGRATION_FILE_H
|
|
#define QEMU_MIGRATION_FILE_H
|
|
|
|
#include "qapi/qapi-types-migration.h"
|
|
#include "io/task.h"
|
|
#include "channel.h"
|
|
#include "multifd.h"
|
|
|
|
void file_start_incoming_migration(FileMigrationArgs *file_args, Error **errp);
|
|
|
|
void file_start_outgoing_migration(MigrationState *s,
|
|
FileMigrationArgs *file_args, Error **errp);
|
|
int file_parse_offset(char *filespec, uint64_t *offsetp, Error **errp);
|
|
void file_cleanup_outgoing_migration(void);
|
|
bool file_send_channel_create(gpointer opaque, Error **errp);
|
|
void file_create_incoming_channels(QIOChannel *ioc, Error **errp);
|
|
int file_write_ramblock_iov(QIOChannel *ioc, const struct iovec *iov,
|
|
int niov, RAMBlock *block, Error **errp);
|
|
int multifd_file_recv_data(MultiFDRecvParams *p, Error **errp);
|
|
#endif
|