[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 20/29] postcopy: postcopy_notify_shared_wake
From: |
Dr. David Alan Gilbert (git) |
Subject: |
[Qemu-devel] [PATCH v4 20/29] postcopy: postcopy_notify_shared_wake |
Date: |
Thu, 8 Mar 2018 19:58:02 +0000 |
From: "Dr. David Alan Gilbert" <address@hidden>
Add a hook to allow a client userfaultfd to be 'woken'
when a page arrives, and a walker that calls that
hook for relevant clients given a RAMBlock and offset.
Signed-off-by: Dr. David Alan Gilbert <address@hidden>
Reviewed-by: Peter Xu <address@hidden>
---
migration/postcopy-ram.c | 16 ++++++++++++++++
migration/postcopy-ram.h | 10 ++++++++++
2 files changed, 26 insertions(+)
diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
index d3e7f10c5a..585db9467a 100644
--- a/migration/postcopy-ram.c
+++ b/migration/postcopy-ram.c
@@ -827,6 +827,22 @@ static int qemu_ufd_copy_ioctl(int userfault_fd, void
*host_addr,
return ret;
}
+int postcopy_notify_shared_wake(RAMBlock *rb, uint64_t offset)
+{
+ int i;
+ MigrationIncomingState *mis = migration_incoming_get_current();
+ GArray *pcrfds = mis->postcopy_remote_fds;
+
+ for (i = 0; i < pcrfds->len; i++) {
+ struct PostCopyFD *cur = &g_array_index(pcrfds, struct PostCopyFD, i);
+ int ret = cur->waker(cur, rb, offset);
+ if (ret) {
+ return ret;
+ }
+ }
+ return 0;
+}
+
/*
* Place a host page (from) at (host) atomically
* returns 0 on success
diff --git a/migration/postcopy-ram.h b/migration/postcopy-ram.h
index f02fa36127..fef7448e4b 100644
--- a/migration/postcopy-ram.h
+++ b/migration/postcopy-ram.h
@@ -148,6 +148,10 @@ struct PostCopyFD;
/* ufd is a pointer to the struct uffd_msg *TODO: more Portable! */
typedef int (*pcfdhandler)(struct PostCopyFD *pcfd, void *ufd);
+/* Notification to wake, either on place or on reception of
+ * a fault on something that's already arrived (race)
+ */
+typedef int (*pcfdwake)(struct PostCopyFD *pcfd, RAMBlock *rb, uint64_t
offset);
struct PostCopyFD {
int fd;
@@ -155,6 +159,8 @@ struct PostCopyFD {
void *data;
/* Handler to be called whenever we get a poll event */
pcfdhandler handler;
+ /* Notification to wake shared client */
+ pcfdwake waker;
/* A string to use in error messages */
const char *idstr;
};
@@ -164,6 +170,10 @@ struct PostCopyFD {
*/
void postcopy_register_shared_ufd(struct PostCopyFD *pcfd);
void postcopy_unregister_shared_ufd(struct PostCopyFD *pcfd);
+/* Call each of the shared 'waker's registerd telling them of
+ * availability of a block.
+ */
+int postcopy_notify_shared_wake(RAMBlock *rb, uint64_t offset);
/* Notify a client ufd that a page is available
* Note: The 'client_address' is in the address space of the client
* program not QEMU
--
2.14.3
- Re: [Qemu-devel] [PATCH v4 15/29] vhost+postcopy: Send address back to qemu, (continued)
- [Qemu-devel] [PATCH v4 16/29] vhost+postcopy: Stash RAMBlock and offset, Dr. David Alan Gilbert (git), 2018/03/08
- [Qemu-devel] [PATCH v4 17/29] vhost+postcopy: Send requests to source for shared pages, Dr. David Alan Gilbert (git), 2018/03/08
- [Qemu-devel] [PATCH v4 18/29] vhost+postcopy: Resolve client address, Dr. David Alan Gilbert (git), 2018/03/08
- [Qemu-devel] [PATCH v4 20/29] postcopy: postcopy_notify_shared_wake,
Dr. David Alan Gilbert (git) <=
- [Qemu-devel] [PATCH v4 19/29] postcopy: helper for waking shared, Dr. David Alan Gilbert (git), 2018/03/08
- [Qemu-devel] [PATCH v4 22/29] vhost+postcopy: Call wakeups, Dr. David Alan Gilbert (git), 2018/03/08
- [Qemu-devel] [PATCH v4 21/29] vhost+postcopy: Add vhost waker, Dr. David Alan Gilbert (git), 2018/03/08
- [Qemu-devel] [PATCH v4 23/29] libvhost-user: mprotect & madvises for postcopy, Dr. David Alan Gilbert (git), 2018/03/08
- [Qemu-devel] [PATCH v4 24/29] vhost-user: Add VHOST_USER_POSTCOPY_END message, Dr. David Alan Gilbert (git), 2018/03/08