include/qemu/memfd.h | 18 +++++++++++++++++- backends/hostmem-memfd.c | 32 +++++++++++++++++++------------- tests/vhost-user-test.c | 6 +++--- util/memfd.c | 35 ++++++----------------------------- 4 files changed, 45 insertions(+), 46 deletions(-)
Run some memfd-related checks before registering hostmem-memfd &
various properties. This will help libvirt to figure out what the host
is supposed to be capable of.
qemu_memfd_check() is changed to a less optimized version, since it is
used with various flags, it no longer caches the result.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
include/qemu/memfd.h | 18 +++++++++++++++++-
backends/hostmem-memfd.c | 32 +++++++++++++++++++-------------
tests/vhost-user-test.c | 6 +++---
util/memfd.c | 35 ++++++-----------------------------
4 files changed, 45 insertions(+), 46 deletions(-)
diff --git a/include/qemu/memfd.h b/include/qemu/memfd.h
index 49e79634da..d551c28b68 100644
--- a/include/qemu/memfd.h
+++ b/include/qemu/memfd.h
@@ -16,12 +16,28 @@
#define F_SEAL_WRITE 0x0008 /* prevent writes */
#endif
+#ifndef MFD_CLOEXEC
+#define MFD_CLOEXEC 0x0001U
+#endif
+
+#ifndef MFD_ALLOW_SEALING
+#define MFD_ALLOW_SEALING 0x0002U
+#endif
+
+#ifndef MFD_HUGETLB
+#define MFD_HUGETLB 0x0004U
+#endif
+
+#ifndef MFD_HUGE_SHIFT
+#define MFD_HUGE_SHIFT 26
+#endif
+
int qemu_memfd_create(const char *name, size_t size, bool hugetlb,
uint64_t hugetlbsize, unsigned int seals, Error **errp);
bool qemu_memfd_alloc_check(void);
void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals,
int *fd, Error **errp);
void qemu_memfd_free(void *ptr, size_t size, int fd);
-bool qemu_memfd_check(void);
+bool qemu_memfd_check(unsigned int flags);
#endif /* QEMU_MEMFD_H */
diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
index 7184918112..ccf70a0694 100644
--- a/backends/hostmem-memfd.c
+++ b/backends/hostmem-memfd.c
@@ -138,18 +138,22 @@ memfd_backend_class_init(ObjectClass *oc, void *data)
bc->alloc = memfd_backend_memory_alloc;
- object_class_property_add_bool(oc, "hugetlb",
- memfd_backend_get_hugetlb,
- memfd_backend_set_hugetlb,
- &error_abort);
- object_class_property_add(oc, "hugetlbsize", "int",
- memfd_backend_get_hugetlbsize,
- memfd_backend_set_hugetlbsize,
- NULL, NULL, &error_abort);
- object_class_property_add_bool(oc, "seal",
- memfd_backend_get_seal,
- memfd_backend_set_seal,
- &error_abort);
+ if (qemu_memfd_check(MFD_HUGETLB)) {
+ object_class_property_add_bool(oc, "hugetlb",
+ memfd_backend_get_hugetlb,
+ memfd_backend_set_hugetlb,
+ &error_abort);
+ object_class_property_add(oc, "hugetlbsize", "int",
+ memfd_backend_get_hugetlbsize,
+ memfd_backend_set_hugetlbsize,
+ NULL, NULL, &error_abort);
+ }
+ if (qemu_memfd_check(MFD_ALLOW_SEALING)) {
+ object_class_property_add_bool(oc, "seal",
+ memfd_backend_get_seal,
+ memfd_backend_set_seal,
+ &error_abort);
+ }
}
static const TypeInfo memfd_backend_info = {
@@ -162,7 +166,9 @@ static const TypeInfo memfd_backend_info = {
static void register_types(void)
{
- type_register_static(&memfd_backend_info);
+ if (qemu_memfd_check(0)) {
+ type_register_static(&memfd_backend_info);
+ }
}
type_init(register_types);
diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
index 716aff7153..45d58d8ea2 100644
--- a/tests/vhost-user-test.c
+++ b/tests/vhost-user-test.c
@@ -169,7 +169,7 @@ static char *get_qemu_cmd(TestServer *s,
int mem, enum test_memfd memfd, const char *mem_path,
const char *chr_opts, const char *extra)
{
- if (memfd == TEST_MEMFD_AUTO && qemu_memfd_check()) {
+ if (memfd == TEST_MEMFD_AUTO && qemu_memfd_check(0)) {
memfd = TEST_MEMFD_YES;
}
@@ -903,7 +903,7 @@ static void test_multiqueue(void)
s->queues = 2;
test_server_listen(s);
- if (qemu_memfd_check()) {
+ if (qemu_memfd_check(0)) {
cmd = g_strdup_printf(
QEMU_CMD_MEMFD QEMU_CMD_CHR QEMU_CMD_NETDEV ",queues=%d "
"-device virtio-net-pci,netdev=net0,mq=on,vectors=%d",
@@ -963,7 +963,7 @@ int main(int argc, char **argv)
/* run the main loop thread so the chardev may operate */
thread = g_thread_new(NULL, thread_function, loop);
- if (qemu_memfd_check()) {
+ if (qemu_memfd_check(0)) {
qtest_add_data_func("/vhost-user/read-guest-mem/memfd",
GINT_TO_POINTER(TEST_MEMFD_YES),
test_read_guest_mem);
diff --git a/util/memfd.c b/util/memfd.c
index d248a53c3c..c4bd076182 100644
--- a/util/memfd.c
+++ b/util/memfd.c
@@ -45,22 +45,6 @@ static int memfd_create(const char *name, unsigned int flags)
}
#endif
-#ifndef MFD_CLOEXEC
-#define MFD_CLOEXEC 0x0001U
-#endif
-
-#ifndef MFD_ALLOW_SEALING
-#define MFD_ALLOW_SEALING 0x0002U
-#endif
-
-#ifndef MFD_HUGETLB
-#define MFD_HUGETLB 0x0004U
-#endif
-
-#ifndef MFD_HUGE_SHIFT
-#define MFD_HUGE_SHIFT 26
-#endif
-
int qemu_memfd_create(const char *name, size_t size, bool hugetlb,
uint64_t hugetlbsize, unsigned int seals, Error **errp)
{
@@ -200,23 +184,16 @@ bool qemu_memfd_alloc_check(void)
*
* Check if host supports memfd.
*/
-bool qemu_memfd_check(void)
+bool qemu_memfd_check(unsigned int flags)
{
#ifdef CONFIG_LINUX
- static int memfd_check = MEMFD_TODO;
+ int mfd = memfd_create("test", flags);
- if (memfd_check == MEMFD_TODO) {
- int mfd = memfd_create("test", 0);
- if (mfd >= 0) {
- memfd_check = MEMFD_OK;
- close(mfd);
- } else {
- memfd_check = MEMFD_KO;
- }
+ if (mfd >= 0) {
+ close(mfd);
+ return true;
}
+#endif
- return memfd_check == MEMFD_OK;
-#else
return false;
-#endif
}
--
2.19.0.rc1
On 06/09/2018 18:14, Marc-André Lureau wrote:
> Run some memfd-related checks before registering hostmem-memfd &
> various properties. This will help libvirt to figure out what the host
> is supposed to be capable of.
>
> qemu_memfd_check() is changed to a less optimized version, since it is
> used with various flags, it no longer caches the result.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> include/qemu/memfd.h | 18 +++++++++++++++++-
> backends/hostmem-memfd.c | 32 +++++++++++++++++++-------------
> tests/vhost-user-test.c | 6 +++---
> util/memfd.c | 35 ++++++-----------------------------
> 4 files changed, 45 insertions(+), 46 deletions(-)
>
> diff --git a/include/qemu/memfd.h b/include/qemu/memfd.h
> index 49e79634da..d551c28b68 100644
> --- a/include/qemu/memfd.h
> +++ b/include/qemu/memfd.h
> @@ -16,12 +16,28 @@
> #define F_SEAL_WRITE 0x0008 /* prevent writes */
> #endif
>
> +#ifndef MFD_CLOEXEC
> +#define MFD_CLOEXEC 0x0001U
> +#endif
> +
> +#ifndef MFD_ALLOW_SEALING
> +#define MFD_ALLOW_SEALING 0x0002U
> +#endif
> +
> +#ifndef MFD_HUGETLB
> +#define MFD_HUGETLB 0x0004U
> +#endif
> +
> +#ifndef MFD_HUGE_SHIFT
> +#define MFD_HUGE_SHIFT 26
> +#endif
> +
> int qemu_memfd_create(const char *name, size_t size, bool hugetlb,
> uint64_t hugetlbsize, unsigned int seals, Error **errp);
> bool qemu_memfd_alloc_check(void);
> void *qemu_memfd_alloc(const char *name, size_t size, unsigned int seals,
> int *fd, Error **errp);
> void qemu_memfd_free(void *ptr, size_t size, int fd);
> -bool qemu_memfd_check(void);
> +bool qemu_memfd_check(unsigned int flags);
>
> #endif /* QEMU_MEMFD_H */
> diff --git a/backends/hostmem-memfd.c b/backends/hostmem-memfd.c
> index 7184918112..ccf70a0694 100644
> --- a/backends/hostmem-memfd.c
> +++ b/backends/hostmem-memfd.c
> @@ -138,18 +138,22 @@ memfd_backend_class_init(ObjectClass *oc, void *data)
>
> bc->alloc = memfd_backend_memory_alloc;
>
> - object_class_property_add_bool(oc, "hugetlb",
> - memfd_backend_get_hugetlb,
> - memfd_backend_set_hugetlb,
> - &error_abort);
> - object_class_property_add(oc, "hugetlbsize", "int",
> - memfd_backend_get_hugetlbsize,
> - memfd_backend_set_hugetlbsize,
> - NULL, NULL, &error_abort);
> - object_class_property_add_bool(oc, "seal",
> - memfd_backend_get_seal,
> - memfd_backend_set_seal,
> - &error_abort);
> + if (qemu_memfd_check(MFD_HUGETLB)) {
> + object_class_property_add_bool(oc, "hugetlb",
> + memfd_backend_get_hugetlb,
> + memfd_backend_set_hugetlb,
> + &error_abort);
> + object_class_property_add(oc, "hugetlbsize", "int",
> + memfd_backend_get_hugetlbsize,
> + memfd_backend_set_hugetlbsize,
> + NULL, NULL, &error_abort);
> + }
> + if (qemu_memfd_check(MFD_ALLOW_SEALING)) {
> + object_class_property_add_bool(oc, "seal",
> + memfd_backend_get_seal,
> + memfd_backend_set_seal,
> + &error_abort);
> + }
> }
>
> static const TypeInfo memfd_backend_info = {
> @@ -162,7 +166,9 @@ static const TypeInfo memfd_backend_info = {
>
> static void register_types(void)
> {
> - type_register_static(&memfd_backend_info);
> + if (qemu_memfd_check(0)) {
> + type_register_static(&memfd_backend_info);
> + }
> }
>
> type_init(register_types);
> diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
> index 716aff7153..45d58d8ea2 100644
> --- a/tests/vhost-user-test.c
> +++ b/tests/vhost-user-test.c
> @@ -169,7 +169,7 @@ static char *get_qemu_cmd(TestServer *s,
> int mem, enum test_memfd memfd, const char *mem_path,
> const char *chr_opts, const char *extra)
> {
> - if (memfd == TEST_MEMFD_AUTO && qemu_memfd_check()) {
> + if (memfd == TEST_MEMFD_AUTO && qemu_memfd_check(0)) {
> memfd = TEST_MEMFD_YES;
> }
>
> @@ -903,7 +903,7 @@ static void test_multiqueue(void)
> s->queues = 2;
> test_server_listen(s);
>
> - if (qemu_memfd_check()) {
> + if (qemu_memfd_check(0)) {
> cmd = g_strdup_printf(
> QEMU_CMD_MEMFD QEMU_CMD_CHR QEMU_CMD_NETDEV ",queues=%d "
> "-device virtio-net-pci,netdev=net0,mq=on,vectors=%d",
> @@ -963,7 +963,7 @@ int main(int argc, char **argv)
> /* run the main loop thread so the chardev may operate */
> thread = g_thread_new(NULL, thread_function, loop);
>
> - if (qemu_memfd_check()) {
> + if (qemu_memfd_check(0)) {
> qtest_add_data_func("/vhost-user/read-guest-mem/memfd",
> GINT_TO_POINTER(TEST_MEMFD_YES),
> test_read_guest_mem);
> diff --git a/util/memfd.c b/util/memfd.c
> index d248a53c3c..c4bd076182 100644
> --- a/util/memfd.c
> +++ b/util/memfd.c
> @@ -45,22 +45,6 @@ static int memfd_create(const char *name, unsigned int flags)
> }
> #endif
>
> -#ifndef MFD_CLOEXEC
> -#define MFD_CLOEXEC 0x0001U
> -#endif
> -
> -#ifndef MFD_ALLOW_SEALING
> -#define MFD_ALLOW_SEALING 0x0002U
> -#endif
> -
> -#ifndef MFD_HUGETLB
> -#define MFD_HUGETLB 0x0004U
> -#endif
> -
> -#ifndef MFD_HUGE_SHIFT
> -#define MFD_HUGE_SHIFT 26
> -#endif
> -
> int qemu_memfd_create(const char *name, size_t size, bool hugetlb,
> uint64_t hugetlbsize, unsigned int seals, Error **errp)
> {
> @@ -200,23 +184,16 @@ bool qemu_memfd_alloc_check(void)
> *
> * Check if host supports memfd.
> */
> -bool qemu_memfd_check(void)
> +bool qemu_memfd_check(unsigned int flags)
> {
> #ifdef CONFIG_LINUX
> - static int memfd_check = MEMFD_TODO;
> + int mfd = memfd_create("test", flags);
>
> - if (memfd_check == MEMFD_TODO) {
> - int mfd = memfd_create("test", 0);
> - if (mfd >= 0) {
> - memfd_check = MEMFD_OK;
> - close(mfd);
> - } else {
> - memfd_check = MEMFD_KO;
> - }
> + if (mfd >= 0) {
> + close(mfd);
> + return true;
> }
> +#endif
>
> - return memfd_check == MEMFD_OK;
> -#else
> return false;
> -#endif
> }
>
Queued, thanks.
Paolo
© 2016 - 2025 Red Hat, Inc.