"Dr. David Alan Gilbert (git)" <dgilb...@redhat.com> wrote: > From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> > > Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> > Reviewed-by: David Gibson <da...@gibson.dropbear.id.au> > Reviewed-by: Amit Shah <amit.s...@redhat.com>
> +/* > + * At the end of migration, undo the effects of init_range > + * opaque should be the MIS. > + */ > +static int cleanup_range(const char *block_name, void *host_addr, > + ram_addr_t offset, ram_addr_t length, void *opaque) > +{ > + MigrationIncomingState *mis = opaque; > + struct uffdio_range range_struct; > + trace_postcopy_cleanup_range(block_name, host_addr, offset, length); > + > + /* > + * We turned off hugepage for the precopy stage with postcopy enabled > + * we can turn it back on now. > + */ > +#ifdef MADV_HUGEPAGE > + if (madvise(host_addr, length, MADV_HUGEPAGE)) { > + error_report("%s HUGEPAGE: %s", __func__, strerror(errno)); > + return -1; > + } > +#endif this should be the same than: qemu_madvise(host_addr, lenght, QEMU_MADV_HUGEPAGE); Only problem I can see, is that there is no way to differentiate that madvise() has given one error or that MADV_HUGEPAGE is not defined. If we really want that: if (QEMU_MADV_HUGEPAGE != QEM_MADV_INVALID) { if (qemu_madvise(host_addr, length, QEMU_MADV_HUGEPAGE)) { error_report("%s HUGEPAGE: %s", __func__, strerror(errno)); return -1; } But I am not sure if we want it. > + > + /* > + * We can also turn off userfault now since we should have all the > + * pages. It can be useful to leave it on to debug postcopy > + * if you're not sure it's always getting every page. > + */ > + range_struct.start = (uintptr_t)host_addr; > + range_struct.len = length; > + > + if (ioctl(mis->userfault_fd, UFFDIO_UNREGISTER, &range_struct)) { > + error_report("%s: userfault unregister %s", __func__, > strerror(errno)); > + > + return -1; > + } > + > + return 0; > +} I still think that exposing the userfault API all around is a bad idea, that it would be easier to just export: qemu_userfault_register_range(addr, lenght); qemu_userfault_unregister_range(addr, lenght); And hide the details on a header file. Later, Juan.