mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-15 17:48:58 +00:00
libvhost-user: replace qemu/memfd.h usage
Undo the damage from commit 5f9ff1eff3 ("libvhost-user: Support tracking inflight I/O in shared memory") which introduced glib dependency through osdep.h inclusion. libvhost-user.c tries to stay free from glib usage. Use glibc memfd_create directly when available (assumed so when MFD_ALLOW_SEALING is defined). A following commit will make the project standalone and check for memfd API at configure time, instead of a panic at runtime. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-Id: <20201125100640.366523-3-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
0ca293155b
commit
810033be08
@ -42,8 +42,6 @@
|
||||
#endif
|
||||
|
||||
#include "qemu/atomic.h"
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/memfd.h"
|
||||
|
||||
#include "libvhost-user.h"
|
||||
|
||||
@ -1615,11 +1613,45 @@ vu_inflight_queue_size(uint16_t queue_size)
|
||||
sizeof(uint16_t), INFLIGHT_ALIGNMENT);
|
||||
}
|
||||
|
||||
#ifdef MFD_ALLOW_SEALING
|
||||
static void *
|
||||
memfd_alloc(const char *name, size_t size, unsigned int flags, int *fd)
|
||||
{
|
||||
void *ptr;
|
||||
int ret;
|
||||
|
||||
*fd = memfd_create(name, MFD_ALLOW_SEALING);
|
||||
if (*fd < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = ftruncate(*fd, size);
|
||||
if (ret < 0) {
|
||||
close(*fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = fcntl(*fd, F_ADD_SEALS, flags);
|
||||
if (ret < 0) {
|
||||
close(*fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, *fd, 0);
|
||||
if (ptr == MAP_FAILED) {
|
||||
close(*fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool
|
||||
vu_get_inflight_fd(VuDev *dev, VhostUserMsg *vmsg)
|
||||
{
|
||||
int fd;
|
||||
void *addr;
|
||||
int fd = -1;
|
||||
void *addr = NULL;
|
||||
uint64_t mmap_size;
|
||||
uint16_t num_queues, queue_size;
|
||||
|
||||
@ -1637,9 +1669,13 @@ vu_get_inflight_fd(VuDev *dev, VhostUserMsg *vmsg)
|
||||
|
||||
mmap_size = vu_inflight_queue_size(queue_size) * num_queues;
|
||||
|
||||
addr = qemu_memfd_alloc("vhost-inflight", mmap_size,
|
||||
F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL,
|
||||
&fd, NULL);
|
||||
#ifdef MFD_ALLOW_SEALING
|
||||
addr = memfd_alloc("vhost-inflight", mmap_size,
|
||||
F_SEAL_GROW | F_SEAL_SHRINK | F_SEAL_SEAL,
|
||||
&fd);
|
||||
#else
|
||||
vu_panic(dev, "Not implemented: memfd support is missing");
|
||||
#endif
|
||||
|
||||
if (!addr) {
|
||||
vu_panic(dev, "Failed to alloc vhost inflight area");
|
||||
|
Loading…
x
Reference in New Issue
Block a user