15ac1fad3SPaolo Bonzini /* 25ac1fad3SPaolo Bonzini * QEMU live migration via generic fd 35ac1fad3SPaolo Bonzini * 464802ee5SDaniel P. Berrange * Copyright Red Hat, Inc. 2009-2016 55ac1fad3SPaolo Bonzini * 65ac1fad3SPaolo Bonzini * Authors: 75ac1fad3SPaolo Bonzini * Chris Lalancette <clalance@redhat.com> 864802ee5SDaniel P. Berrange * Daniel P. Berrange <berrange@redhat.com> 95ac1fad3SPaolo Bonzini * 105ac1fad3SPaolo Bonzini * This work is licensed under the terms of the GNU GPL, version 2. See 115ac1fad3SPaolo Bonzini * the COPYING file in the top-level directory. 125ac1fad3SPaolo Bonzini * 136b620ca3SPaolo Bonzini * Contributions after 2012-01-13 are licensed under the terms of the 146b620ca3SPaolo Bonzini * GNU GPL, version 2 or (at your option) any later version. 155ac1fad3SPaolo Bonzini */ 165ac1fad3SPaolo Bonzini 171393a485SPeter Maydell #include "qemu/osdep.h" 18dd4339c5SJuan Quintela #include "channel.h" 197fcac4a2SJuan Quintela #include "fd.h" 2074228c59SFabiano Rosas #include "file.h" 210efc9142SJuan Quintela #include "migration.h" 2283c9089eSPaolo Bonzini #include "monitor/monitor.h" 23*c55deb86SFabiano Rosas #include "qemu/error-report.h" 24*c55deb86SFabiano Rosas #include "qemu/sockets.h" 2564802ee5SDaniel P. Berrange #include "io/channel-util.h" 2664802ee5SDaniel P. Berrange #include "trace.h" 275ac1fad3SPaolo Bonzini 28131fe9b8SCristian Klein 29f37afb5aSPaolo Bonzini void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp) 305ac1fad3SPaolo Bonzini { 3164802ee5SDaniel P. Berrange QIOChannel *ioc; 32947e4744SKevin Wolf int fd = monitor_get_fd(monitor_cur(), fdname, errp); 33f8bbc128SPaolo Bonzini if (fd == -1) { 34f37afb5aSPaolo Bonzini return; 355ac1fad3SPaolo Bonzini } 36131fe9b8SCristian Klein 37*c55deb86SFabiano Rosas if (!fd_is_socket(fd)) { 38*c55deb86SFabiano Rosas warn_report("fd: migration to a file is deprecated." 39*c55deb86SFabiano Rosas " Use file: instead."); 40*c55deb86SFabiano Rosas } 41*c55deb86SFabiano Rosas 4264802ee5SDaniel P. Berrange trace_migration_fd_outgoing(fd); 4364802ee5SDaniel P. Berrange ioc = qio_channel_new_fd(fd, errp); 4464802ee5SDaniel P. Berrange if (!ioc) { 4564802ee5SDaniel P. Berrange close(fd); 4664802ee5SDaniel P. Berrange return; 47131fe9b8SCristian Klein } 485ac1fad3SPaolo Bonzini 497d5b0d68SPhilippe Mathieu-Daudé qio_channel_set_name(ioc, "migration-fd-outgoing"); 50688a3dcbSDr. David Alan Gilbert migration_channel_connect(s, ioc, NULL, NULL); 5164802ee5SDaniel P. Berrange object_unref(OBJECT(ioc)); 525ac1fad3SPaolo Bonzini } 535ac1fad3SPaolo Bonzini 5464802ee5SDaniel P. Berrange static gboolean fd_accept_incoming_migration(QIOChannel *ioc, 5564802ee5SDaniel P. Berrange GIOCondition condition, 5664802ee5SDaniel P. Berrange gpointer opaque) 575ac1fad3SPaolo Bonzini { 5854314711SJuan Quintela migration_channel_process_incoming(ioc); 5964802ee5SDaniel P. Berrange object_unref(OBJECT(ioc)); 602a543bfdSJuan Quintela return G_SOURCE_REMOVE; 615ac1fad3SPaolo Bonzini } 625ac1fad3SPaolo Bonzini 6361053d48SYury Kotov void fd_start_incoming_migration(const char *fdname, Error **errp) 645ac1fad3SPaolo Bonzini { 6564802ee5SDaniel P. Berrange QIOChannel *ioc; 66947e4744SKevin Wolf int fd = monitor_fd_param(monitor_cur(), fdname, errp); 6761053d48SYury Kotov if (fd == -1) { 6861053d48SYury Kotov return; 6961053d48SYury Kotov } 705ac1fad3SPaolo Bonzini 71*c55deb86SFabiano Rosas if (!fd_is_socket(fd)) { 72*c55deb86SFabiano Rosas warn_report("fd: migration to a file is deprecated." 73*c55deb86SFabiano Rosas " Use file: instead."); 74*c55deb86SFabiano Rosas } 75*c55deb86SFabiano Rosas 7664802ee5SDaniel P. Berrange trace_migration_fd_incoming(fd); 7764802ee5SDaniel P. Berrange 7864802ee5SDaniel P. Berrange ioc = qio_channel_new_fd(fd, errp); 7964802ee5SDaniel P. Berrange if (!ioc) { 8064802ee5SDaniel P. Berrange close(fd); 8143eaae28SPaolo Bonzini return; 825ac1fad3SPaolo Bonzini } 835ac1fad3SPaolo Bonzini 847d5b0d68SPhilippe Mathieu-Daudé qio_channel_set_name(ioc, "migration-fd-incoming"); 85e89f5ff2SPeter Xu qio_channel_add_watch_full(ioc, G_IO_IN, 8664802ee5SDaniel P. Berrange fd_accept_incoming_migration, 87e89f5ff2SPeter Xu NULL, NULL, 88e89f5ff2SPeter Xu g_main_context_get_thread_default()); 89decdc767SFabiano Rosas } 90