tests/qtest/migration: Move ufd_version_check to utils

Move ufd_version_check() to migration-util.c file. This is a helper
function that is used during tests definition so it should be
available outside of migration-test.c

Since the function is moving to another file, change it to stop
accessing the global uffd_feature_thread_id and take it as argument
instead.

Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
Fabiano Rosas 2024-11-27 15:28:51 -03:00
parent b7d7f723a9
commit 124a3c58b8
3 changed files with 52 additions and 45 deletions

View file

@ -35,6 +35,7 @@
/* For dirty ring test; so far only x86_64 is supported */
#if defined(__linux__) && defined(HOST_X86_64)
#include "linux/kvm.h"
#include <sys/ioctl.h>
#endif
unsigned start_address;
@ -88,50 +89,6 @@ typedef enum PostcopyRecoveryFailStage {
#include <sys/vfs.h>
#endif
#if defined(__linux__) && defined(__NR_userfaultfd) && defined(CONFIG_EVENTFD)
#include <sys/eventfd.h>
#include <sys/ioctl.h>
#include "qemu/userfaultfd.h"
static bool ufd_version_check(void)
{
struct uffdio_api api_struct;
uint64_t ioctl_mask;
int ufd = uffd_open(O_CLOEXEC);
if (ufd == -1) {
g_test_message("Skipping test: userfaultfd not available");
return false;
}
api_struct.api = UFFD_API;
api_struct.features = 0;
if (ioctl(ufd, UFFDIO_API, &api_struct)) {
g_test_message("Skipping test: UFFDIO_API failed");
return false;
}
uffd_feature_thread_id = api_struct.features & UFFD_FEATURE_THREAD_ID;
ioctl_mask = (1ULL << _UFFDIO_REGISTER |
1ULL << _UFFDIO_UNREGISTER);
if ((api_struct.ioctls & ioctl_mask) != ioctl_mask) {
g_test_message("Skipping test: Missing userfault feature");
return false;
}
return true;
}
#else
static bool ufd_version_check(void)
{
g_test_message("Skipping test: Userfault not available (builtdtime)");
return false;
}
#endif
static char *tmpfs;
static char *bootpath;
@ -3532,7 +3489,7 @@ int main(int argc, char **argv)
return 0;
}
has_uffd = ufd_version_check();
has_uffd = ufd_version_check(&uffd_feature_thread_id);
arch = qtest_get_arch();
is_x86 = !strcmp(arch, "i386") || !strcmp(arch, "x86_64");

View file

@ -22,6 +22,13 @@
#include "migration/bootfile.h"
#include "migration/migration-util.h"
/* for uffd_version_check() */
#if defined(__linux__) && defined(__NR_userfaultfd) && defined(CONFIG_EVENTFD)
#include <sys/eventfd.h>
#include "qemu/userfaultfd.h"
#endif
static char *SocketAddress_to_str(SocketAddress *addr)
{
switch (addr->type) {
@ -283,3 +290,44 @@ bool probe_o_direct_support(const char *tmpfs)
return true;
}
#endif
#if defined(__linux__) && defined(__NR_userfaultfd) && defined(CONFIG_EVENTFD)
bool ufd_version_check(bool *uffd_feature_thread_id)
{
struct uffdio_api api_struct;
uint64_t ioctl_mask;
int ufd = uffd_open(O_CLOEXEC);
if (ufd == -1) {
g_test_message("Skipping test: userfaultfd not available");
return false;
}
api_struct.api = UFFD_API;
api_struct.features = 0;
if (ioctl(ufd, UFFDIO_API, &api_struct)) {
g_test_message("Skipping test: UFFDIO_API failed");
return false;
}
if (uffd_feature_thread_id) {
*uffd_feature_thread_id = api_struct.features & UFFD_FEATURE_THREAD_ID;
}
ioctl_mask = (1ULL << _UFFDIO_REGISTER |
1ULL << _UFFDIO_UNREGISTER);
if ((api_struct.ioctls & ioctl_mask) != ioctl_mask) {
g_test_message("Skipping test: Missing userfault feature");
return false;
}
return true;
}
#else
bool ufd_version_check(bool *uffd_feature_thread_id)
{
g_test_message("Skipping test: Userfault not available (builtdtime)");
return false;
}
#endif

View file

@ -47,6 +47,8 @@ static inline bool probe_o_direct_support(const char *tmpfs)
return false;
}
#endif
bool ufd_version_check(bool *uffd_feature_thread_id);
void migration_test_add(const char *path, void (*fn)(void));
char *migrate_get_connect_uri(QTestState *who);
void migrate_set_ports(QTestState *to, QList *channel_list);