In order to allow local to local migrations, we want the source passt to quit once the migration is completed, so that it frees up sockets for the target passt to reopen. We use a global variable, quit_on_device_state, to trigger this behaviour. We don't need that global: the information we need is in c->migrate_target. Moreover, we only want to exit on a *successful* migration. Checking c->device_state_result == 0 is not a foolproof way to do this, since the migration could fail due to an unrelated device in the guest, but it's better than always assuming success. Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au> --- vhost_user.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/vhost_user.c b/vhost_user.c index 9115fb50..7ab13774 100644 --- a/vhost_user.c +++ b/vhost_user.c @@ -998,9 +998,6 @@ static bool vu_send_rarp_exec(struct vu_dev *vdev, return false; } -/* If set, quit when we get a VHOST_USER_CHECK_DEVICE_STATE, after replying */ -static bool quit_on_device_state = false; - /** * vu_set_device_state_fd_exec() - Set the device state migration channel * @vdev: vhost-user device @@ -1028,9 +1025,6 @@ static bool vu_set_device_state_fd_exec(struct vu_dev *vdev, migrate_request(vdev->context, msg->fds[0], direction == VHOST_USER_TRANSFER_STATE_DIRECTION_LOAD); - if (direction == VHOST_USER_TRANSFER_STATE_DIRECTION_SAVE) - quit_on_device_state = true; - /* We don't provide a new fd for the data transfer */ vmsg_set_reply_u64(msg, VHOST_USER_VRING_NOFD_MASK); @@ -1210,8 +1204,9 @@ void vu_control_handler(struct vu_dev *vdev, int fd, uint32_t events) if (reply_requested) vu_send_reply(fd, &msg); - if (quit_on_device_state && - msg.hdr.request == VHOST_USER_CHECK_DEVICE_STATE) { + if (msg.hdr.request == VHOST_USER_CHECK_DEVICE_STATE && + vdev->context->device_state_result == 0 && + !vdev->context->migrate_target) { info("Migration complete, exiting"); _exit(EXIT_SUCCESS); } -- 2.48.1