migration: reuse mis->userfault_quit_fd

It was only used for quitting the page fault thread before. Let it be
something more useful - now we can use it to notify a "wake" for the
page fault thread (for any reason), and it only means "quit" if the
fault_thread_quit is set.

Since we changed what it does, renaming it to userfault_event_fd.

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Message-Id: <20180208103132.28452-3-peterx@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
Peter Xu 2018-02-08 18:31:06 +08:00 committed by Dr. David Alan Gilbert
parent 7a9ddfbfae
commit 64f615fe34
2 changed files with 24 additions and 11 deletions

View File

@ -35,6 +35,8 @@ struct MigrationIncomingState {
bool have_fault_thread; bool have_fault_thread;
QemuThread fault_thread; QemuThread fault_thread;
QemuSemaphore fault_thread_sem; QemuSemaphore fault_thread_sem;
/* Set this when we want the fault thread to quit */
bool fault_thread_quit;
bool have_listen_thread; bool have_listen_thread;
QemuThread listen_thread; QemuThread listen_thread;
@ -42,8 +44,8 @@ struct MigrationIncomingState {
/* For the kernel to send us notifications */ /* For the kernel to send us notifications */
int userfault_fd; int userfault_fd;
/* To tell the fault_thread to quit */ /* To notify the fault_thread to wake, e.g., when need to quit */
int userfault_quit_fd; int userfault_event_fd;
QEMUFile *to_src_file; QEMUFile *to_src_file;
QemuMutex rp_mutex; /* We send replies from multiple threads */ QemuMutex rp_mutex; /* We send replies from multiple threads */
void *postcopy_tmp_page; void *postcopy_tmp_page;

View File

@ -387,17 +387,18 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
* currently be at 0, we're going to increment it to 1 * currently be at 0, we're going to increment it to 1
*/ */
tmp64 = 1; tmp64 = 1;
if (write(mis->userfault_quit_fd, &tmp64, 8) == 8) { atomic_set(&mis->fault_thread_quit, 1);
if (write(mis->userfault_event_fd, &tmp64, 8) == 8) {
trace_postcopy_ram_incoming_cleanup_join(); trace_postcopy_ram_incoming_cleanup_join();
qemu_thread_join(&mis->fault_thread); qemu_thread_join(&mis->fault_thread);
} else { } else {
/* Not much we can do here, but may as well report it */ /* Not much we can do here, but may as well report it */
error_report("%s: incrementing userfault_quit_fd: %s", __func__, error_report("%s: incrementing userfault_event_fd: %s", __func__,
strerror(errno)); strerror(errno));
} }
trace_postcopy_ram_incoming_cleanup_closeuf(); trace_postcopy_ram_incoming_cleanup_closeuf();
close(mis->userfault_fd); close(mis->userfault_fd);
close(mis->userfault_quit_fd); close(mis->userfault_event_fd);
mis->have_fault_thread = false; mis->have_fault_thread = false;
} }
@ -520,7 +521,7 @@ static void *postcopy_ram_fault_thread(void *opaque)
pfd[0].fd = mis->userfault_fd; pfd[0].fd = mis->userfault_fd;
pfd[0].events = POLLIN; pfd[0].events = POLLIN;
pfd[0].revents = 0; pfd[0].revents = 0;
pfd[1].fd = mis->userfault_quit_fd; pfd[1].fd = mis->userfault_event_fd;
pfd[1].events = POLLIN; /* Waiting for eventfd to go positive */ pfd[1].events = POLLIN; /* Waiting for eventfd to go positive */
pfd[1].revents = 0; pfd[1].revents = 0;
@ -530,8 +531,18 @@ static void *postcopy_ram_fault_thread(void *opaque)
} }
if (pfd[1].revents) { if (pfd[1].revents) {
trace_postcopy_ram_fault_thread_quit(); uint64_t tmp64 = 0;
break;
/* Consume the signal */
if (read(mis->userfault_event_fd, &tmp64, 8) != 8) {
/* Nothing obviously nicer than posting this error. */
error_report("%s: read() failed", __func__);
}
if (atomic_read(&mis->fault_thread_quit)) {
trace_postcopy_ram_fault_thread_quit();
break;
}
} }
ret = read(mis->userfault_fd, &msg, sizeof(msg)); ret = read(mis->userfault_fd, &msg, sizeof(msg));
@ -610,9 +621,9 @@ int postcopy_ram_enable_notify(MigrationIncomingState *mis)
} }
/* Now an eventfd we use to tell the fault-thread to quit */ /* Now an eventfd we use to tell the fault-thread to quit */
mis->userfault_quit_fd = eventfd(0, EFD_CLOEXEC); mis->userfault_event_fd = eventfd(0, EFD_CLOEXEC);
if (mis->userfault_quit_fd == -1) { if (mis->userfault_event_fd == -1) {
error_report("%s: Opening userfault_quit_fd: %s", __func__, error_report("%s: Opening userfault_event_fd: %s", __func__,
strerror(errno)); strerror(errno));
close(mis->userfault_fd); close(mis->userfault_fd);
return -1; return -1;