mirror of https://github.com/xemu-project/xemu.git
libvhost-user: Claim support for postcopy
Tell QEMU we understand the protocol features needed for postcopy. Signed-off-by: Dr. David Alan Gilbert <dgilbert@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
29d8fa7f73
commit
4275cd99c6
|
@ -185,6 +185,35 @@ vmsg_close_fds(VhostUserMsg *vmsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A test to see if we have userfault available */
|
||||||
|
static bool
|
||||||
|
have_userfault(void)
|
||||||
|
{
|
||||||
|
#if defined(__linux__) && defined(__NR_userfaultfd) &&\
|
||||||
|
defined(UFFD_FEATURE_MISSING_SHMEM) &&\
|
||||||
|
defined(UFFD_FEATURE_MISSING_HUGETLBFS)
|
||||||
|
/* Now test the kernel we're running on really has the features */
|
||||||
|
int ufd = syscall(__NR_userfaultfd, O_CLOEXEC | O_NONBLOCK);
|
||||||
|
struct uffdio_api api_struct;
|
||||||
|
if (ufd < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
api_struct.api = UFFD_API;
|
||||||
|
api_struct.features = UFFD_FEATURE_MISSING_SHMEM |
|
||||||
|
UFFD_FEATURE_MISSING_HUGETLBFS;
|
||||||
|
if (ioctl(ufd, UFFDIO_API, &api_struct)) {
|
||||||
|
close(ufd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
close(ufd);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
vu_message_read(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
|
vu_message_read(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
|
||||||
{
|
{
|
||||||
|
@ -939,6 +968,10 @@ vu_get_protocol_features_exec(VuDev *dev, VhostUserMsg *vmsg)
|
||||||
uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD |
|
uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD |
|
||||||
1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ;
|
1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ;
|
||||||
|
|
||||||
|
if (have_userfault()) {
|
||||||
|
features |= 1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT;
|
||||||
|
}
|
||||||
|
|
||||||
if (dev->iface->get_protocol_features) {
|
if (dev->iface->get_protocol_features) {
|
||||||
features |= dev->iface->get_protocol_features(dev);
|
features |= dev->iface->get_protocol_features(dev);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue