Browse Source

tests/migration-test: Introduce MemType

Some migration tests need to be run with shmem, the rest by default use
anonymous memory.

Introduce MemType and replace use_shmem with such a enumeration.  This
prepares for a 3rd type of memory to be tested for migration.

Careful readers may also already notice that MigrateStart has another field
called memory_backend, which makes the whole "memory type" definition
convoluted.  That'll be merged into MemType soon in a follow up patch.

When doing this, introduce some migrate_mem_type_*() helpers to do the
work for each memory type.

Reviewed-by: Juraj Marcin <jmarcin@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Link: https://lore.kernel.org/r/20251117223908.415965-2-peterx@redhat.com
Signed-off-by: Peter Xu <peterx@redhat.com>
pull/312/head
Peter Xu 4 months ago
parent
commit
b187a183b1
  1. 2
      tests/qtest/migration/cpr-tests.c
  2. 81
      tests/qtest/migration/framework.c
  3. 8
      tests/qtest/migration/framework.h
  4. 2
      tests/qtest/migration/misc-tests.c

2
tests/qtest/migration/cpr-tests.c

@ -32,7 +32,7 @@ static void test_mode_reboot(void)
g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
FILE_TEST_FILENAME);
MigrateCommon args = {
.start.use_shmem = true,
.start.mem_type = MEM_TYPE_SHMEM,
.connect_uri = uri,
.listen_uri = "defer",
.start_hook = migrate_hook_start_mode_reboot,

81
tests/qtest/migration/framework.c

@ -260,6 +260,25 @@ static char *test_shmem_path(void)
return g_strdup_printf("/dev/shm/qemu-%d", getpid());
}
/* NOTE: caller is responsbile to free the string if returned */
static char *migrate_mem_type_get_opts(MemType type, const char *memory_size)
{
g_autofree char *shmem_path = NULL;
char *backend = NULL;
switch (type) {
case MEM_TYPE_SHMEM:
shmem_path = test_shmem_path();
backend = g_strdup_printf(
"-object memory-backend-file,id=mem0,size=%s"
",mem-path=%s,share=on -numa node,memdev=mem0",
memory_size, shmem_path);
return backend;
default:
return NULL;
}
}
int migrate_args(char **from, char **to, const char *uri, MigrateStart *args)
{
/* options for source and target */
@ -268,7 +287,6 @@ int migrate_args(char **from, char **to, const char *uri, MigrateStart *args)
gchar *cmd_target = NULL;
const gchar *ignore_stderr;
g_autofree char *shmem_opts = NULL;
g_autofree char *shmem_path = NULL;
const char *kvm_opts = NULL;
const char *arch = qtest_get_arch();
const char *memory_size;
@ -332,13 +350,7 @@ int migrate_args(char **from, char **to, const char *uri, MigrateStart *args)
ignore_stderr = "";
}
if (args->use_shmem) {
shmem_path = test_shmem_path();
shmem_opts = g_strdup_printf(
"-object memory-backend-file,id=mem0,size=%s"
",mem-path=%s,share=on -numa node,memdev=mem0",
memory_size, shmem_path);
}
shmem_opts = migrate_mem_type_get_opts(args->mem_type, memory_size);
if (args->memory_backend) {
memory_backend = g_strdup_printf(args->memory_backend, memory_size);
@ -403,6 +415,42 @@ int migrate_args(char **from, char **to, const char *uri, MigrateStart *args)
return 0;
}
static bool migrate_mem_type_prepare(MemType type)
{
switch (type) {
case MEM_TYPE_SHMEM:
if (!g_file_test("/dev/shm", G_FILE_TEST_IS_DIR)) {
g_test_skip("/dev/shm is not supported");
return false;
}
break;
default:
break;
}
return true;
}
static void migrate_mem_type_cleanup(MemType type)
{
g_autofree char *shmem_path = NULL;
switch (type) {
case MEM_TYPE_SHMEM:
/*
* Remove shmem file immediately to avoid memory leak in test
* failed case. It's valid because QEMU has already opened this
* file
*/
shmem_path = test_shmem_path();
unlink(shmem_path);
break;
default:
break;
}
}
int migrate_start(QTestState **from, QTestState **to, const char *uri,
MigrateStart *args)
{
@ -410,11 +458,8 @@ int migrate_start(QTestState **from, QTestState **to, const char *uri,
g_autofree gchar *cmd_target = NULL;
g_autoptr(QList) capabilities = migrate_start_get_qmp_capabilities(args);
if (args->use_shmem) {
if (!g_file_test("/dev/shm", G_FILE_TEST_IS_DIR)) {
g_test_skip("/dev/shm is not supported");
return -1;
}
if (!migrate_mem_type_prepare(args->mem_type)) {
return -1;
}
dst_state = (QTestMigrationState) { };
@ -441,15 +486,7 @@ int migrate_start(QTestState **from, QTestState **to, const char *uri,
&dst_state);
}
/*
* Remove shmem file immediately to avoid memory leak in test failed case.
* It's valid because QEMU has already opened this file
*/
if (args->use_shmem) {
g_autofree char *shmem_path = test_shmem_path();
unlink(shmem_path);
}
migrate_mem_type_cleanup(args->mem_type);
migrate_start_set_capabilities(*from,
args->only_source ? NULL : *to,
args);

8
tests/qtest/migration/framework.h

@ -18,6 +18,12 @@
#define FILE_TEST_OFFSET 0x1000
#define FILE_TEST_MARKER 'X'
typedef enum {
MEM_TYPE_ANON,
MEM_TYPE_SHMEM,
MEM_TYPE_NUM,
} MemType;
typedef struct MigrationTestEnv {
bool has_kvm;
bool has_tcg;
@ -102,7 +108,7 @@ typedef struct {
* unconditionally, because it means the user would like to be verbose.
*/
bool hide_stderr;
bool use_shmem;
MemType mem_type;
/* only launch the source process */
bool only_source;
/* only launch the target process */

2
tests/qtest/migration/misc-tests.c

@ -97,7 +97,7 @@ static void test_ignore_shared(void)
g_autofree char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
QTestState *from, *to;
MigrateStart args = {
.use_shmem = true,
.mem_type = MEM_TYPE_SHMEM,
.caps[MIGRATION_CAPABILITY_X_IGNORE_SHARED] = true,
};

Loading…
Cancel
Save