On Sun, Feb 09, 2025 at 11:20:03PM +0100, Stefano Brivio wrote: > This will close all the sockets we currently have open in repair mode, > and completes our migration tasks as source. If the hypervisor wants > to have us back at this point, somebody needs to restart us. > > Signed-off-by: Stefano Brivio > --- > vhost_user.c | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/vhost_user.c b/vhost_user.c > index 256c8ab..9115fb5 100644 > --- a/vhost_user.c > +++ b/vhost_user.c > @@ -998,6 +998,9 @@ 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; We don't actually need this global, because we have c->migrate_target. > + > /** > * vu_set_device_state_fd_exec() - Set the device state migration channel > * @vdev: vhost-user device > @@ -1025,6 +1028,9 @@ 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); > > @@ -1203,4 +1209,10 @@ 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) { We probably also only want to quit when the migration is successful. We can't determine that in all cases, but we can at least check device_state_result. Patch coming. > + info("Migration complete, exiting"); > + _exit(EXIT_SUCCESS); > + } > } -- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson