master
c 791 lines 23.7 KB
Raw
1 /*
2 * Multifd VFIO migration
3 *
4 * Copyright (C) 2024,2025 Oracle and/or its affiliates.
5 *
6 * This work is licensed under the terms of the GNU GPL, version 2 or later.
7 * See the COPYING file in the top-level directory.
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12 #include "qemu/osdep.h"
13 #include "hw/vfio/vfio-device.h"
14 #include "migration/misc.h"
15 #include "qapi/error.h"
16 #include "qemu/error-report.h"
17 #include "qemu/lockable.h"
18 #include "qemu/main-loop.h"
19 #include "qemu/target-info.h"
20 #include "qemu/thread.h"
21 #include "io/channel-buffer.h"
22 #include "migration/qemu-file.h"
23 #include "migration-multifd.h"
24 #include "vfio-migration-internal.h"
25 #include "trace.h"
26 #include "vfio-helpers.h"
27
28 #define VFIO_DEVICE_STATE_CONFIG_STATE (1)
29
30 #define VFIO_DEVICE_STATE_PACKET_VER_CURRENT (0)
31
32 typedef struct VFIODeviceStatePacket {
33 uint32_t version;
34 uint32_t idx;
35 uint32_t flags;
36 uint8_t data[0];
37 } QEMU_PACKED VFIODeviceStatePacket;
38
39 bool vfio_load_config_after_iter(VFIODevice *vbasedev)
40 {
41 if (vbasedev->migration_load_config_after_iter == ON_OFF_AUTO_ON) {
42 return true;
43 } else if (vbasedev->migration_load_config_after_iter == ON_OFF_AUTO_OFF) {
44 return false;
45 }
46
47 assert(vbasedev->migration_load_config_after_iter == ON_OFF_AUTO_AUTO);
48
49 /*
50 * Starting the config load only after all iterables were loaded (during
51 * non-iterables loading phase) is required for ARM64 due to this platform
52 * VFIO dependency on interrupt controller being loaded first.
53 *
54 * See commit d329f5032e17 ("vfio: Move the saving of the config space to
55 * the right place in VFIO migration").
56 */
57 return target_base_arm();
58 }
59
60 /* type safety */
61 typedef struct VFIOStateBuffers {
62 GArray *array;
63 } VFIOStateBuffers;
64
65 typedef struct VFIOStateBuffer {
66 bool is_present;
67 char *data;
68 size_t len;
69 } VFIOStateBuffer;
70
71 typedef struct VFIOMultifd {
72 bool load_bufs_thread_running;
73 bool load_bufs_thread_want_exit;
74
75 bool load_bufs_iter_done;
76 QemuCond load_bufs_iter_done_cond;
77
78 VFIOStateBuffers load_bufs;
79 QemuCond load_bufs_buffer_ready_cond;
80 QemuCond load_bufs_thread_finished_cond;
81 QemuMutex load_bufs_mutex; /* Lock order: this lock -> BQL */
82 uint32_t load_buf_idx;
83 uint32_t load_buf_idx_last;
84 size_t load_buf_queued_pending_buffers_size;
85 } VFIOMultifd;
86
87 static void vfio_state_buffer_clear(gpointer data)
88 {
89 VFIOStateBuffer *lb = data;
90
91 if (!lb->is_present) {
92 return;
93 }
94
95 g_clear_pointer(&lb->data, g_free);
96 lb->is_present = false;
97 }
98
99 static void vfio_state_buffers_init(VFIOStateBuffers *bufs)
100 {
101 bufs->array = g_array_new(FALSE, TRUE, sizeof(VFIOStateBuffer));
102 g_array_set_clear_func(bufs->array, vfio_state_buffer_clear);
103 }
104
105 static void vfio_state_buffers_destroy(VFIOStateBuffers *bufs)
106 {
107 g_clear_pointer(&bufs->array, g_array_unref);
108 }
109
110 static void vfio_state_buffers_assert_init(VFIOStateBuffers *bufs)
111 {
112 assert(bufs->array);
113 }
114
115 static unsigned int vfio_state_buffers_size_get(VFIOStateBuffers *bufs)
116 {
117 return bufs->array->len;
118 }
119
120 static void vfio_state_buffers_size_set(VFIOStateBuffers *bufs,
121 unsigned int size)
122 {
123 g_array_set_size(bufs->array, size);
124 }
125
126 static VFIOStateBuffer *vfio_state_buffers_at(VFIOStateBuffers *bufs,
127 unsigned int idx)
128 {
129 return &g_array_index(bufs->array, VFIOStateBuffer, idx);
130 }
131
132 /* called with load_bufs_mutex locked */
133 static bool vfio_load_state_buffer_insert(VFIODevice *vbasedev,
134 VFIODeviceStatePacket *packet,
135 size_t packet_total_size,
136 Error **errp)
137 {
138 VFIOMigration *migration = vbasedev->migration;
139 VFIOMultifd *multifd = migration->multifd;
140 VFIOStateBuffer *lb;
141 size_t data_size = packet_total_size - sizeof(*packet);
142
143 vfio_state_buffers_assert_init(&multifd->load_bufs);
144 if (packet->idx >= vfio_state_buffers_size_get(&multifd->load_bufs)) {
145 vfio_state_buffers_size_set(&multifd->load_bufs, packet->idx + 1);
146 }
147
148 lb = vfio_state_buffers_at(&multifd->load_bufs, packet->idx);
149 if (lb->is_present) {
150 error_setg(errp, "%s: state buffer %" PRIu32 " already filled",
151 vbasedev->name, packet->idx);
152 return false;
153 }
154
155 assert(packet->idx >= multifd->load_buf_idx);
156
157 multifd->load_buf_queued_pending_buffers_size += data_size;
158 if (multifd->load_buf_queued_pending_buffers_size >
159 vbasedev->migration_max_queued_buffers_size) {
160 error_setg(errp,
161 "%s: queuing state buffer %" PRIu32
162 " would exceed the size max of %" PRIu64,
163 vbasedev->name, packet->idx,
164 vbasedev->migration_max_queued_buffers_size);
165 return false;
166 }
167
168 lb->data = g_memdup2(&packet->data, data_size);
169 lb->len = data_size;
170 lb->is_present = true;
171
172 return true;
173 }
174
175 bool vfio_multifd_load_state_buffer(void *opaque, char *data, size_t data_size,
176 Error **errp)
177 {
178 VFIODevice *vbasedev = opaque;
179 VFIOMigration *migration = vbasedev->migration;
180 VFIOMultifd *multifd = migration->multifd;
181 VFIODeviceStatePacket *packet = (VFIODeviceStatePacket *)data;
182
183 if (!vfio_multifd_transfer_enabled(vbasedev)) {
184 error_setg(errp,
185 "%s: got device state packet but not doing multifd transfer",
186 vbasedev->name);
187 return false;
188 }
189
190 assert(multifd);
191
192 if (data_size < sizeof(*packet)) {
193 error_setg(errp, "%s: packet too short at %zu (min is %zu)",
194 vbasedev->name, data_size, sizeof(*packet));
195 return false;
196 }
197
198 packet->version = be32_to_cpu(packet->version);
199 if (packet->version != VFIO_DEVICE_STATE_PACKET_VER_CURRENT) {
200 error_setg(errp, "%s: packet has unknown version %" PRIu32,
201 vbasedev->name, packet->version);
202 return false;
203 }
204
205 packet->idx = be32_to_cpu(packet->idx);
206 packet->flags = be32_to_cpu(packet->flags);
207
208 if (packet->idx == UINT32_MAX) {
209 error_setg(errp, "%s: packet index is invalid", vbasedev->name);
210 return false;
211 }
212
213 trace_vfio_load_state_device_buffer_incoming(vbasedev->name, packet->idx);
214
215 /*
216 * Holding BQL here would violate the lock order and can cause
217 * a deadlock once we attempt to lock load_bufs_mutex below.
218 */
219 assert(!bql_locked());
220
221 WITH_QEMU_LOCK_GUARD(&multifd->load_bufs_mutex) {
222 /* config state packet should be the last one in the stream */
223 if (packet->flags & VFIO_DEVICE_STATE_CONFIG_STATE) {
224 multifd->load_buf_idx_last = packet->idx;
225 }
226
227 if (!vfio_load_state_buffer_insert(vbasedev, packet, data_size,
228 errp)) {
229 return false;
230 }
231
232 qemu_cond_signal(&multifd->load_bufs_buffer_ready_cond);
233 }
234
235 return true;
236 }
237
238 static bool vfio_load_bufs_thread_load_config(VFIODevice *vbasedev,
239 Error **errp)
240 {
241 VFIOMigration *migration = vbasedev->migration;
242 VFIOMultifd *multifd = migration->multifd;
243 VFIOStateBuffer *lb;
244 g_autoptr(QIOChannelBuffer) bioc = NULL;
245 g_autoptr(QEMUFile) f_out = NULL, f_in = NULL;
246 uint64_t mig_header;
247 int ret;
248
249 assert(multifd->load_buf_idx == multifd->load_buf_idx_last);
250 lb = vfio_state_buffers_at(&multifd->load_bufs, multifd->load_buf_idx);
251 assert(lb->is_present);
252
253 bioc = qio_channel_buffer_new(lb->len);
254 qio_channel_set_name(QIO_CHANNEL(bioc), "vfio-device-config-load");
255
256 f_out = qemu_file_new_output(QIO_CHANNEL(bioc));
257 qemu_put_buffer(f_out, (uint8_t *)lb->data, lb->len);
258
259 ret = qemu_fflush(f_out);
260 if (ret) {
261 error_setg(errp, "%s: load config state flush failed: %d",
262 vbasedev->name, ret);
263 return false;
264 }
265
266 qio_channel_io_seek(QIO_CHANNEL(bioc), 0, 0, NULL);
267 f_in = qemu_file_new_input(QIO_CHANNEL(bioc));
268
269 mig_header = qemu_get_be64(f_in);
270 if (mig_header != VFIO_MIG_FLAG_DEV_CONFIG_STATE) {
271 error_setg(errp, "%s: expected FLAG_DEV_CONFIG_STATE but got %" PRIx64,
272 vbasedev->name, mig_header);
273 return false;
274 }
275
276 bql_lock();
277 ret = vfio_load_device_config_state(f_in, vbasedev);
278 bql_unlock();
279
280 if (ret < 0) {
281 error_setg(errp, "%s: vfio_load_device_config_state() failed: %d",
282 vbasedev->name, ret);
283 return false;
284 }
285
286 return true;
287 }
288
289 static VFIOStateBuffer *vfio_load_state_buffer_get(VFIOMultifd *multifd)
290 {
291 VFIOStateBuffer *lb;
292 unsigned int bufs_len;
293
294 bufs_len = vfio_state_buffers_size_get(&multifd->load_bufs);
295 if (multifd->load_buf_idx >= bufs_len) {
296 assert(multifd->load_buf_idx == bufs_len);
297 return NULL;
298 }
299
300 lb = vfio_state_buffers_at(&multifd->load_bufs,
301 multifd->load_buf_idx);
302 if (!lb->is_present) {
303 return NULL;
304 }
305
306 return lb;
307 }
308
309 static bool vfio_load_state_buffer_write(VFIODevice *vbasedev,
310 VFIOStateBuffer *lb,
311 Error **errp)
312 {
313 VFIOMigration *migration = vbasedev->migration;
314 VFIOMultifd *multifd = migration->multifd;
315 g_autofree char *buf = NULL;
316 char *buf_cur;
317 size_t buf_len;
318
319 if (!lb->len) {
320 return true;
321 }
322
323 trace_vfio_load_state_device_buffer_load_start(vbasedev->name,
324 multifd->load_buf_idx);
325
326 /* lb might become re-allocated when we drop the lock */
327 buf = g_steal_pointer(&lb->data);
328 buf_cur = buf;
329 buf_len = lb->len;
330 while (buf_len > 0) {
331 ssize_t wr_ret;
332 int errno_save;
333
334 /*
335 * Loading data to the device takes a while,
336 * drop the lock during this process.
337 */
338 qemu_mutex_unlock(&multifd->load_bufs_mutex);
339 wr_ret = write(migration->data_fd, buf_cur, buf_len);
340 errno_save = errno;
341 qemu_mutex_lock(&multifd->load_bufs_mutex);
342
343 if (wr_ret < 0) {
344 error_setg(errp,
345 "%s: writing state buffer %" PRIu32 " failed: %d",
346 vbasedev->name, multifd->load_buf_idx, errno_save);
347 return false;
348 }
349
350 assert(wr_ret <= buf_len);
351 buf_len -= wr_ret;
352 buf_cur += wr_ret;
353
354 assert(multifd->load_buf_queued_pending_buffers_size >= wr_ret);
355 multifd->load_buf_queued_pending_buffers_size -= wr_ret;
356 }
357
358 trace_vfio_load_state_device_buffer_load_end(vbasedev->name,
359 multifd->load_buf_idx);
360
361 return true;
362 }
363
364 static bool vfio_load_bufs_thread_want_exit(VFIOMultifd *multifd,
365 bool *should_quit)
366 {
367 return multifd->load_bufs_thread_want_exit || qatomic_read(should_quit);
368 }
369
370 /*
371 * This thread is spawned by vfio_multifd_switchover_start() which gets
372 * called upon encountering the switchover point marker in main migration
373 * stream.
374 *
375 * It exits after either:
376 * * completing loading the remaining device state and device config, OR:
377 * * encountering some error while doing the above, OR:
378 * * being forcefully aborted by the migration core by it setting should_quit
379 * or by vfio_load_cleanup_load_bufs_thread() setting
380 * multifd->load_bufs_thread_want_exit.
381 */
382 static bool vfio_load_bufs_thread(void *opaque, bool *should_quit, Error **errp)
383 {
384 VFIODevice *vbasedev = opaque;
385 VFIOMigration *migration = vbasedev->migration;
386 VFIOMultifd *multifd = migration->multifd;
387 bool ret = false;
388
389 trace_vfio_load_bufs_thread_start(vbasedev->name);
390
391 assert(multifd);
392 QEMU_LOCK_GUARD(&multifd->load_bufs_mutex);
393
394 assert(multifd->load_bufs_thread_running);
395
396 while (true) {
397 VFIOStateBuffer *lb;
398
399 /*
400 * Always check cancellation first after the buffer_ready wait below in
401 * case that cond was signalled by vfio_load_cleanup_load_bufs_thread().
402 */
403 if (vfio_load_bufs_thread_want_exit(multifd, should_quit)) {
404 error_setg(errp, "operation cancelled");
405 goto thread_exit;
406 }
407
408 assert(multifd->load_buf_idx <= multifd->load_buf_idx_last);
409
410 lb = vfio_load_state_buffer_get(multifd);
411 if (!lb) {
412 trace_vfio_load_state_device_buffer_starved(vbasedev->name,
413 multifd->load_buf_idx);
414 qemu_cond_wait(&multifd->load_bufs_buffer_ready_cond,
415 &multifd->load_bufs_mutex);
416 continue;
417 }
418
419 if (multifd->load_buf_idx == multifd->load_buf_idx_last) {
420 break;
421 }
422
423 if (multifd->load_buf_idx == 0) {
424 trace_vfio_load_state_device_buffer_start(vbasedev->name);
425 }
426
427 if (!vfio_load_state_buffer_write(vbasedev, lb, errp)) {
428 goto thread_exit;
429 }
430
431 if (multifd->load_buf_idx == multifd->load_buf_idx_last - 1) {
432 trace_vfio_load_state_device_buffer_end(vbasedev->name);
433 }
434
435 multifd->load_buf_idx++;
436 }
437
438 if (vfio_load_config_after_iter(vbasedev)) {
439 while (!multifd->load_bufs_iter_done) {
440 qemu_cond_wait(&multifd->load_bufs_iter_done_cond,
441 &multifd->load_bufs_mutex);
442
443 /*
444 * Need to re-check cancellation immediately after wait in case
445 * cond was signalled by vfio_load_cleanup_load_bufs_thread().
446 */
447 if (vfio_load_bufs_thread_want_exit(multifd, should_quit)) {
448 error_setg(errp, "operation cancelled");
449 goto thread_exit;
450 }
451 }
452 }
453
454 if (!vfio_load_bufs_thread_load_config(vbasedev, errp)) {
455 goto thread_exit;
456 }
457
458 ret = true;
459
460 thread_exit:
461 /*
462 * Notify possibly waiting vfio_load_cleanup_load_bufs_thread() that
463 * this thread is exiting.
464 */
465 multifd->load_bufs_thread_running = false;
466 qemu_cond_signal(&multifd->load_bufs_thread_finished_cond);
467
468 trace_vfio_load_bufs_thread_end(vbasedev->name);
469
470 return ret;
471 }
472
473 int vfio_load_state_config_load_ready(VFIODevice *vbasedev)
474 {
475 VFIOMigration *migration = vbasedev->migration;
476 VFIOMultifd *multifd = migration->multifd;
477 int ret = 0;
478
479 if (!vfio_multifd_transfer_enabled(vbasedev)) {
480 error_report("%s: got DEV_CONFIG_LOAD_READY outside multifd transfer",
481 vbasedev->name);
482 return -EINVAL;
483 }
484
485 if (!vfio_load_config_after_iter(vbasedev)) {
486 error_report("%s: got DEV_CONFIG_LOAD_READY but was disabled",
487 vbasedev->name);
488 return -EINVAL;
489 }
490
491 assert(multifd);
492
493 /* The lock order is load_bufs_mutex -> BQL so unlock BQL here first */
494 bql_unlock();
495 WITH_QEMU_LOCK_GUARD(&multifd->load_bufs_mutex) {
496 if (multifd->load_bufs_iter_done) {
497 /* Can't print error here as we're outside BQL */
498 ret = -EINVAL;
499 break;
500 }
501
502 multifd->load_bufs_iter_done = true;
503 qemu_cond_signal(&multifd->load_bufs_iter_done_cond);
504 }
505 bql_lock();
506
507 if (ret) {
508 error_report("%s: duplicate DEV_CONFIG_LOAD_READY",
509 vbasedev->name);
510 }
511
512 return ret;
513 }
514
515 static VFIOMultifd *vfio_multifd_new(void)
516 {
517 VFIOMultifd *multifd = g_new(VFIOMultifd, 1);
518
519 vfio_state_buffers_init(&multifd->load_bufs);
520
521 qemu_mutex_init(&multifd->load_bufs_mutex);
522
523 multifd->load_buf_idx = 0;
524 multifd->load_buf_idx_last = UINT32_MAX;
525 multifd->load_buf_queued_pending_buffers_size = 0;
526 qemu_cond_init(&multifd->load_bufs_buffer_ready_cond);
527
528 multifd->load_bufs_iter_done = false;
529 qemu_cond_init(&multifd->load_bufs_iter_done_cond);
530
531 multifd->load_bufs_thread_running = false;
532 multifd->load_bufs_thread_want_exit = false;
533 qemu_cond_init(&multifd->load_bufs_thread_finished_cond);
534
535 return multifd;
536 }
537
538 /*
539 * Terminates vfio_load_bufs_thread by setting
540 * multifd->load_bufs_thread_want_exit and signalling all the conditions
541 * the thread could be blocked on.
542 *
543 * Waits for the thread to signal that it had finished.
544 */
545 static void vfio_load_cleanup_load_bufs_thread(VFIOMultifd *multifd)
546 {
547 /* The lock order is load_bufs_mutex -> BQL so unlock BQL here first */
548 bql_unlock();
549 WITH_QEMU_LOCK_GUARD(&multifd->load_bufs_mutex) {
550 while (multifd->load_bufs_thread_running) {
551 multifd->load_bufs_thread_want_exit = true;
552
553 qemu_cond_signal(&multifd->load_bufs_buffer_ready_cond);
554 qemu_cond_signal(&multifd->load_bufs_iter_done_cond);
555 qemu_cond_wait(&multifd->load_bufs_thread_finished_cond,
556 &multifd->load_bufs_mutex);
557 }
558 }
559 bql_lock();
560 }
561
562 static void vfio_multifd_free(VFIOMultifd *multifd)
563 {
564 vfio_load_cleanup_load_bufs_thread(multifd);
565
566 qemu_cond_destroy(&multifd->load_bufs_thread_finished_cond);
567 qemu_cond_destroy(&multifd->load_bufs_iter_done_cond);
568 vfio_state_buffers_destroy(&multifd->load_bufs);
569 qemu_cond_destroy(&multifd->load_bufs_buffer_ready_cond);
570 qemu_mutex_destroy(&multifd->load_bufs_mutex);
571
572 g_free(multifd);
573 }
574
575 void vfio_multifd_cleanup(VFIODevice *vbasedev)
576 {
577 VFIOMigration *migration = vbasedev->migration;
578
579 g_clear_pointer(&migration->multifd, vfio_multifd_free);
580 }
581
582 bool vfio_multifd_transfer_supported(void)
583 {
584 return multifd_device_state_supported() &&
585 migrate_send_switchover_start();
586 }
587
588 bool vfio_multifd_transfer_enabled(VFIODevice *vbasedev)
589 {
590 VFIOMigration *migration = vbasedev->migration;
591
592 return migration->multifd_transfer;
593 }
594
595 bool vfio_multifd_setup(VFIODevice *vbasedev, bool alloc_multifd, Error **errp)
596 {
597 VFIOMigration *migration = vbasedev->migration;
598
599 /*
600 * Make a copy of this setting at the start in case it is changed
601 * mid-migration.
602 */
603 if (vbasedev->migration_multifd_transfer == ON_OFF_AUTO_AUTO) {
604 migration->multifd_transfer = vfio_multifd_transfer_supported();
605 } else {
606 migration->multifd_transfer =
607 vbasedev->migration_multifd_transfer == ON_OFF_AUTO_ON;
608 }
609
610 if (!vfio_multifd_transfer_enabled(vbasedev)) {
611 /* Nothing further to check or do */
612 return true;
613 }
614
615 if (!vfio_multifd_transfer_supported()) {
616 error_setg(errp,
617 "%s: Multifd device transfer requested but unsupported in the current config",
618 vbasedev->name);
619 return false;
620 }
621
622 if (alloc_multifd) {
623 assert(!migration->multifd);
624 migration->multifd = vfio_multifd_new();
625 }
626
627 return true;
628 }
629
630 void vfio_multifd_emit_dummy_eos(VFIODevice *vbasedev, QEMUFile *f)
631 {
632 assert(vfio_multifd_transfer_enabled(vbasedev));
633
634 /*
635 * Emit dummy NOP data on the main migration channel since the actual
636 * device state transfer is done via multifd channels.
637 */
638 qemu_put_be64(f, VFIO_MIG_FLAG_END_OF_STATE);
639 }
640
641 static bool
642 vfio_save_complete_precopy_thread_config_state(VFIODevice *vbasedev,
643 char *idstr,
644 uint32_t instance_id,
645 uint32_t idx,
646 Error **errp)
647 {
648 g_autoptr(QIOChannelBuffer) bioc = NULL;
649 g_autoptr(QEMUFile) f = NULL;
650 int ret;
651 g_autofree VFIODeviceStatePacket *packet = NULL;
652 size_t packet_len;
653
654 bioc = qio_channel_buffer_new(0);
655 qio_channel_set_name(QIO_CHANNEL(bioc), "vfio-device-config-save");
656
657 f = qemu_file_new_output(QIO_CHANNEL(bioc));
658
659 if (vfio_save_device_config_state(f, vbasedev, errp)) {
660 return false;
661 }
662
663 ret = qemu_fflush(f);
664 if (ret) {
665 error_setg(errp, "%s: save config state flush failed: %d",
666 vbasedev->name, ret);
667 return false;
668 }
669
670 packet_len = sizeof(*packet) + bioc->usage;
671 packet = g_malloc0(packet_len);
672 packet->version = cpu_to_be32(VFIO_DEVICE_STATE_PACKET_VER_CURRENT);
673 packet->idx = cpu_to_be32(idx);
674 packet->flags = cpu_to_be32(VFIO_DEVICE_STATE_CONFIG_STATE);
675 memcpy(&packet->data, bioc->data, bioc->usage);
676
677 if (!multifd_queue_device_state(idstr, instance_id,
678 (char *)packet, packet_len)) {
679 error_setg(errp, "%s: multifd config data queuing failed",
680 vbasedev->name);
681 return false;
682 }
683
684 vfio_migration_add_bytes_transferred(packet_len);
685
686 return true;
687 }
688
689 /*
690 * This thread is spawned by the migration core directly via
691 * .save_complete_precopy_thread SaveVMHandler.
692 *
693 * It exits after either:
694 * * completing saving the remaining device state and device config, OR:
695 * * encountering some error while doing the above, OR:
696 * * being forcefully aborted by the migration core by
697 * multifd_device_state_save_thread_should_exit() returning true.
698 */
699 bool
700 vfio_multifd_save_complete_precopy_thread(SaveCompletePrecopyThreadData *d,
701 Error **errp)
702 {
703 VFIODevice *vbasedev = d->handler_opaque;
704 VFIOMigration *migration = vbasedev->migration;
705 bool ret = false;
706 g_autofree VFIODeviceStatePacket *packet = NULL;
707 uint32_t idx;
708
709 if (!vfio_multifd_transfer_enabled(vbasedev)) {
710 /* Nothing to do, vfio_save_complete_precopy() does the transfer. */
711 return true;
712 }
713
714 trace_vfio_save_complete_precopy_thread_start(vbasedev->name,
715 d->idstr, d->instance_id);
716
717 /* We reach here with device state STOP or STOP_COPY only */
718 if (vfio_migration_set_state(vbasedev, VFIO_DEVICE_STATE_STOP_COPY,
719 VFIO_DEVICE_STATE_STOP, errp)) {
720 goto thread_exit;
721 }
722
723 packet = g_malloc0(sizeof(*packet) + migration->data_buffer_size);
724 packet->version = cpu_to_be32(VFIO_DEVICE_STATE_PACKET_VER_CURRENT);
725
726 for (idx = 0; ; idx++) {
727 ssize_t data_size;
728 size_t packet_size;
729
730 if (multifd_device_state_save_thread_should_exit()) {
731 error_setg(errp, "operation cancelled");
732 goto thread_exit;
733 }
734
735 data_size = read(migration->data_fd, &packet->data,
736 migration->data_buffer_size);
737 if (data_size < 0) {
738 error_setg_errno(errp, errno,
739 "%s: reading state buffer %" PRIu32 " failed",
740 vbasedev->name, idx);
741 goto thread_exit;
742 } else if (data_size == 0) {
743 break;
744 }
745
746 packet->idx = cpu_to_be32(idx);
747 packet_size = sizeof(*packet) + data_size;
748
749 if (!multifd_queue_device_state(d->idstr, d->instance_id,
750 (char *)packet, packet_size)) {
751 error_setg(errp, "%s: multifd data queuing failed", vbasedev->name);
752 goto thread_exit;
753 }
754
755 vfio_migration_add_bytes_transferred(packet_size);
756 }
757
758 if (!vfio_save_complete_precopy_thread_config_state(vbasedev,
759 d->idstr,
760 d->instance_id,
761 idx, errp)) {
762 goto thread_exit;
763 }
764
765 ret = true;
766
767 thread_exit:
768 trace_vfio_save_complete_precopy_thread_end(vbasedev->name, ret);
769
770 return ret;
771 }
772
773 int vfio_multifd_switchover_start(VFIODevice *vbasedev)
774 {
775 VFIOMigration *migration = vbasedev->migration;
776 VFIOMultifd *multifd = migration->multifd;
777
778 assert(multifd);
779
780 /* The lock order is load_bufs_mutex -> BQL so unlock BQL here first */
781 bql_unlock();
782 WITH_QEMU_LOCK_GUARD(&multifd->load_bufs_mutex) {
783 assert(!multifd->load_bufs_thread_running);
784 multifd->load_bufs_thread_running = true;
785 }
786 bql_lock();
787
788 qemu_loadvm_start_load_thread(vfio_load_bufs_thread, vbasedev);
789
790 return 0;
791 }