aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2018-05-17 11:10:12 +0100
committerPeter Maydell <peter.maydell@linaro.org>2018-05-17 11:10:12 +0100
commiteb7514ae10d187ccf3bfc0f7dc159a4dfde20be4 (patch)
tree3f35a8a725b5720914644a9f4e99245bfac8445f /tests
parent61126a8b4bea43212b575169d4140dc403fc7e90 (diff)
parent8b7bf2badac25c0a52aff1b181ad75fdb304dd0c (diff)
Merge remote-tracking branch 'remotes/juanquintela/tags/migration/20180515' into staging
migration/next for 20180515 # gpg: Signature made Tue 15 May 2018 22:54:38 BST # gpg: using RSA key F487EF185872D723 # gpg: Good signature from "Juan Quintela <quintela@redhat.com>" # gpg: aka "Juan Quintela <quintela@trasno.org>" # Primary key fingerprint: 1899 FF8E DEBF 58CC EE03 4B82 F487 EF18 5872 D723 * remotes/juanquintela/tags/migration/20180515: (40 commits) Migration+TLS: Fix crash due to double cleanup migration: Textual fixups for blocktime migration: update index field when delete or qsort RDMALocalBlock migration: update docs migration/hmp: add migrate_pause command migration/qmp: add command migrate-pause migration: introduce lock for to_dst_file hmp/migration: add migrate_recover command qmp/migration: new command migrate-recover migration: init dst in migration_object_init too migration: final handshake for the resume migration: setup ramstate for resume migration: synchronize dirty bitmap for resume migration: introduce SaveVMHandlers.resume_prepare migration: new message MIG_RP_MSG_RESUME_ACK migration: new cmd MIG_CMD_POSTCOPY_RESUME migration: new message MIG_RP_MSG_RECV_BITMAP migration: new cmd MIG_CMD_RECV_BITMAP migration: wakeup dst ram-load-thread for recover migration: new state "postcopy-recover" ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/migration-test.c85
1 files changed, 47 insertions, 38 deletions
diff --git a/tests/migration-test.c b/tests/migration-test.c
index b99661b773..3a85446f95 100644
--- a/tests/migration-test.c
+++ b/tests/migration-test.c
@@ -19,9 +19,6 @@
#include "qemu/sockets.h"
#include "chardev/char.h"
#include "sysemu/sysemu.h"
-#include "hw/nvram/chrp_nvram.h"
-
-#define MIN_NVRAM_SIZE 8192 /* from spapr_nvram.c */
const unsigned start_address = 1024 * 1024;
const unsigned end_address = 100 * 1024 * 1024;
@@ -92,36 +89,6 @@ static void init_bootfile_x86(const char *bootpath)
fclose(bootfile);
}
-static void init_bootfile_ppc(const char *bootpath)
-{
- FILE *bootfile;
- char buf[MIN_NVRAM_SIZE];
- ChrpNvramPartHdr *header = (ChrpNvramPartHdr *)buf;
-
- memset(buf, 0, MIN_NVRAM_SIZE);
-
- /* Create a "common" partition in nvram to store boot-command property */
-
- header->signature = CHRP_NVPART_SYSTEM;
- memcpy(header->name, "common", 6);
- chrp_nvram_finish_partition(header, MIN_NVRAM_SIZE);
-
- /* FW_MAX_SIZE is 4MB, but slof.bin is only 900KB,
- * so let's modify memory between 1MB and 100MB
- * to do like PC bootsector
- */
-
- sprintf(buf + 16,
- "boot-command=hex .\" _\" begin %x %x do i c@ 1 + i c! 1000 +loop "
- ".\" B\" 0 until", end_address, start_address);
-
- /* Write partition to the NVRAM file */
-
- bootfile = fopen(bootpath, "wb");
- g_assert_cmpint(fwrite(buf, MIN_NVRAM_SIZE, 1, bootfile), ==, 1);
- fclose(bootfile);
-}
-
/*
* Wait for some output in the serial output file,
* we get an 'A' followed by an endless string of 'B's
@@ -422,12 +389,14 @@ static void test_migrate_start(QTestState **from, QTestState **to,
if (access("/sys/module/kvm_hv", F_OK)) {
accel = "tcg";
}
- init_bootfile_ppc(bootpath);
cmd_src = g_strdup_printf("-machine accel=%s -m 256M"
" -name source,debug-threads=on"
" -serial file:%s/src_serial"
- " -drive file=%s,if=pflash,format=raw",
- accel, tmpfs, bootpath);
+ " -prom-env '"
+ "boot-command=hex .\" _\" begin %x %x "
+ "do i c@ 1 + i c! 1000 +loop .\" B\" 0 "
+ "until'", accel, tmpfs, end_address,
+ start_address);
cmd_dst = g_strdup_printf("-machine accel=%s -m 256M"
" -name target,debug-threads=on"
" -serial file:%s/dest_serial"
@@ -536,7 +505,7 @@ static void test_deprecated(void)
qtest_quit(from);
}
-static void test_migrate(void)
+static void test_postcopy(void)
{
char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
QTestState *from, *to;
@@ -611,6 +580,45 @@ static void test_baddest(void)
test_migrate_end(from, to, false);
}
+static void test_precopy_unix(void)
+{
+ char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
+ QTestState *from, *to;
+
+ test_migrate_start(&from, &to, uri, false);
+
+ /* We want to pick a speed slow enough that the test completes
+ * quickly, but that it doesn't complete precopy even on a slow
+ * machine, so also set the downtime.
+ */
+ /* 1 ms should make it not converge*/
+ migrate_set_parameter(from, "downtime-limit", "1");
+ /* 1GB/s */
+ migrate_set_parameter(from, "max-bandwidth", "1000000000");
+
+ /* Wait for the first serial output from the source */
+ wait_for_serial("src_serial");
+
+ migrate(from, uri);
+
+ wait_for_migration_pass(from);
+
+ /* 300 ms should converge */
+ migrate_set_parameter(from, "downtime-limit", "300");
+
+ if (!got_stop) {
+ qtest_qmp_eventwait(from, "STOP");
+ }
+
+ qtest_qmp_eventwait(to, "RESUME");
+
+ wait_for_serial("dest_serial");
+ wait_for_migration_complete(from);
+
+ test_migrate_end(from, to, true);
+ g_free(uri);
+}
+
int main(int argc, char **argv)
{
char template[] = "/tmp/migration-test-XXXXXX";
@@ -630,9 +638,10 @@ int main(int argc, char **argv)
module_call_init(MODULE_INIT_QOM);
- qtest_add_func("/migration/postcopy/unix", test_migrate);
+ qtest_add_func("/migration/postcopy/unix", test_postcopy);
qtest_add_func("/migration/deprecated", test_deprecated);
qtest_add_func("/migration/bad_dest", test_baddest);
+ qtest_add_func("/migration/precopy/unix", test_precopy_unix);
ret = g_test_run();