11a92d6d5SLukas Straub /* 21a92d6d5SLukas Straub * migration yank functions 31a92d6d5SLukas Straub * 41a92d6d5SLukas Straub * Copyright (c) Lukas Straub <lukasstraub2@web.de> 51a92d6d5SLukas Straub * 61a92d6d5SLukas Straub * This work is licensed under the terms of the GNU GPL, version 2 or later. 71a92d6d5SLukas Straub * See the COPYING file in the top-level directory. 81a92d6d5SLukas Straub */ 91a92d6d5SLukas Straub 101a92d6d5SLukas Straub #include "qemu/osdep.h" 111a92d6d5SLukas Straub #include "io/channel.h" 121a92d6d5SLukas Straub #include "yank_functions.h" 1318711405SPeter Xu #include "qemu/yank.h" 1439675fffSPeter Xu #include "qemu-file.h" 151a92d6d5SLukas Straub migration_yank_iochannel(void * opaque)161a92d6d5SLukas Straubvoid migration_yank_iochannel(void *opaque) 171a92d6d5SLukas Straub { 181a92d6d5SLukas Straub QIOChannel *ioc = QIO_CHANNEL(opaque); 191a92d6d5SLukas Straub 201a92d6d5SLukas Straub qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); 211a92d6d5SLukas Straub } 2218711405SPeter Xu 2318711405SPeter Xu /* Return whether yank is supported on this ioc */ migration_ioc_yank_supported(QIOChannel * ioc)2418711405SPeter Xustatic bool migration_ioc_yank_supported(QIOChannel *ioc) 2518711405SPeter Xu { 26*0a5d1108SFabiano Rosas return qio_channel_has_feature(ioc, QIO_CHANNEL_FEATURE_SHUTDOWN); 2718711405SPeter Xu } 2818711405SPeter Xu migration_ioc_register_yank(QIOChannel * ioc)2918711405SPeter Xuvoid migration_ioc_register_yank(QIOChannel *ioc) 3018711405SPeter Xu { 3118711405SPeter Xu if (migration_ioc_yank_supported(ioc)) { 3218711405SPeter Xu yank_register_function(MIGRATION_YANK_INSTANCE, 3318711405SPeter Xu migration_yank_iochannel, 347d5b0d68SPhilippe Mathieu-Daudé ioc); 3518711405SPeter Xu } 3618711405SPeter Xu } 3718711405SPeter Xu migration_ioc_unregister_yank(QIOChannel * ioc)3818711405SPeter Xuvoid migration_ioc_unregister_yank(QIOChannel *ioc) 3918711405SPeter Xu { 4018711405SPeter Xu if (migration_ioc_yank_supported(ioc)) { 4118711405SPeter Xu yank_unregister_function(MIGRATION_YANK_INSTANCE, 4218711405SPeter Xu migration_yank_iochannel, 437d5b0d68SPhilippe Mathieu-Daudé ioc); 4418711405SPeter Xu } 4518711405SPeter Xu } 4639675fffSPeter Xu migration_ioc_unregister_yank_from_file(QEMUFile * file)4739675fffSPeter Xuvoid migration_ioc_unregister_yank_from_file(QEMUFile *file) 4839675fffSPeter Xu { 4939675fffSPeter Xu QIOChannel *ioc = qemu_file_get_ioc(file); 5039675fffSPeter Xu 5139675fffSPeter Xu if (ioc) { 5239675fffSPeter Xu /* 5339675fffSPeter Xu * For migration qemufiles, we'll always reach here. Though we'll skip 5439675fffSPeter Xu * calls from e.g. savevm/loadvm as they don't use yank. 5539675fffSPeter Xu */ 5639675fffSPeter Xu migration_ioc_unregister_yank(ioc); 5739675fffSPeter Xu } 5839675fffSPeter Xu } 59