From d608c2536436dda2ab37403d345034424958153c Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Mon, 16 Nov 2015 14:33:19 +0100 Subject: [PATCH 37/44] vhost-user-test: check ownership during migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-id: <1447684235-15638-31-git-send-email-mst@redhat.com> Patchwork-id: 68387 O-Subject: [PATCH RHEV 7.3/7.2.z v2 30/36] vhost-user-test: check ownership during migration Bugzilla: 1279388 RH-Acked-by: Xiao Wang RH-Acked-by: Victor Kaplansky RH-Acked-by: Marcel Apfelbaum RH-Acked-by: Marc-André Lureau From: Marc-André Lureau Check that backend source and destination do not have simultaneous ownership during migration. Signed-off-by: Marc-André Lureau Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin Tested-by: Thibaut Collet (cherry picked from commit 1d9edff78fa0b294d6084df76da89e20ee93fdab) Signed-off-by: Miroslav Rezanina --- tests/vhost-user-test.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c index 266710d..d2fc048 100644 --- a/tests/vhost-user-test.c +++ b/tests/vhost-user-test.c @@ -307,6 +307,10 @@ static void chr_read(void *opaque, const uint8_t *buf, int size) g_cond_signal(&s->data_cond); break; + case VHOST_USER_RESET_OWNER: + s->fds_num = 0; + break; + default: break; } @@ -461,12 +465,37 @@ static guint64 get_log_size(TestServer *s) return log_size; } +typedef struct TestMigrateSource { + GSource source; + TestServer *src; + TestServer *dest; +} TestMigrateSource; + +static gboolean +test_migrate_source_check(GSource *source) +{ + TestMigrateSource *t = (TestMigrateSource *)source; + gboolean overlap = t->src->fds_num > 0 && t->dest->fds_num > 0; + + g_assert(!overlap); + + return FALSE; +} + +GSourceFuncs test_migrate_source_funcs = { + NULL, + test_migrate_source_check, + NULL, + NULL +}; + static void test_migrate(void) { TestServer *s = test_server_new("src"); TestServer *dest = test_server_new("dest"); const char *uri = "tcp:127.0.0.1:1234"; QTestState *global = global_qtest, *from, *to; + GSource *source; gchar *cmd; QDict *rsp; guint8 *log; @@ -484,6 +513,12 @@ static void test_migrate(void) to = qtest_init(cmd); g_free(cmd); + source = g_source_new(&test_migrate_source_funcs, + sizeof(TestMigrateSource)); + ((TestMigrateSource *)source)->src = s; + ((TestMigrateSource *)source)->dest = dest; + g_source_attach(source, NULL); + /* slow down migration to have time to fiddle with log */ /* TODO: qtest could learn to break on some places */ rsp = qmp("{ 'execute': 'migrate_set_speed'," @@ -522,6 +557,9 @@ static void test_migrate(void) read_guest_mem(dest); + g_source_destroy(source); + g_source_unref(source); + qtest_quit(to); test_server_free(dest); qtest_quit(from); -- 1.8.3.1