postcopy: postcopy_notify_shared_wake
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 <dgilbert@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
5efc356403
commit
d488b349a3
|
@ -827,6 +827,22 @@ static int qemu_ufd_copy_ioctl(int userfault_fd, void *host_addr,
|
||||||
return ret;
|
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
|
* Place a host page (from) at (host) atomically
|
||||||
* returns 0 on success
|
* returns 0 on success
|
||||||
|
|
|
@ -148,6 +148,10 @@ struct PostCopyFD;
|
||||||
|
|
||||||
/* ufd is a pointer to the struct uffd_msg *TODO: more Portable! */
|
/* ufd is a pointer to the struct uffd_msg *TODO: more Portable! */
|
||||||
typedef int (*pcfdhandler)(struct PostCopyFD *pcfd, void *ufd);
|
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 {
|
struct PostCopyFD {
|
||||||
int fd;
|
int fd;
|
||||||
|
@ -155,6 +159,8 @@ struct PostCopyFD {
|
||||||
void *data;
|
void *data;
|
||||||
/* Handler to be called whenever we get a poll event */
|
/* Handler to be called whenever we get a poll event */
|
||||||
pcfdhandler handler;
|
pcfdhandler handler;
|
||||||
|
/* Notification to wake shared client */
|
||||||
|
pcfdwake waker;
|
||||||
/* A string to use in error messages */
|
/* A string to use in error messages */
|
||||||
const char *idstr;
|
const char *idstr;
|
||||||
};
|
};
|
||||||
|
@ -164,6 +170,10 @@ struct PostCopyFD {
|
||||||
*/
|
*/
|
||||||
void postcopy_register_shared_ufd(struct PostCopyFD *pcfd);
|
void postcopy_register_shared_ufd(struct PostCopyFD *pcfd);
|
||||||
void postcopy_unregister_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);
|
||||||
/* postcopy_wake_shared: Notify a client ufd that a page is available
|
/* postcopy_wake_shared: Notify a client ufd that a page is available
|
||||||
*
|
*
|
||||||
* Returns 0 on success
|
* Returns 0 on success
|
||||||
|
|
Loading…
Reference in New Issue