1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include "qemu/osdep.h"
20#include "qemu/madvise.h"
21#include "exec/target_page.h"
22#include "migration.h"
23#include "qemu-file.h"
24#include "savevm.h"
25#include "postcopy-ram.h"
26#include "ram.h"
27#include "qapi/error.h"
28#include "qemu/notify.h"
29#include "qemu/rcu.h"
30#include "sysemu/sysemu.h"
31#include "qemu/error-report.h"
32#include "trace.h"
33#include "hw/boards.h"
34#include "exec/ramblock.h"
35#include "socket.h"
36#include "yank_functions.h"
37#include "tls.h"
38#include "qemu/userfaultfd.h"
39#include "qemu/mmap-alloc.h"
40#include "options.h"
41
42
43
44
45#define MAX_DISCARDS_PER_COMMAND 12
46
47struct PostcopyDiscardState {
48 const char *ramblock_name;
49 uint16_t cur_entry;
50
51
52
53 uint64_t start_list[MAX_DISCARDS_PER_COMMAND];
54 uint64_t length_list[MAX_DISCARDS_PER_COMMAND];
55 unsigned int nsentwords;
56 unsigned int nsentcmds;
57};
58
59static NotifierWithReturnList postcopy_notifier_list;
60
61void postcopy_infrastructure_init(void)
62{
63 notifier_with_return_list_init(&postcopy_notifier_list);
64}
65
66void postcopy_add_notifier(NotifierWithReturn *nn)
67{
68 notifier_with_return_list_add(&postcopy_notifier_list, nn);
69}
70
71void postcopy_remove_notifier(NotifierWithReturn *n)
72{
73 notifier_with_return_remove(n);
74}
75
76int postcopy_notify(enum PostcopyNotifyReason reason, Error **errp)
77{
78 struct PostcopyNotifyData pnd;
79 pnd.reason = reason;
80 pnd.errp = errp;
81
82 return notifier_with_return_list_notify(&postcopy_notifier_list,
83 &pnd);
84}
85
86
87
88
89
90void postcopy_thread_create(MigrationIncomingState *mis,
91 QemuThread *thread, const char *name,
92 void *(*fn)(void *), int joinable)
93{
94 qemu_sem_init(&mis->thread_sync_sem, 0);
95 qemu_thread_create(thread, name, fn, mis, joinable);
96 qemu_sem_wait(&mis->thread_sync_sem);
97 qemu_sem_destroy(&mis->thread_sync_sem);
98}
99
100
101
102
103
104#if defined(__linux__)
105
106#include <poll.h>
107#include <sys/ioctl.h>
108#include <sys/syscall.h>
109#include <asm/types.h>
110#endif
111
112#if defined(__linux__) && defined(__NR_userfaultfd) && defined(CONFIG_EVENTFD)
113#include <sys/eventfd.h>
114#include <linux/userfaultfd.h>
115
116typedef struct PostcopyBlocktimeContext {
117
118 uint32_t *page_fault_vcpu_time;
119
120 uintptr_t *vcpu_addr;
121 uint32_t total_blocktime;
122
123 uint32_t *vcpu_blocktime;
124
125 uint32_t last_begin;
126
127 int smp_cpus_down;
128 uint64_t start_time;
129
130
131
132
133
134 Notifier exit_notifier;
135} PostcopyBlocktimeContext;
136
137static void destroy_blocktime_context(struct PostcopyBlocktimeContext *ctx)
138{
139 g_free(ctx->page_fault_vcpu_time);
140 g_free(ctx->vcpu_addr);
141 g_free(ctx->vcpu_blocktime);
142 g_free(ctx);
143}
144
145static void migration_exit_cb(Notifier *n, void *data)
146{
147 PostcopyBlocktimeContext *ctx = container_of(n, PostcopyBlocktimeContext,
148 exit_notifier);
149 destroy_blocktime_context(ctx);
150}
151
152static struct PostcopyBlocktimeContext *blocktime_context_new(void)
153{
154 MachineState *ms = MACHINE(qdev_get_machine());
155 unsigned int smp_cpus = ms->smp.cpus;
156 PostcopyBlocktimeContext *ctx = g_new0(PostcopyBlocktimeContext, 1);
157 ctx->page_fault_vcpu_time = g_new0(uint32_t, smp_cpus);
158 ctx->vcpu_addr = g_new0(uintptr_t, smp_cpus);
159 ctx->vcpu_blocktime = g_new0(uint32_t, smp_cpus);
160
161 ctx->exit_notifier.notify = migration_exit_cb;
162 ctx->start_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
163 qemu_add_exit_notifier(&ctx->exit_notifier);
164 return ctx;
165}
166
167static uint32List *get_vcpu_blocktime_list(PostcopyBlocktimeContext *ctx)
168{
169 MachineState *ms = MACHINE(qdev_get_machine());
170 uint32List *list = NULL;
171 int i;
172
173 for (i = ms->smp.cpus - 1; i >= 0; i--) {
174 QAPI_LIST_PREPEND(list, ctx->vcpu_blocktime[i]);
175 }
176
177 return list;
178}
179
180
181
182
183
184
185
186
187void fill_destination_postcopy_migration_info(MigrationInfo *info)
188{
189 MigrationIncomingState *mis = migration_incoming_get_current();
190 PostcopyBlocktimeContext *bc = mis->blocktime_ctx;
191
192 if (!bc) {
193 return;
194 }
195
196 info->has_postcopy_blocktime = true;
197 info->postcopy_blocktime = bc->total_blocktime;
198 info->has_postcopy_vcpu_blocktime = true;
199 info->postcopy_vcpu_blocktime = get_vcpu_blocktime_list(bc);
200}
201
202static uint32_t get_postcopy_total_blocktime(void)
203{
204 MigrationIncomingState *mis = migration_incoming_get_current();
205 PostcopyBlocktimeContext *bc = mis->blocktime_ctx;
206
207 if (!bc) {
208 return 0;
209 }
210
211 return bc->total_blocktime;
212}
213
214
215
216
217
218
219
220
221
222
223
224static bool receive_ufd_features(uint64_t *features)
225{
226 struct uffdio_api api_struct = {0};
227 int ufd;
228 bool ret = true;
229
230 ufd = uffd_open(O_CLOEXEC);
231 if (ufd == -1) {
232 error_report("%s: uffd_open() failed: %s", __func__, strerror(errno));
233 return false;
234 }
235
236
237 api_struct.api = UFFD_API;
238 api_struct.features = 0;
239 if (ioctl(ufd, UFFDIO_API, &api_struct)) {
240 error_report("%s: UFFDIO_API failed: %s", __func__,
241 strerror(errno));
242 ret = false;
243 goto release_ufd;
244 }
245
246 *features = api_struct.features;
247
248release_ufd:
249 close(ufd);
250 return ret;
251}
252
253
254
255
256
257
258
259
260
261
262static bool request_ufd_features(int ufd, uint64_t features)
263{
264 struct uffdio_api api_struct = {0};
265 uint64_t ioctl_mask;
266
267 api_struct.api = UFFD_API;
268 api_struct.features = features;
269 if (ioctl(ufd, UFFDIO_API, &api_struct)) {
270 error_report("%s failed: UFFDIO_API failed: %s", __func__,
271 strerror(errno));
272 return false;
273 }
274
275 ioctl_mask = (__u64)1 << _UFFDIO_REGISTER |
276 (__u64)1 << _UFFDIO_UNREGISTER;
277 if ((api_struct.ioctls & ioctl_mask) != ioctl_mask) {
278 error_report("Missing userfault features: %" PRIx64,
279 (uint64_t)(~api_struct.ioctls & ioctl_mask));
280 return false;
281 }
282
283 return true;
284}
285
286static bool ufd_check_and_apply(int ufd, MigrationIncomingState *mis,
287 Error **errp)
288{
289 uint64_t asked_features = 0;
290 static uint64_t supported_features;
291
292 ERRP_GUARD();
293
294
295
296
297
298 if (!supported_features) {
299 if (!receive_ufd_features(&supported_features)) {
300 error_setg(errp, "Userfault feature detection failed");
301 return false;
302 }
303 }
304
305#ifdef UFFD_FEATURE_THREAD_ID
306 if (UFFD_FEATURE_THREAD_ID & supported_features) {
307 asked_features |= UFFD_FEATURE_THREAD_ID;
308 if (migrate_postcopy_blocktime()) {
309 if (!mis->blocktime_ctx) {
310 mis->blocktime_ctx = blocktime_context_new();
311 }
312 }
313 }
314#endif
315
316
317
318
319
320
321 if (!request_ufd_features(ufd, asked_features)) {
322 error_setg(errp, "Failed features %" PRIu64, asked_features);
323 return false;
324 }
325
326 if (qemu_real_host_page_size() != ram_pagesize_summary()) {
327 bool have_hp = false;
328
329#ifdef UFFD_FEATURE_MISSING_HUGETLBFS
330 have_hp = supported_features & UFFD_FEATURE_MISSING_HUGETLBFS;
331#endif
332 if (!have_hp) {
333 error_setg(errp,
334 "Userfault on this host does not support huge pages");
335 return false;
336 }
337 }
338 return true;
339}
340
341
342
343static int test_ramblock_postcopiable(RAMBlock *rb, Error **errp)
344{
345 const char *block_name = qemu_ram_get_idstr(rb);
346 ram_addr_t length = qemu_ram_get_used_length(rb);
347 size_t pagesize = qemu_ram_pagesize(rb);
348 QemuFsType fs;
349
350 if (length % pagesize) {
351 error_setg(errp,
352 "Postcopy requires RAM blocks to be a page size multiple,"
353 " block %s is 0x" RAM_ADDR_FMT " bytes with a "
354 "page size of 0x%zx", block_name, length, pagesize);
355 return 1;
356 }
357
358 if (rb->fd >= 0) {
359 fs = qemu_fd_getfs(rb->fd);
360 if (fs != QEMU_FS_TYPE_TMPFS && fs != QEMU_FS_TYPE_HUGETLBFS) {
361 error_setg(errp,
362 "Host backend files need to be TMPFS or HUGETLBFS only");
363 return 1;
364 }
365 }
366
367 return 0;
368}
369
370
371
372
373
374
375bool postcopy_ram_supported_by_host(MigrationIncomingState *mis, Error **errp)
376{
377 long pagesize = qemu_real_host_page_size();
378 int ufd = -1;
379 bool ret = false;
380 void *testarea = NULL;
381 struct uffdio_register reg_struct;
382 struct uffdio_range range_struct;
383 uint64_t feature_mask;
384 RAMBlock *block;
385
386 ERRP_GUARD();
387 if (qemu_target_page_size() > pagesize) {
388 error_setg(errp, "Target page size bigger than host page size");
389 goto out;
390 }
391
392 ufd = uffd_open(O_CLOEXEC);
393 if (ufd == -1) {
394 error_setg(errp, "Userfaultfd not available: %s", strerror(errno));
395 goto out;
396 }
397
398
399 if (postcopy_notify(POSTCOPY_NOTIFY_PROBE, errp)) {
400 goto out;
401 }
402
403
404 if (!ufd_check_and_apply(ufd, mis, errp)) {
405 goto out;
406 }
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421 RAMBLOCK_FOREACH(block) {
422 if (test_ramblock_postcopiable(block, errp)) {
423 goto out;
424 }
425 }
426
427
428
429
430
431 if (munlockall()) {
432 error_setg(errp, "munlockall() failed: %s", strerror(errno));
433 goto out;
434 }
435
436
437
438
439
440
441 testarea = mmap(NULL, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE |
442 MAP_ANONYMOUS, -1, 0);
443 if (testarea == MAP_FAILED) {
444 error_setg(errp, "Failed to map test area: %s", strerror(errno));
445 goto out;
446 }
447 g_assert(QEMU_PTR_IS_ALIGNED(testarea, pagesize));
448
449 reg_struct.range.start = (uintptr_t)testarea;
450 reg_struct.range.len = pagesize;
451 reg_struct.mode = UFFDIO_REGISTER_MODE_MISSING;
452
453 if (ioctl(ufd, UFFDIO_REGISTER, ®_struct)) {
454 error_setg(errp, "UFFDIO_REGISTER failed: %s", strerror(errno));
455 goto out;
456 }
457
458 range_struct.start = (uintptr_t)testarea;
459 range_struct.len = pagesize;
460 if (ioctl(ufd, UFFDIO_UNREGISTER, &range_struct)) {
461 error_setg(errp, "UFFDIO_UNREGISTER failed: %s", strerror(errno));
462 goto out;
463 }
464
465 feature_mask = (__u64)1 << _UFFDIO_WAKE |
466 (__u64)1 << _UFFDIO_COPY |
467 (__u64)1 << _UFFDIO_ZEROPAGE;
468 if ((reg_struct.ioctls & feature_mask) != feature_mask) {
469 error_setg(errp, "Missing userfault map features: %" PRIx64,
470 (uint64_t)(~reg_struct.ioctls & feature_mask));
471 goto out;
472 }
473
474
475 ret = true;
476out:
477 if (testarea) {
478 munmap(testarea, pagesize);
479 }
480 if (ufd != -1) {
481 close(ufd);
482 }
483 return ret;
484}
485
486
487
488
489
490
491static int init_range(RAMBlock *rb, void *opaque)
492{
493 const char *block_name = qemu_ram_get_idstr(rb);
494 void *host_addr = qemu_ram_get_host_addr(rb);
495 ram_addr_t offset = qemu_ram_get_offset(rb);
496 ram_addr_t length = qemu_ram_get_used_length(rb);
497 trace_postcopy_init_range(block_name, host_addr, offset, length);
498
499
500
501
502
503
504 rb->postcopy_length = length;
505
506
507
508
509
510
511
512 if (ram_discard_range(block_name, 0, length)) {
513 return -1;
514 }
515
516 return 0;
517}
518
519
520
521
522
523static int cleanup_range(RAMBlock *rb, void *opaque)
524{
525 const char *block_name = qemu_ram_get_idstr(rb);
526 void *host_addr = qemu_ram_get_host_addr(rb);
527 ram_addr_t offset = qemu_ram_get_offset(rb);
528 ram_addr_t length = rb->postcopy_length;
529 MigrationIncomingState *mis = opaque;
530 struct uffdio_range range_struct;
531 trace_postcopy_cleanup_range(block_name, host_addr, offset, length);
532
533
534
535
536
537 qemu_madvise(host_addr, length, QEMU_MADV_HUGEPAGE);
538
539
540
541
542
543
544 range_struct.start = (uintptr_t)host_addr;
545 range_struct.len = length;
546
547 if (ioctl(mis->userfault_fd, UFFDIO_UNREGISTER, &range_struct)) {
548 error_report("%s: userfault unregister %s", __func__, strerror(errno));
549
550 return -1;
551 }
552
553 return 0;
554}
555
556
557
558
559
560
561int postcopy_ram_incoming_init(MigrationIncomingState *mis)
562{
563 if (foreach_not_ignored_block(init_range, NULL)) {
564 return -1;
565 }
566
567 return 0;
568}
569
570static void postcopy_temp_pages_cleanup(MigrationIncomingState *mis)
571{
572 int i;
573
574 if (mis->postcopy_tmp_pages) {
575 for (i = 0; i < mis->postcopy_channels; i++) {
576 if (mis->postcopy_tmp_pages[i].tmp_huge_page) {
577 munmap(mis->postcopy_tmp_pages[i].tmp_huge_page,
578 mis->largest_page_size);
579 mis->postcopy_tmp_pages[i].tmp_huge_page = NULL;
580 }
581 }
582 g_free(mis->postcopy_tmp_pages);
583 mis->postcopy_tmp_pages = NULL;
584 }
585
586 if (mis->postcopy_tmp_zero_page) {
587 munmap(mis->postcopy_tmp_zero_page, mis->largest_page_size);
588 mis->postcopy_tmp_zero_page = NULL;
589 }
590}
591
592
593
594
595int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
596{
597 trace_postcopy_ram_incoming_cleanup_entry();
598
599 if (mis->preempt_thread_status == PREEMPT_THREAD_CREATED) {
600
601 mis->preempt_thread_status = PREEMPT_THREAD_QUIT;
602 if (mis->postcopy_qemufile_dst) {
603 qemu_file_shutdown(mis->postcopy_qemufile_dst);
604 }
605 qemu_thread_join(&mis->postcopy_prio_thread);
606 mis->preempt_thread_status = PREEMPT_THREAD_NONE;
607 }
608
609 if (mis->have_fault_thread) {
610 Error *local_err = NULL;
611
612
613 qatomic_set(&mis->fault_thread_quit, 1);
614 postcopy_fault_thread_notify(mis);
615 trace_postcopy_ram_incoming_cleanup_join();
616 qemu_thread_join(&mis->fault_thread);
617
618 if (postcopy_notify(POSTCOPY_NOTIFY_INBOUND_END, &local_err)) {
619 error_report_err(local_err);
620 return -1;
621 }
622
623 if (foreach_not_ignored_block(cleanup_range, mis)) {
624 return -1;
625 }
626
627 trace_postcopy_ram_incoming_cleanup_closeuf();
628 close(mis->userfault_fd);
629 close(mis->userfault_event_fd);
630 mis->have_fault_thread = false;
631 }
632
633 if (enable_mlock) {
634 if (os_mlock() < 0) {
635 error_report("mlock: %s", strerror(errno));
636
637
638
639
640 }
641 }
642
643 postcopy_temp_pages_cleanup(mis);
644
645 trace_postcopy_ram_incoming_cleanup_blocktime(
646 get_postcopy_total_blocktime());
647
648 trace_postcopy_ram_incoming_cleanup_exit();
649 return 0;
650}
651
652
653
654
655static int nhp_range(RAMBlock *rb, void *opaque)
656{
657 const char *block_name = qemu_ram_get_idstr(rb);
658 void *host_addr = qemu_ram_get_host_addr(rb);
659 ram_addr_t offset = qemu_ram_get_offset(rb);
660 ram_addr_t length = rb->postcopy_length;
661 trace_postcopy_nhp_range(block_name, host_addr, offset, length);
662
663
664
665
666
667
668 qemu_madvise(host_addr, length, QEMU_MADV_NOHUGEPAGE);
669
670 return 0;
671}
672
673
674
675
676
677
678int postcopy_ram_prepare_discard(MigrationIncomingState *mis)
679{
680 if (foreach_not_ignored_block(nhp_range, mis)) {
681 return -1;
682 }
683
684 postcopy_state_set(POSTCOPY_INCOMING_DISCARD);
685
686 return 0;
687}
688
689
690
691
692
693
694
695
696
697
698static int ram_block_enable_notify(RAMBlock *rb, void *opaque)
699{
700 MigrationIncomingState *mis = opaque;
701 struct uffdio_register reg_struct;
702
703 reg_struct.range.start = (uintptr_t)qemu_ram_get_host_addr(rb);
704 reg_struct.range.len = rb->postcopy_length;
705 reg_struct.mode = UFFDIO_REGISTER_MODE_MISSING;
706
707
708 if (ioctl(mis->userfault_fd, UFFDIO_REGISTER, ®_struct)) {
709 error_report("%s userfault register: %s", __func__, strerror(errno));
710 return -1;
711 }
712 if (!(reg_struct.ioctls & ((__u64)1 << _UFFDIO_COPY))) {
713 error_report("%s userfault: Region doesn't support COPY", __func__);
714 return -1;
715 }
716 if (reg_struct.ioctls & ((__u64)1 << _UFFDIO_ZEROPAGE)) {
717 qemu_ram_set_uf_zeroable(rb);
718 }
719
720 return 0;
721}
722
723int postcopy_wake_shared(struct PostCopyFD *pcfd,
724 uint64_t client_addr,
725 RAMBlock *rb)
726{
727 size_t pagesize = qemu_ram_pagesize(rb);
728 struct uffdio_range range;
729 int ret;
730 trace_postcopy_wake_shared(client_addr, qemu_ram_get_idstr(rb));
731 range.start = ROUND_DOWN(client_addr, pagesize);
732 range.len = pagesize;
733 ret = ioctl(pcfd->fd, UFFDIO_WAKE, &range);
734 if (ret) {
735 error_report("%s: Failed to wake: %zx in %s (%s)",
736 __func__, (size_t)client_addr, qemu_ram_get_idstr(rb),
737 strerror(errno));
738 }
739 return ret;
740}
741
742static int postcopy_request_page(MigrationIncomingState *mis, RAMBlock *rb,
743 ram_addr_t start, uint64_t haddr)
744{
745 void *aligned = (void *)(uintptr_t)ROUND_DOWN(haddr, qemu_ram_pagesize(rb));
746
747
748
749
750
751
752
753
754
755 assert(QEMU_IS_ALIGNED(start, qemu_ram_pagesize(rb)));
756 if (ramblock_page_is_discarded(rb, start)) {
757 bool received = ramblock_recv_bitmap_test_byte_offset(rb, start);
758
759 return received ? 0 : postcopy_place_page_zero(mis, aligned, rb);
760 }
761
762 return migrate_send_rp_req_pages(mis, rb, start, haddr);
763}
764
765
766
767
768
769
770int postcopy_request_shared_page(struct PostCopyFD *pcfd, RAMBlock *rb,
771 uint64_t client_addr, uint64_t rb_offset)
772{
773 uint64_t aligned_rbo = ROUND_DOWN(rb_offset, qemu_ram_pagesize(rb));
774 MigrationIncomingState *mis = migration_incoming_get_current();
775
776 trace_postcopy_request_shared_page(pcfd->idstr, qemu_ram_get_idstr(rb),
777 rb_offset);
778 if (ramblock_recv_bitmap_test_byte_offset(rb, aligned_rbo)) {
779 trace_postcopy_request_shared_page_present(pcfd->idstr,
780 qemu_ram_get_idstr(rb), rb_offset);
781 return postcopy_wake_shared(pcfd, client_addr, rb);
782 }
783 postcopy_request_page(mis, rb, aligned_rbo, client_addr);
784 return 0;
785}
786
787static int get_mem_fault_cpu_index(uint32_t pid)
788{
789 CPUState *cpu_iter;
790
791 CPU_FOREACH(cpu_iter) {
792 if (cpu_iter->thread_id == pid) {
793 trace_get_mem_fault_cpu_index(cpu_iter->cpu_index, pid);
794 return cpu_iter->cpu_index;
795 }
796 }
797 trace_get_mem_fault_cpu_index(-1, pid);
798 return -1;
799}
800
801static uint32_t get_low_time_offset(PostcopyBlocktimeContext *dc)
802{
803 int64_t start_time_offset = qemu_clock_get_ms(QEMU_CLOCK_REALTIME) -
804 dc->start_time;
805 return start_time_offset < 1 ? 1 : start_time_offset & UINT32_MAX;
806}
807
808
809
810
811
812
813
814
815
816static void mark_postcopy_blocktime_begin(uintptr_t addr, uint32_t ptid,
817 RAMBlock *rb)
818{
819 int cpu, already_received;
820 MigrationIncomingState *mis = migration_incoming_get_current();
821 PostcopyBlocktimeContext *dc = mis->blocktime_ctx;
822 uint32_t low_time_offset;
823
824 if (!dc || ptid == 0) {
825 return;
826 }
827 cpu = get_mem_fault_cpu_index(ptid);
828 if (cpu < 0) {
829 return;
830 }
831
832 low_time_offset = get_low_time_offset(dc);
833 if (dc->vcpu_addr[cpu] == 0) {
834 qatomic_inc(&dc->smp_cpus_down);
835 }
836
837 qatomic_xchg(&dc->last_begin, low_time_offset);
838 qatomic_xchg(&dc->page_fault_vcpu_time[cpu], low_time_offset);
839 qatomic_xchg(&dc->vcpu_addr[cpu], addr);
840
841
842
843
844
845
846 already_received = ramblock_recv_bitmap_test(rb, (void *)addr);
847 if (already_received) {
848 qatomic_xchg(&dc->vcpu_addr[cpu], 0);
849 qatomic_xchg(&dc->page_fault_vcpu_time[cpu], 0);
850 qatomic_dec(&dc->smp_cpus_down);
851 }
852 trace_mark_postcopy_blocktime_begin(addr, dc, dc->page_fault_vcpu_time[cpu],
853 cpu, already_received);
854}
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883static void mark_postcopy_blocktime_end(uintptr_t addr)
884{
885 MigrationIncomingState *mis = migration_incoming_get_current();
886 PostcopyBlocktimeContext *dc = mis->blocktime_ctx;
887 MachineState *ms = MACHINE(qdev_get_machine());
888 unsigned int smp_cpus = ms->smp.cpus;
889 int i, affected_cpu = 0;
890 bool vcpu_total_blocktime = false;
891 uint32_t read_vcpu_time, low_time_offset;
892
893 if (!dc) {
894 return;
895 }
896
897 low_time_offset = get_low_time_offset(dc);
898
899
900
901
902 for (i = 0; i < smp_cpus; i++) {
903 uint32_t vcpu_blocktime = 0;
904
905 read_vcpu_time = qatomic_fetch_add(&dc->page_fault_vcpu_time[i], 0);
906 if (qatomic_fetch_add(&dc->vcpu_addr[i], 0) != addr ||
907 read_vcpu_time == 0) {
908 continue;
909 }
910 qatomic_xchg(&dc->vcpu_addr[i], 0);
911 vcpu_blocktime = low_time_offset - read_vcpu_time;
912 affected_cpu += 1;
913
914
915
916 if (!vcpu_total_blocktime &&
917 qatomic_fetch_add(&dc->smp_cpus_down, 0) == smp_cpus) {
918 vcpu_total_blocktime = true;
919 }
920
921 dc->vcpu_blocktime[i] += vcpu_blocktime;
922 }
923
924 qatomic_sub(&dc->smp_cpus_down, affected_cpu);
925 if (vcpu_total_blocktime) {
926 dc->total_blocktime += low_time_offset - qatomic_fetch_add(
927 &dc->last_begin, 0);
928 }
929 trace_mark_postcopy_blocktime_end(addr, dc, dc->total_blocktime,
930 affected_cpu);
931}
932
933static void postcopy_pause_fault_thread(MigrationIncomingState *mis)
934{
935 trace_postcopy_pause_fault_thread();
936 qemu_sem_wait(&mis->postcopy_pause_sem_fault);
937 trace_postcopy_pause_fault_thread_continued();
938}
939
940
941
942
943static void *postcopy_ram_fault_thread(void *opaque)
944{
945 MigrationIncomingState *mis = opaque;
946 struct uffd_msg msg;
947 int ret;
948 size_t index;
949 RAMBlock *rb = NULL;
950
951 trace_postcopy_ram_fault_thread_entry();
952 rcu_register_thread();
953 mis->last_rb = NULL;
954 qemu_sem_post(&mis->thread_sync_sem);
955
956 struct pollfd *pfd;
957 size_t pfd_len = 2 + mis->postcopy_remote_fds->len;
958
959 pfd = g_new0(struct pollfd, pfd_len);
960
961 pfd[0].fd = mis->userfault_fd;
962 pfd[0].events = POLLIN;
963 pfd[1].fd = mis->userfault_event_fd;
964 pfd[1].events = POLLIN;
965 trace_postcopy_ram_fault_thread_fds_core(pfd[0].fd, pfd[1].fd);
966 for (index = 0; index < mis->postcopy_remote_fds->len; index++) {
967 struct PostCopyFD *pcfd = &g_array_index(mis->postcopy_remote_fds,
968 struct PostCopyFD, index);
969 pfd[2 + index].fd = pcfd->fd;
970 pfd[2 + index].events = POLLIN;
971 trace_postcopy_ram_fault_thread_fds_extra(2 + index, pcfd->idstr,
972 pcfd->fd);
973 }
974
975 while (true) {
976 ram_addr_t rb_offset;
977 int poll_result;
978
979
980
981
982
983
984
985 poll_result = poll(pfd, pfd_len, -1 );
986 if (poll_result == -1) {
987 error_report("%s: userfault poll: %s", __func__, strerror(errno));
988 break;
989 }
990
991 if (!mis->to_src_file) {
992
993
994
995
996
997 postcopy_pause_fault_thread(mis);
998 }
999
1000 if (pfd[1].revents) {
1001 uint64_t tmp64 = 0;
1002
1003
1004 if (read(mis->userfault_event_fd, &tmp64, 8) != 8) {
1005
1006 error_report("%s: read() failed", __func__);
1007 }
1008
1009 if (qatomic_read(&mis->fault_thread_quit)) {
1010 trace_postcopy_ram_fault_thread_quit();
1011 break;
1012 }
1013 }
1014
1015 if (pfd[0].revents) {
1016 poll_result--;
1017 ret = read(mis->userfault_fd, &msg, sizeof(msg));
1018 if (ret != sizeof(msg)) {
1019 if (errno == EAGAIN) {
1020
1021
1022
1023
1024 continue;
1025 }
1026 if (ret < 0) {
1027 error_report("%s: Failed to read full userfault "
1028 "message: %s",
1029 __func__, strerror(errno));
1030 break;
1031 } else {
1032 error_report("%s: Read %d bytes from userfaultfd "
1033 "expected %zd",
1034 __func__, ret, sizeof(msg));
1035 break;
1036 }
1037 }
1038 if (msg.event != UFFD_EVENT_PAGEFAULT) {
1039 error_report("%s: Read unexpected event %ud from userfaultfd",
1040 __func__, msg.event);
1041 continue;
1042 }
1043
1044 rb = qemu_ram_block_from_host(
1045 (void *)(uintptr_t)msg.arg.pagefault.address,
1046 true, &rb_offset);
1047 if (!rb) {
1048 error_report("postcopy_ram_fault_thread: Fault outside guest: %"
1049 PRIx64, (uint64_t)msg.arg.pagefault.address);
1050 break;
1051 }
1052
1053 rb_offset = ROUND_DOWN(rb_offset, qemu_ram_pagesize(rb));
1054 trace_postcopy_ram_fault_thread_request(msg.arg.pagefault.address,
1055 qemu_ram_get_idstr(rb),
1056 rb_offset,
1057 msg.arg.pagefault.feat.ptid);
1058 mark_postcopy_blocktime_begin(
1059 (uintptr_t)(msg.arg.pagefault.address),
1060 msg.arg.pagefault.feat.ptid, rb);
1061
1062retry:
1063
1064
1065
1066
1067 ret = postcopy_request_page(mis, rb, rb_offset,
1068 msg.arg.pagefault.address);
1069 if (ret) {
1070
1071 postcopy_pause_fault_thread(mis);
1072 goto retry;
1073 }
1074 }
1075
1076
1077
1078 for (index = 2; index < pfd_len && poll_result; index++) {
1079 if (pfd[index].revents) {
1080 struct PostCopyFD *pcfd =
1081 &g_array_index(mis->postcopy_remote_fds,
1082 struct PostCopyFD, index - 2);
1083
1084 poll_result--;
1085 if (pfd[index].revents & POLLERR) {
1086 error_report("%s: POLLERR on poll %zd fd=%d",
1087 __func__, index, pcfd->fd);
1088 pfd[index].events = 0;
1089 continue;
1090 }
1091
1092 ret = read(pcfd->fd, &msg, sizeof(msg));
1093 if (ret != sizeof(msg)) {
1094 if (errno == EAGAIN) {
1095
1096
1097
1098
1099 continue;
1100 }
1101 if (ret < 0) {
1102 error_report("%s: Failed to read full userfault "
1103 "message: %s (shared) revents=%d",
1104 __func__, strerror(errno),
1105 pfd[index].revents);
1106
1107 break;
1108 } else {
1109 error_report("%s: Read %d bytes from userfaultfd "
1110 "expected %zd (shared)",
1111 __func__, ret, sizeof(msg));
1112
1113 break;
1114 }
1115 }
1116 if (msg.event != UFFD_EVENT_PAGEFAULT) {
1117 error_report("%s: Read unexpected event %ud "
1118 "from userfaultfd (shared)",
1119 __func__, msg.event);
1120 continue;
1121 }
1122
1123 ret = pcfd->handler(pcfd, &msg);
1124 if (ret) {
1125 error_report("%s: Failed to resolve shared fault on %zd/%s",
1126 __func__, index, pcfd->idstr);
1127
1128 }
1129 }
1130 }
1131 }
1132 rcu_unregister_thread();
1133 trace_postcopy_ram_fault_thread_exit();
1134 g_free(pfd);
1135 return NULL;
1136}
1137
1138static int postcopy_temp_pages_setup(MigrationIncomingState *mis)
1139{
1140 PostcopyTmpPage *tmp_page;
1141 int err, i, channels;
1142 void *temp_page;
1143
1144 if (migrate_postcopy_preempt()) {
1145
1146 mis->postcopy_channels = RAM_CHANNEL_MAX;
1147 } else {
1148
1149 mis->postcopy_channels = 1;
1150 }
1151
1152 channels = mis->postcopy_channels;
1153 mis->postcopy_tmp_pages = g_malloc0_n(sizeof(PostcopyTmpPage), channels);
1154
1155 for (i = 0; i < channels; i++) {
1156 tmp_page = &mis->postcopy_tmp_pages[i];
1157 temp_page = mmap(NULL, mis->largest_page_size, PROT_READ | PROT_WRITE,
1158 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1159 if (temp_page == MAP_FAILED) {
1160 err = errno;
1161 error_report("%s: Failed to map postcopy_tmp_pages[%d]: %s",
1162 __func__, i, strerror(err));
1163
1164 return -err;
1165 }
1166 tmp_page->tmp_huge_page = temp_page;
1167
1168 postcopy_temp_page_reset(tmp_page);
1169 }
1170
1171
1172
1173
1174 mis->postcopy_tmp_zero_page = mmap(NULL, mis->largest_page_size,
1175 PROT_READ | PROT_WRITE,
1176 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
1177 if (mis->postcopy_tmp_zero_page == MAP_FAILED) {
1178 err = errno;
1179 mis->postcopy_tmp_zero_page = NULL;
1180 error_report("%s: Failed to map large zero page %s",
1181 __func__, strerror(err));
1182 return -err;
1183 }
1184
1185 memset(mis->postcopy_tmp_zero_page, '\0', mis->largest_page_size);
1186
1187 return 0;
1188}
1189
1190int postcopy_ram_incoming_setup(MigrationIncomingState *mis)
1191{
1192 Error *local_err = NULL;
1193
1194
1195 mis->userfault_fd = uffd_open(O_CLOEXEC | O_NONBLOCK);
1196 if (mis->userfault_fd == -1) {
1197 error_report("%s: Failed to open userfault fd: %s", __func__,
1198 strerror(errno));
1199 return -1;
1200 }
1201
1202
1203
1204
1205
1206 if (!ufd_check_and_apply(mis->userfault_fd, mis, &local_err)) {
1207 error_report_err(local_err);
1208 return -1;
1209 }
1210
1211
1212 mis->userfault_event_fd = eventfd(0, EFD_CLOEXEC);
1213 if (mis->userfault_event_fd == -1) {
1214 error_report("%s: Opening userfault_event_fd: %s", __func__,
1215 strerror(errno));
1216 close(mis->userfault_fd);
1217 return -1;
1218 }
1219
1220 postcopy_thread_create(mis, &mis->fault_thread, "fault-default",
1221 postcopy_ram_fault_thread, QEMU_THREAD_JOINABLE);
1222 mis->have_fault_thread = true;
1223
1224
1225 if (foreach_not_ignored_block(ram_block_enable_notify, mis)) {
1226 error_report("ram_block_enable_notify failed");
1227 return -1;
1228 }
1229
1230 if (postcopy_temp_pages_setup(mis)) {
1231
1232 return -1;
1233 }
1234
1235 if (migrate_postcopy_preempt()) {
1236
1237
1238
1239
1240 postcopy_thread_create(mis, &mis->postcopy_prio_thread, "fault-fast",
1241 postcopy_preempt_thread, QEMU_THREAD_JOINABLE);
1242 mis->preempt_thread_status = PREEMPT_THREAD_CREATED;
1243 }
1244
1245 trace_postcopy_ram_enable_notify();
1246
1247 return 0;
1248}
1249
1250static int qemu_ufd_copy_ioctl(MigrationIncomingState *mis, void *host_addr,
1251 void *from_addr, uint64_t pagesize, RAMBlock *rb)
1252{
1253 int userfault_fd = mis->userfault_fd;
1254 int ret;
1255
1256 if (from_addr) {
1257 struct uffdio_copy copy_struct;
1258 copy_struct.dst = (uint64_t)(uintptr_t)host_addr;
1259 copy_struct.src = (uint64_t)(uintptr_t)from_addr;
1260 copy_struct.len = pagesize;
1261 copy_struct.mode = 0;
1262 ret = ioctl(userfault_fd, UFFDIO_COPY, ©_struct);
1263 } else {
1264 struct uffdio_zeropage zero_struct;
1265 zero_struct.range.start = (uint64_t)(uintptr_t)host_addr;
1266 zero_struct.range.len = pagesize;
1267 zero_struct.mode = 0;
1268 ret = ioctl(userfault_fd, UFFDIO_ZEROPAGE, &zero_struct);
1269 }
1270 if (!ret) {
1271 qemu_mutex_lock(&mis->page_request_mutex);
1272 ramblock_recv_bitmap_set_range(rb, host_addr,
1273 pagesize / qemu_target_page_size());
1274
1275
1276
1277
1278 if (g_tree_lookup(mis->page_requested, host_addr)) {
1279 g_tree_remove(mis->page_requested, host_addr);
1280 mis->page_requested_count--;
1281 trace_postcopy_page_req_del(host_addr, mis->page_requested_count);
1282 }
1283 qemu_mutex_unlock(&mis->page_request_mutex);
1284 mark_postcopy_blocktime_end((uintptr_t)host_addr);
1285 }
1286 return ret;
1287}
1288
1289int postcopy_notify_shared_wake(RAMBlock *rb, uint64_t offset)
1290{
1291 int i;
1292 MigrationIncomingState *mis = migration_incoming_get_current();
1293 GArray *pcrfds = mis->postcopy_remote_fds;
1294
1295 for (i = 0; i < pcrfds->len; i++) {
1296 struct PostCopyFD *cur = &g_array_index(pcrfds, struct PostCopyFD, i);
1297 int ret = cur->waker(cur, rb, offset);
1298 if (ret) {
1299 return ret;
1300 }
1301 }
1302 return 0;
1303}
1304
1305
1306
1307
1308
1309int postcopy_place_page(MigrationIncomingState *mis, void *host, void *from,
1310 RAMBlock *rb)
1311{
1312 size_t pagesize = qemu_ram_pagesize(rb);
1313
1314
1315
1316
1317
1318
1319 if (qemu_ufd_copy_ioctl(mis, host, from, pagesize, rb)) {
1320 int e = errno;
1321 error_report("%s: %s copy host: %p from: %p (size: %zd)",
1322 __func__, strerror(e), host, from, pagesize);
1323
1324 return -e;
1325 }
1326
1327 trace_postcopy_place_page(host);
1328 return postcopy_notify_shared_wake(rb,
1329 qemu_ram_block_host_offset(rb, host));
1330}
1331
1332
1333
1334
1335
1336int postcopy_place_page_zero(MigrationIncomingState *mis, void *host,
1337 RAMBlock *rb)
1338{
1339 size_t pagesize = qemu_ram_pagesize(rb);
1340 trace_postcopy_place_page_zero(host);
1341
1342
1343
1344
1345 if (qemu_ram_is_uf_zeroable(rb)) {
1346 if (qemu_ufd_copy_ioctl(mis, host, NULL, pagesize, rb)) {
1347 int e = errno;
1348 error_report("%s: %s zero host: %p",
1349 __func__, strerror(e), host);
1350
1351 return -e;
1352 }
1353 return postcopy_notify_shared_wake(rb,
1354 qemu_ram_block_host_offset(rb,
1355 host));
1356 } else {
1357 return postcopy_place_page(mis, host, mis->postcopy_tmp_zero_page, rb);
1358 }
1359}
1360
1361#else
1362
1363void fill_destination_postcopy_migration_info(MigrationInfo *info)
1364{
1365}
1366
1367bool postcopy_ram_supported_by_host(MigrationIncomingState *mis, Error **errp)
1368{
1369 error_report("%s: No OS support", __func__);
1370 return false;
1371}
1372
1373int postcopy_ram_incoming_init(MigrationIncomingState *mis)
1374{
1375 error_report("postcopy_ram_incoming_init: No OS support");
1376 return -1;
1377}
1378
1379int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
1380{
1381 assert(0);
1382 return -1;
1383}
1384
1385int postcopy_ram_prepare_discard(MigrationIncomingState *mis)
1386{
1387 assert(0);
1388 return -1;
1389}
1390
1391int postcopy_request_shared_page(struct PostCopyFD *pcfd, RAMBlock *rb,
1392 uint64_t client_addr, uint64_t rb_offset)
1393{
1394 assert(0);
1395 return -1;
1396}
1397
1398int postcopy_ram_incoming_setup(MigrationIncomingState *mis)
1399{
1400 assert(0);
1401 return -1;
1402}
1403
1404int postcopy_place_page(MigrationIncomingState *mis, void *host, void *from,
1405 RAMBlock *rb)
1406{
1407 assert(0);
1408 return -1;
1409}
1410
1411int postcopy_place_page_zero(MigrationIncomingState *mis, void *host,
1412 RAMBlock *rb)
1413{
1414 assert(0);
1415 return -1;
1416}
1417
1418int postcopy_wake_shared(struct PostCopyFD *pcfd,
1419 uint64_t client_addr,
1420 RAMBlock *rb)
1421{
1422 assert(0);
1423 return -1;
1424}
1425#endif
1426
1427
1428void postcopy_temp_page_reset(PostcopyTmpPage *tmp_page)
1429{
1430 tmp_page->target_pages = 0;
1431 tmp_page->host_addr = NULL;
1432
1433
1434
1435
1436 tmp_page->all_zero = true;
1437}
1438
1439void postcopy_fault_thread_notify(MigrationIncomingState *mis)
1440{
1441 uint64_t tmp64 = 1;
1442
1443
1444
1445
1446
1447 if (write(mis->userfault_event_fd, &tmp64, 8) != 8) {
1448
1449 error_report("%s: incrementing failed: %s", __func__,
1450 strerror(errno));
1451 }
1452}
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462static PostcopyDiscardState pds = {0};
1463void postcopy_discard_send_init(MigrationState *ms, const char *name)
1464{
1465 pds.ramblock_name = name;
1466 pds.cur_entry = 0;
1467 pds.nsentwords = 0;
1468 pds.nsentcmds = 0;
1469}
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480void postcopy_discard_send_range(MigrationState *ms, unsigned long start,
1481 unsigned long length)
1482{
1483 size_t tp_size = qemu_target_page_size();
1484
1485 pds.start_list[pds.cur_entry] = start * tp_size;
1486 pds.length_list[pds.cur_entry] = length * tp_size;
1487 trace_postcopy_discard_send_range(pds.ramblock_name, start, length);
1488 pds.cur_entry++;
1489 pds.nsentwords++;
1490
1491 if (pds.cur_entry == MAX_DISCARDS_PER_COMMAND) {
1492
1493 qemu_savevm_send_postcopy_ram_discard(ms->to_dst_file,
1494 pds.ramblock_name,
1495 pds.cur_entry,
1496 pds.start_list,
1497 pds.length_list);
1498 pds.nsentcmds++;
1499 pds.cur_entry = 0;
1500 }
1501}
1502
1503
1504
1505
1506
1507
1508
1509void postcopy_discard_send_finish(MigrationState *ms)
1510{
1511
1512 if (pds.cur_entry) {
1513 qemu_savevm_send_postcopy_ram_discard(ms->to_dst_file,
1514 pds.ramblock_name,
1515 pds.cur_entry,
1516 pds.start_list,
1517 pds.length_list);
1518 pds.nsentcmds++;
1519 }
1520
1521 trace_postcopy_discard_send_finish(pds.ramblock_name, pds.nsentwords,
1522 pds.nsentcmds);
1523}
1524
1525
1526
1527
1528
1529
1530static PostcopyState incoming_postcopy_state;
1531
1532PostcopyState postcopy_state_get(void)
1533{
1534 return qatomic_load_acquire(&incoming_postcopy_state);
1535}
1536
1537
1538PostcopyState postcopy_state_set(PostcopyState new_state)
1539{
1540 return qatomic_xchg(&incoming_postcopy_state, new_state);
1541}
1542
1543
1544
1545
1546void postcopy_register_shared_ufd(struct PostCopyFD *pcfd)
1547{
1548 MigrationIncomingState *mis = migration_incoming_get_current();
1549
1550 mis->postcopy_remote_fds = g_array_append_val(mis->postcopy_remote_fds,
1551 *pcfd);
1552}
1553
1554
1555
1556void postcopy_unregister_shared_ufd(struct PostCopyFD *pcfd)
1557{
1558 guint i;
1559 MigrationIncomingState *mis = migration_incoming_get_current();
1560 GArray *pcrfds = mis->postcopy_remote_fds;
1561
1562 if (!pcrfds) {
1563
1564 return;
1565 }
1566 for (i = 0; i < pcrfds->len; i++) {
1567 struct PostCopyFD *cur = &g_array_index(pcrfds, struct PostCopyFD, i);
1568 if (cur->fd == pcfd->fd) {
1569 mis->postcopy_remote_fds = g_array_remove_index(pcrfds, i);
1570 return;
1571 }
1572 }
1573}
1574
1575void postcopy_preempt_new_channel(MigrationIncomingState *mis, QEMUFile *file)
1576{
1577
1578
1579
1580
1581 qemu_file_set_blocking(file, true);
1582 mis->postcopy_qemufile_dst = file;
1583 qemu_sem_post(&mis->postcopy_qemufile_dst_done);
1584 trace_postcopy_preempt_new_channel();
1585}
1586
1587
1588
1589
1590
1591static void
1592postcopy_preempt_send_channel_done(MigrationState *s,
1593 QIOChannel *ioc, Error *local_err)
1594{
1595 if (local_err) {
1596 migrate_set_error(s, local_err);
1597 error_free(local_err);
1598 } else {
1599 migration_ioc_register_yank(ioc);
1600 s->postcopy_qemufile_src = qemu_file_new_output(ioc);
1601 trace_postcopy_preempt_new_channel();
1602 }
1603
1604
1605
1606
1607
1608 qemu_sem_post(&s->postcopy_qemufile_src_sem);
1609}
1610
1611static void
1612postcopy_preempt_tls_handshake(QIOTask *task, gpointer opaque)
1613{
1614 g_autoptr(QIOChannel) ioc = QIO_CHANNEL(qio_task_get_source(task));
1615 MigrationState *s = opaque;
1616 Error *local_err = NULL;
1617
1618 qio_task_propagate_error(task, &local_err);
1619 postcopy_preempt_send_channel_done(s, ioc, local_err);
1620}
1621
1622static void
1623postcopy_preempt_send_channel_new(QIOTask *task, gpointer opaque)
1624{
1625 g_autoptr(QIOChannel) ioc = QIO_CHANNEL(qio_task_get_source(task));
1626 MigrationState *s = opaque;
1627 QIOChannelTLS *tioc;
1628 Error *local_err = NULL;
1629
1630 if (qio_task_propagate_error(task, &local_err)) {
1631 goto out;
1632 }
1633
1634 if (migrate_channel_requires_tls_upgrade(ioc)) {
1635 tioc = migration_tls_client_create(ioc, s->hostname, &local_err);
1636 if (!tioc) {
1637 goto out;
1638 }
1639 trace_postcopy_preempt_tls_handshake();
1640 qio_channel_set_name(QIO_CHANNEL(tioc), "migration-tls-preempt");
1641 qio_channel_tls_handshake(tioc, postcopy_preempt_tls_handshake,
1642 s, NULL, NULL);
1643
1644 return;
1645 }
1646
1647out:
1648
1649 postcopy_preempt_send_channel_done(s, ioc, local_err);
1650}
1651
1652
1653
1654
1655
1656
1657int postcopy_preempt_establish_channel(MigrationState *s)
1658{
1659
1660 if (!migrate_postcopy_preempt()) {
1661 return 0;
1662 }
1663
1664
1665
1666
1667
1668
1669 if (!s->preempt_pre_7_2) {
1670 postcopy_preempt_setup(s);
1671 }
1672
1673
1674
1675
1676
1677 qemu_sem_wait(&s->postcopy_qemufile_src_sem);
1678
1679 return s->postcopy_qemufile_src ? 0 : -1;
1680}
1681
1682void postcopy_preempt_setup(MigrationState *s)
1683{
1684
1685 socket_send_channel_create(postcopy_preempt_send_channel_new, s);
1686}
1687
1688static void postcopy_pause_ram_fast_load(MigrationIncomingState *mis)
1689{
1690 trace_postcopy_pause_fast_load();
1691 qemu_mutex_unlock(&mis->postcopy_prio_thread_mutex);
1692 qemu_sem_wait(&mis->postcopy_pause_sem_fast_load);
1693 qemu_mutex_lock(&mis->postcopy_prio_thread_mutex);
1694 trace_postcopy_pause_fast_load_continued();
1695}
1696
1697static bool preempt_thread_should_run(MigrationIncomingState *mis)
1698{
1699 return mis->preempt_thread_status != PREEMPT_THREAD_QUIT;
1700}
1701
1702void *postcopy_preempt_thread(void *opaque)
1703{
1704 MigrationIncomingState *mis = opaque;
1705 int ret;
1706
1707 trace_postcopy_preempt_thread_entry();
1708
1709 rcu_register_thread();
1710
1711 qemu_sem_post(&mis->thread_sync_sem);
1712
1713
1714
1715
1716
1717 qemu_sem_wait(&mis->postcopy_qemufile_dst_done);
1718
1719
1720 qemu_mutex_lock(&mis->postcopy_prio_thread_mutex);
1721 while (preempt_thread_should_run(mis)) {
1722 ret = ram_load_postcopy(mis->postcopy_qemufile_dst,
1723 RAM_CHANNEL_POSTCOPY);
1724
1725 if (ret && preempt_thread_should_run(mis)) {
1726 postcopy_pause_ram_fast_load(mis);
1727 } else {
1728
1729 break;
1730 }
1731 }
1732 qemu_mutex_unlock(&mis->postcopy_prio_thread_mutex);
1733
1734 rcu_unregister_thread();
1735
1736 trace_postcopy_preempt_thread_exit();
1737
1738 return NULL;
1739}
1740