From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Peter Xu <peterx@redhat.com>
Cc: Juan Quintela <quintela@redhat.com>,
qemu-devel@nongnu.org,
Leonardo Bras Soares Passos <lsoaresp@redhat.com>
Subject: Re: [PATCH RFC 09/15] migration: Add postcopy_thread_create()
Date: Thu, 3 Feb 2022 15:19:48 +0000 [thread overview]
Message-ID: <YfvylA6QEl1YQnKU@work-vm> (raw)
In-Reply-To: <20220119080929.39485-10-peterx@redhat.com>
* Peter Xu (peterx@redhat.com) wrote:
> 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.
>
It might be worth a note saying you now share that sem, so you can't
start two threads in parallel.
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> migration/migration.h | 5 ++---
> migration/postcopy-ram.c | 19 +++++++++++++------
> migration/postcopy-ram.h | 4 ++++
> migration/savevm.c | 12 +++---------
> 4 files changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/migration/migration.h b/migration/migration.h
> index 8bb2931312..35e7f7babe 100644
> --- a/migration/migration.h
> +++ b/migration/migration.h
> @@ -70,7 +70,8 @@ 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 */
> + QemuSemaphore thread_sync_sem;
> /*
> * Free at the start of the main state load, set as the main thread finishes
> * loading state.
> @@ -83,13 +84,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 d78e1b9373..88c832eeba 100644
> --- a/migration/postcopy-ram.c
> +++ b/migration/postcopy-ram.c
> @@ -77,6 +77,16 @@ int postcopy_notify(enum PostcopyNotifyReason reason, Error **errp)
> &pnd);
> }
>
> +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 +911,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 +1182,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 3b8f565b14..3342b74c24 100644
> --- a/migration/savevm.c
> +++ b/migration/savevm.c
> @@ -1862,7 +1862,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();
> @@ -1987,14 +1987,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
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2022-02-03 15:22 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-19 8:09 [PATCH RFC 00/15] migration: Postcopy Preemption Peter Xu
2022-01-19 8:09 ` [PATCH RFC 01/15] migration: No off-by-one for pss->page update in host page size Peter Xu
2022-01-19 12:58 ` Dr. David Alan Gilbert
2022-01-27 9:40 ` Juan Quintela
2022-01-19 8:09 ` [PATCH RFC 02/15] migration: Allow pss->page jump over clean pages Peter Xu
2022-01-19 13:42 ` Dr. David Alan Gilbert
2022-01-20 2:12 ` Peter Xu
2022-02-03 18:19 ` Dr. David Alan Gilbert
2022-02-08 3:20 ` Peter Xu
2022-01-19 8:09 ` [PATCH RFC 03/15] migration: Enable UFFD_FEATURE_THREAD_ID even without blocktime feat Peter Xu
2022-01-19 14:15 ` Dr. David Alan Gilbert
2022-01-27 9:40 ` Juan Quintela
2022-01-19 8:09 ` [PATCH RFC 04/15] migration: Add postcopy_has_request() Peter Xu
2022-01-19 14:27 ` Dr. David Alan Gilbert
2022-01-27 9:41 ` Juan Quintela
2022-01-19 8:09 ` [PATCH RFC 05/15] migration: Simplify unqueue_page() Peter Xu
2022-01-19 16:36 ` Dr. David Alan Gilbert
2022-01-20 2:23 ` Peter Xu
2022-01-25 11:01 ` Dr. David Alan Gilbert
2022-01-27 9:41 ` Juan Quintela
2022-01-19 8:09 ` [PATCH RFC 06/15] migration: Move temp page setup and cleanup into separate functions Peter Xu
2022-01-19 16:58 ` Dr. David Alan Gilbert
2022-01-27 9:43 ` Juan Quintela
2022-01-19 8:09 ` [PATCH RFC 07/15] migration: Introduce postcopy channels on dest node Peter Xu
2022-02-03 15:08 ` Dr. David Alan Gilbert
2022-02-08 3:27 ` Peter Xu
2022-02-08 9:43 ` Dr. David Alan Gilbert
2022-02-08 10:07 ` Peter Xu
2022-01-19 8:09 ` [PATCH RFC 08/15] migration: Dump ramblock and offset too when non-same-page detected Peter Xu
2022-02-03 15:15 ` Dr. David Alan Gilbert
2022-01-19 8:09 ` [PATCH RFC 09/15] migration: Add postcopy_thread_create() Peter Xu
2022-02-03 15:19 ` Dr. David Alan Gilbert [this message]
2022-02-08 3:37 ` Peter Xu
2022-02-08 11:16 ` Dr. David Alan Gilbert
2022-01-19 8:09 ` [PATCH RFC 10/15] migration: Move static var in ram_block_from_stream() into global Peter Xu
2022-02-03 17:48 ` Dr. David Alan Gilbert
2022-02-08 3:51 ` Peter Xu
2022-01-19 8:09 ` [PATCH RFC 11/15] migration: Add pss.postcopy_requested status Peter Xu
2022-02-03 15:42 ` Dr. David Alan Gilbert
2022-01-19 8:09 ` [PATCH RFC 12/15] migration: Move migrate_allow_multifd and helpers into migration.c Peter Xu
2022-02-03 15:44 ` Dr. David Alan Gilbert
2022-01-19 8:09 ` [PATCH RFC 13/15] migration: Add postcopy-preempt capability Peter Xu
2022-02-03 15:46 ` Dr. David Alan Gilbert
2022-01-19 8:09 ` [PATCH RFC 14/15] migration: Postcopy preemption on separate channel Peter Xu
2022-02-03 17:45 ` Dr. David Alan Gilbert
2022-02-08 4:22 ` Peter Xu
2022-02-08 11:24 ` Dr. David Alan Gilbert
2022-02-08 11:39 ` Peter Xu
2022-02-08 13:23 ` Dr. David Alan Gilbert
2022-02-09 2:16 ` Peter Xu
2022-01-19 8:09 ` [PATCH RFC 15/15] tests: Add postcopy preempt test Peter Xu
2022-02-03 15:53 ` Dr. David Alan Gilbert
2022-01-19 12:32 ` [PATCH RFC 00/15] migration: Postcopy Preemption Dr. David Alan Gilbert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YfvylA6QEl1YQnKU@work-vm \
--to=dgilbert@redhat.com \
--cc=lsoaresp@redhat.com \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.