From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> --- include/migration/migration.h | 3 +++ postcopy-ram.c | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+)
diff --git a/include/migration/migration.h b/include/migration/migration.h index 397f41c..67e5528 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -86,6 +86,9 @@ struct MigrationIncomingState { POSTCOPY_RAM_INCOMING_END } postcopy_ram_state; + QemuThread fault_thread; + QemuSemaphore fault_thread_sem; + QEMUFile *return_path; QemuMutex rp_mutex; /* We send replies from multiple threads */ PostcopyPMI postcopy_pmi; diff --git a/postcopy-ram.c b/postcopy-ram.c index c605dd3..fb7b02b 100644 --- a/postcopy-ram.c +++ b/postcopy-ram.c @@ -357,8 +357,31 @@ static int postcopy_ram_sensitise_area(const char *block_name, void *host_addr, return 0; } +/* + * Handle faults detected by the USERFAULT markings + */ +static void *postcopy_ram_fault_thread(void *opaque) +{ + MigrationIncomingState *mis = (MigrationIncomingState *)opaque; + + fprintf(stderr, "postcopy_ram_fault_thread\n"); + /* TODO: In later patch */ + qemu_sem_post(&mis->fault_thread_sem); + while (1) { + /* TODO: In later patch */ + } + + return NULL; +} + int postcopy_ram_enable_notify(MigrationIncomingState *mis) { + /* Create the fault handler thread and wait for it to be ready */ + qemu_sem_init(&mis->fault_thread_sem, 0); + qemu_thread_create(&mis->fault_thread, "postcopy/fault", + postcopy_ram_fault_thread, mis, QEMU_THREAD_JOINABLE); + qemu_sem_wait(&mis->fault_thread_sem); + /* Mark so that we get notified of accesses to unwritten areas */ if (qemu_ram_foreach_block(postcopy_ram_sensitise_area, NULL)) { return -1; -- 1.9.3