mirror of https://github.com/xemu-project/xemu.git
yank: Remove dependency on qiochannel
Remove dependency on qiochannel by removing yank_generic_iochannel and letting migration and chardev use their own yank function for iochannel. Signed-off-by: Lukas Straub <lukasstraub2@web.de> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20ff143fc2db23e27cd41d38043e481376c9cec1.1616521341.git.lukasstraub2@web.de>
This commit is contained in:
parent
816f93b200
commit
1a92d6d500
|
@ -2823,6 +2823,7 @@ M: Lukas Straub <lukasstraub2@web.de>
|
||||||
S: Odd fixes
|
S: Odd fixes
|
||||||
F: util/yank.c
|
F: util/yank.c
|
||||||
F: stubs/yank.c
|
F: stubs/yank.c
|
||||||
|
F: migration/yank_functions*
|
||||||
F: include/qemu/yank.h
|
F: include/qemu/yank.h
|
||||||
F: qapi/yank.json
|
F: qapi/yank.json
|
||||||
|
|
||||||
|
|
|
@ -402,6 +402,13 @@ static void remove_hup_source(SocketChardev *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void char_socket_yank_iochannel(void *opaque)
|
||||||
|
{
|
||||||
|
QIOChannel *ioc = QIO_CHANNEL(opaque);
|
||||||
|
|
||||||
|
qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void tcp_chr_free_connection(Chardev *chr)
|
static void tcp_chr_free_connection(Chardev *chr)
|
||||||
{
|
{
|
||||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||||
|
@ -424,7 +431,7 @@ static void tcp_chr_free_connection(Chardev *chr)
|
||||||
(s->state == TCP_CHARDEV_STATE_CONNECTING
|
(s->state == TCP_CHARDEV_STATE_CONNECTING
|
||||||
|| s->state == TCP_CHARDEV_STATE_CONNECTED)) {
|
|| s->state == TCP_CHARDEV_STATE_CONNECTED)) {
|
||||||
yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label),
|
yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label),
|
||||||
yank_generic_iochannel,
|
char_socket_yank_iochannel,
|
||||||
QIO_CHANNEL(s->sioc));
|
QIO_CHANNEL(s->sioc));
|
||||||
}
|
}
|
||||||
object_unref(OBJECT(s->sioc));
|
object_unref(OBJECT(s->sioc));
|
||||||
|
@ -946,7 +953,7 @@ static int tcp_chr_add_client(Chardev *chr, int fd)
|
||||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||||
if (s->registered_yank) {
|
if (s->registered_yank) {
|
||||||
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
||||||
yank_generic_iochannel,
|
char_socket_yank_iochannel,
|
||||||
QIO_CHANNEL(sioc));
|
QIO_CHANNEL(sioc));
|
||||||
}
|
}
|
||||||
ret = tcp_chr_new_client(chr, sioc);
|
ret = tcp_chr_new_client(chr, sioc);
|
||||||
|
@ -965,7 +972,7 @@ static void tcp_chr_accept(QIONetListener *listener,
|
||||||
tcp_chr_set_client_ioc_name(chr, cioc);
|
tcp_chr_set_client_ioc_name(chr, cioc);
|
||||||
if (s->registered_yank) {
|
if (s->registered_yank) {
|
||||||
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
||||||
yank_generic_iochannel,
|
char_socket_yank_iochannel,
|
||||||
QIO_CHANNEL(cioc));
|
QIO_CHANNEL(cioc));
|
||||||
}
|
}
|
||||||
tcp_chr_new_client(chr, cioc);
|
tcp_chr_new_client(chr, cioc);
|
||||||
|
@ -985,7 +992,7 @@ static int tcp_chr_connect_client_sync(Chardev *chr, Error **errp)
|
||||||
}
|
}
|
||||||
if (s->registered_yank) {
|
if (s->registered_yank) {
|
||||||
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
||||||
yank_generic_iochannel,
|
char_socket_yank_iochannel,
|
||||||
QIO_CHANNEL(sioc));
|
QIO_CHANNEL(sioc));
|
||||||
}
|
}
|
||||||
tcp_chr_new_client(chr, sioc);
|
tcp_chr_new_client(chr, sioc);
|
||||||
|
@ -1005,7 +1012,7 @@ static void tcp_chr_accept_server_sync(Chardev *chr)
|
||||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||||
if (s->registered_yank) {
|
if (s->registered_yank) {
|
||||||
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
||||||
yank_generic_iochannel,
|
char_socket_yank_iochannel,
|
||||||
QIO_CHANNEL(sioc));
|
QIO_CHANNEL(sioc));
|
||||||
}
|
}
|
||||||
tcp_chr_new_client(chr, sioc);
|
tcp_chr_new_client(chr, sioc);
|
||||||
|
@ -1138,7 +1145,7 @@ static void qemu_chr_socket_connected(QIOTask *task, void *opaque)
|
||||||
tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
|
tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
|
||||||
if (s->registered_yank) {
|
if (s->registered_yank) {
|
||||||
yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label),
|
yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label),
|
||||||
yank_generic_iochannel,
|
char_socket_yank_iochannel,
|
||||||
QIO_CHANNEL(sioc));
|
QIO_CHANNEL(sioc));
|
||||||
}
|
}
|
||||||
check_report_connect_error(chr, err);
|
check_report_connect_error(chr, err);
|
||||||
|
@ -1176,7 +1183,7 @@ static void tcp_chr_connect_client_async(Chardev *chr)
|
||||||
tcp_chr_set_client_ioc_name(chr, sioc);
|
tcp_chr_set_client_ioc_name(chr, sioc);
|
||||||
if (s->registered_yank) {
|
if (s->registered_yank) {
|
||||||
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
yank_register_function(CHARDEV_YANK_INSTANCE(chr->label),
|
||||||
yank_generic_iochannel,
|
char_socket_yank_iochannel,
|
||||||
QIO_CHANNEL(sioc));
|
QIO_CHANNEL(sioc));
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -73,16 +73,6 @@ void yank_unregister_function(const YankInstance *instance,
|
||||||
YankFn *func,
|
YankFn *func,
|
||||||
void *opaque);
|
void *opaque);
|
||||||
|
|
||||||
/**
|
|
||||||
* yank_generic_iochannel: Generic yank function for iochannel
|
|
||||||
*
|
|
||||||
* This is a generic yank function which will call qio_channel_shutdown on the
|
|
||||||
* provided QIOChannel.
|
|
||||||
*
|
|
||||||
* @opaque: QIOChannel to shutdown
|
|
||||||
*/
|
|
||||||
void yank_generic_iochannel(void *opaque);
|
|
||||||
|
|
||||||
#define BLOCKDEV_YANK_INSTANCE(the_node_name) (&(YankInstance) { \
|
#define BLOCKDEV_YANK_INSTANCE(the_node_name) (&(YankInstance) { \
|
||||||
.type = YANK_INSTANCE_TYPE_BLOCK_NODE, \
|
.type = YANK_INSTANCE_TYPE_BLOCK_NODE, \
|
||||||
.u.block_node.node_name = (the_node_name) })
|
.u.block_node.node_name = (the_node_name) })
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "io/channel-tls.h"
|
#include "io/channel-tls.h"
|
||||||
#include "io/channel-socket.h"
|
#include "io/channel-socket.h"
|
||||||
#include "qemu/yank.h"
|
#include "qemu/yank.h"
|
||||||
|
#include "yank_functions.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @migration_channel_process_incoming - Create new incoming migration channel
|
* @migration_channel_process_incoming - Create new incoming migration channel
|
||||||
|
@ -38,7 +39,8 @@ void migration_channel_process_incoming(QIOChannel *ioc)
|
||||||
ioc, object_get_typename(OBJECT(ioc)));
|
ioc, object_get_typename(OBJECT(ioc)));
|
||||||
|
|
||||||
if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)) {
|
if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)) {
|
||||||
yank_register_function(MIGRATION_YANK_INSTANCE, yank_generic_iochannel,
|
yank_register_function(MIGRATION_YANK_INSTANCE,
|
||||||
|
migration_yank_iochannel,
|
||||||
QIO_CHANNEL(ioc));
|
QIO_CHANNEL(ioc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +78,7 @@ void migration_channel_connect(MigrationState *s,
|
||||||
if (!error) {
|
if (!error) {
|
||||||
if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)) {
|
if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)) {
|
||||||
yank_register_function(MIGRATION_YANK_INSTANCE,
|
yank_register_function(MIGRATION_YANK_INSTANCE,
|
||||||
yank_generic_iochannel,
|
migration_yank_iochannel,
|
||||||
QIO_CHANNEL(ioc));
|
QIO_CHANNEL(ioc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ migration_files = files(
|
||||||
'vmstate.c',
|
'vmstate.c',
|
||||||
'qemu-file-channel.c',
|
'qemu-file-channel.c',
|
||||||
'qemu-file.c',
|
'qemu-file.c',
|
||||||
|
'yank_functions.c',
|
||||||
)
|
)
|
||||||
softmmu_ss.add(migration_files)
|
softmmu_ss.add(migration_files)
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include "qemu/yank.h"
|
#include "qemu/yank.h"
|
||||||
#include "io/channel-socket.h"
|
#include "io/channel-socket.h"
|
||||||
|
#include "yank_functions.h"
|
||||||
|
|
||||||
/* Multiple fd's */
|
/* Multiple fd's */
|
||||||
|
|
||||||
|
@ -989,7 +990,7 @@ int multifd_load_cleanup(Error **errp)
|
||||||
if (object_dynamic_cast(OBJECT(p->c), TYPE_QIO_CHANNEL_SOCKET)
|
if (object_dynamic_cast(OBJECT(p->c), TYPE_QIO_CHANNEL_SOCKET)
|
||||||
&& OBJECT(p->c)->ref == 1) {
|
&& OBJECT(p->c)->ref == 1) {
|
||||||
yank_unregister_function(MIGRATION_YANK_INSTANCE,
|
yank_unregister_function(MIGRATION_YANK_INSTANCE,
|
||||||
yank_generic_iochannel,
|
migration_yank_iochannel,
|
||||||
QIO_CHANNEL(p->c));
|
QIO_CHANNEL(p->c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "io/channel-socket.h"
|
#include "io/channel-socket.h"
|
||||||
#include "qemu/iov.h"
|
#include "qemu/iov.h"
|
||||||
#include "qemu/yank.h"
|
#include "qemu/yank.h"
|
||||||
|
#include "yank_functions.h"
|
||||||
|
|
||||||
|
|
||||||
static ssize_t channel_writev_buffer(void *opaque,
|
static ssize_t channel_writev_buffer(void *opaque,
|
||||||
|
@ -108,7 +109,7 @@ static int channel_close(void *opaque, Error **errp)
|
||||||
if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)
|
if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)
|
||||||
&& OBJECT(ioc)->ref == 1) {
|
&& OBJECT(ioc)->ref == 1) {
|
||||||
yank_unregister_function(MIGRATION_YANK_INSTANCE,
|
yank_unregister_function(MIGRATION_YANK_INSTANCE,
|
||||||
yank_generic_iochannel,
|
migration_yank_iochannel,
|
||||||
QIO_CHANNEL(ioc));
|
QIO_CHANNEL(ioc));
|
||||||
}
|
}
|
||||||
object_unref(OBJECT(ioc));
|
object_unref(OBJECT(ioc));
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* migration yank functions
|
||||||
|
*
|
||||||
|
* Copyright (c) Lukas Straub <lukasstraub2@web.de>
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||||
|
* See the COPYING file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
|
#include "io/channel.h"
|
||||||
|
#include "yank_functions.h"
|
||||||
|
|
||||||
|
void migration_yank_iochannel(void *opaque)
|
||||||
|
{
|
||||||
|
QIOChannel *ioc = QIO_CHANNEL(opaque);
|
||||||
|
|
||||||
|
qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* migration yank functions
|
||||||
|
*
|
||||||
|
* Copyright (c) Lukas Straub <lukasstraub2@web.de>
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||||
|
* See the COPYING file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* migration_yank_iochannel: yank function for iochannel
|
||||||
|
*
|
||||||
|
* This yank function will call qio_channel_shutdown on the provided QIOChannel.
|
||||||
|
*
|
||||||
|
* @opaque: QIOChannel to shutdown
|
||||||
|
*/
|
||||||
|
void migration_yank_iochannel(void *opaque);
|
|
@ -21,9 +21,3 @@ void yank_unregister_function(const YankInstance *instance,
|
||||||
void *opaque)
|
void *opaque)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void yank_generic_iochannel(void *opaque)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include "qapi/qapi-commands-yank.h"
|
#include "qapi/qapi-commands-yank.h"
|
||||||
#include "qapi/qapi-visit-yank.h"
|
#include "qapi/qapi-visit-yank.h"
|
||||||
#include "qapi/clone-visitor.h"
|
#include "qapi/clone-visitor.h"
|
||||||
#include "io/channel.h"
|
|
||||||
#include "qemu/yank.h"
|
#include "qemu/yank.h"
|
||||||
|
|
||||||
struct YankFuncAndParam {
|
struct YankFuncAndParam {
|
||||||
|
@ -151,13 +150,6 @@ void yank_unregister_function(const YankInstance *instance,
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
void yank_generic_iochannel(void *opaque)
|
|
||||||
{
|
|
||||||
QIOChannel *ioc = QIO_CHANNEL(opaque);
|
|
||||||
|
|
||||||
qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void qmp_yank(YankInstanceList *instances,
|
void qmp_yank(YankInstanceList *instances,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue