[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 06/20] migration: Add postcopy_thread_create()
From: |
Peter Xu |
Subject: |
[PATCH 06/20] migration: Add postcopy_thread_create() |
Date: |
Wed, 16 Feb 2022 14:27:55 +0800 |
Postcopy create threads. A common manner is we init a sem and use it to sync
with the thread. Namely, we have fault_thread_sem and listen_thread_sem and
they're only used for this.
Make it a shared infrastructure so it's easier to create yet another thread.
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.h | 8 +++++---
migration/postcopy-ram.c | 23 +++++++++++++++++------
migration/postcopy-ram.h | 4 ++++
migration/savevm.c | 12 +++---------
4 files changed, 29 insertions(+), 18 deletions(-)
diff --git a/migration/migration.h b/migration/migration.h
index 42c7395094..8445e1d14a 100644
--- a/migration/migration.h
+++ b/migration/migration.h
@@ -70,7 +70,11 @@ struct MigrationIncomingState {
/* A hook to allow cleanup at the end of incoming migration */
void *transport_data;
void (*transport_cleanup)(void *data);
-
+ /*
+ * Used to sync thread creations. Note that we can't create threads in
+ * parallel with this sem.
+ */
+ QemuSemaphore thread_sync_sem;
/*
* Free at the start of the main state load, set as the main thread
finishes
* loading state.
@@ -83,13 +87,11 @@ struct MigrationIncomingState {
size_t largest_page_size;
bool have_fault_thread;
QemuThread fault_thread;
- QemuSemaphore fault_thread_sem;
/* Set this when we want the fault thread to quit */
bool fault_thread_quit;
bool have_listen_thread;
QemuThread listen_thread;
- QemuSemaphore listen_thread_sem;
/* For the kernel to send us notifications */
int userfault_fd;
diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
index 315f784965..d3ec22e6de 100644
--- a/migration/postcopy-ram.c
+++ b/migration/postcopy-ram.c
@@ -77,6 +77,20 @@ int postcopy_notify(enum PostcopyNotifyReason reason, Error
**errp)
&pnd);
}
+/*
+ * NOTE: this routine is not thread safe, we can't call it concurrently. But it
+ * should be good enough for migration's purposes.
+ */
+void postcopy_thread_create(MigrationIncomingState *mis,
+ QemuThread *thread, const char *name,
+ void *(*fn)(void *), int joinable)
+{
+ qemu_sem_init(&mis->thread_sync_sem, 0);
+ qemu_thread_create(thread, name, fn, mis, joinable);
+ qemu_sem_wait(&mis->thread_sync_sem);
+ qemu_sem_destroy(&mis->thread_sync_sem);
+}
+
/* Postcopy needs to detect accesses to pages that haven't yet been copied
* across, and efficiently map new pages in, the techniques for doing this
* are target OS specific.
@@ -901,7 +915,7 @@ static void *postcopy_ram_fault_thread(void *opaque)
trace_postcopy_ram_fault_thread_entry();
rcu_register_thread();
mis->last_rb = NULL; /* last RAMBlock we sent part of */
- qemu_sem_post(&mis->fault_thread_sem);
+ qemu_sem_post(&mis->thread_sync_sem);
struct pollfd *pfd;
size_t pfd_len = 2 + mis->postcopy_remote_fds->len;
@@ -1172,11 +1186,8 @@ int postcopy_ram_incoming_setup(MigrationIncomingState
*mis)
return -1;
}
- 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);
- qemu_sem_destroy(&mis->fault_thread_sem);
+ postcopy_thread_create(mis, &mis->fault_thread, "postcopy/fault",
+ postcopy_ram_fault_thread, QEMU_THREAD_JOINABLE);
mis->have_fault_thread = true;
/* Mark so that we get notified of accesses to unwritten areas */
diff --git a/migration/postcopy-ram.h b/migration/postcopy-ram.h
index 6d2b3cf124..07684c0e1d 100644
--- a/migration/postcopy-ram.h
+++ b/migration/postcopy-ram.h
@@ -135,6 +135,10 @@ void postcopy_remove_notifier(NotifierWithReturn *n);
/* Call the notifier list set by postcopy_add_start_notifier */
int postcopy_notify(enum PostcopyNotifyReason reason, Error **errp);
+void postcopy_thread_create(MigrationIncomingState *mis,
+ QemuThread *thread, const char *name,
+ void *(*fn)(void *), int joinable);
+
struct PostCopyFD;
/* ufd is a pointer to the struct uffd_msg *TODO: more Portable! */
diff --git a/migration/savevm.c b/migration/savevm.c
index 0ccd7e5e3f..967ff80547 100644
--- a/migration/savevm.c
+++ b/migration/savevm.c
@@ -1863,7 +1863,7 @@ static void *postcopy_ram_listen_thread(void *opaque)
migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
MIGRATION_STATUS_POSTCOPY_ACTIVE);
- qemu_sem_post(&mis->listen_thread_sem);
+ qemu_sem_post(&mis->thread_sync_sem);
trace_postcopy_ram_listen_thread_start();
rcu_register_thread();
@@ -1988,14 +1988,8 @@ static int
loadvm_postcopy_handle_listen(MigrationIncomingState *mis)
}
mis->have_listen_thread = true;
- /* Start up the listening thread and wait for it to signal ready */
- qemu_sem_init(&mis->listen_thread_sem, 0);
- qemu_thread_create(&mis->listen_thread, "postcopy/listen",
- postcopy_ram_listen_thread, NULL,
- QEMU_THREAD_DETACHED);
- qemu_sem_wait(&mis->listen_thread_sem);
- qemu_sem_destroy(&mis->listen_thread_sem);
-
+ postcopy_thread_create(mis, &mis->listen_thread, "postcopy/listen",
+ postcopy_ram_listen_thread, QEMU_THREAD_DETACHED);
trace_loadvm_postcopy_handle_listen("return");
return 0;
--
2.32.0
- [PATCH 00/20] migration: Postcopy Preemption, Peter Xu, 2022/02/16
- [PATCH 01/20] migration: Dump sub-cmd name in loadvm_process_command tp, Peter Xu, 2022/02/16
- [PATCH 03/20] migration: Tracepoint change in postcopy-run bottom half, Peter Xu, 2022/02/16
- [PATCH 04/20] migration: Introduce postcopy channels on dest node, Peter Xu, 2022/02/16
- [PATCH 02/20] migration: Finer grained tracepoints for POSTCOPY_LISTEN, Peter Xu, 2022/02/16
- [PATCH 05/20] migration: Dump ramblock and offset too when non-same-page detected, Peter Xu, 2022/02/16
- [PATCH 06/20] migration: Add postcopy_thread_create(),
Peter Xu <=
- [PATCH 07/20] migration: Move static var in ram_block_from_stream() into global, Peter Xu, 2022/02/16
- [PATCH 08/20] migration: Add pss.postcopy_requested status, Peter Xu, 2022/02/16
- [PATCH 09/20] migration: Move migrate_allow_multifd and helpers into migration.c, Peter Xu, 2022/02/16
- [PATCH 10/20] migration: Enlarge postcopy recovery to capture !-EIO too, Peter Xu, 2022/02/16
- [PATCH 11/20] migration: postcopy_pause_fault_thread() never fails, Peter Xu, 2022/02/16
- [PATCH 12/20] migration: Export ram_load_postcopy(), Peter Xu, 2022/02/16