On Thu, Mar 8, 2018 at 8:58 PM, Dr. David Alan Gilbert (git) <dgilb...@redhat.com> wrote: > From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> > > 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 <dgilb...@redhat.com> > Reviewed-by: Peter Xu <pet...@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > 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 > > -- Marc-André Lureau