mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
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:
parent
b7d7f723a9
commit
124a3c58b8
3 changed files with 52 additions and 45 deletions
|
@ -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");
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue