From: mrhines@linux.vnet.ibm.com
To: qemu-devel@nongnu.org
Cc: aliguori@us.ibm.com, quintela@redhat.com, knoel@redhat.com,
owasserm@redhat.com, abali@us.ibm.com, mrhines@us.ibm.com,
gokul@us.ibm.com, pbonzini@redhat.com, chegu_vinod@hp.com
Subject: [Qemu-devel] [PATCH v12 14/15] rdma: introduce MIG_STATE_NONE and change MIG_STATE_SETUP state transition
Date: Tue, 25 Jun 2013 21:35:40 -0400 [thread overview]
Message-ID: <1372210541-28092-15-git-send-email-mrhines@linux.vnet.ibm.com> (raw)
In-Reply-To: <1372210541-28092-1-git-send-email-mrhines@linux.vnet.ibm.com>
From: "Michael R. Hines" <mrhines@us.ibm.com>
As described in the previous patch, until now, the MIG_STATE_SETUP
state was not really a 'formal' state. It has been used as a 'zero' state
(what we're calling 'NONE' here) and QEMU has been unconditionally transitioning
into this state when the QMP migration command was called. Instead we want to
introduce MIG_STATE_NONE, which is our starting state in the state machine, and
then immediately transition into the MIG_STATE_SETUP state when the QMP migrate
command is issued.
In order to do this, we must delay the transition into MIG_STATE_ACTIVE until
later in the migration_thread(). This is done to be able to timestamp the amount of
time spent in the SETUP state for proper accounting to the user during
an RDMA migration.
Furthermore, the management software, until now, has never been aware of the
existence of the SETUP state whatsoever. This must change, because, timing of this
state implies that the state actually exists.
These two patches cannot be separated because the 'query_migrate' QMP
switch statement needs to know how to handle this new state transition.
Reviewed-by: Juan Quintela <quintela@redhat.com>
Tested-by: Michael R. Hines <mrhines@us.ibm.com>
Signed-off-by: Michael R. Hines <mrhines@us.ibm.com>
---
migration.c | 23 +++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
diff --git a/migration.c b/migration.c
index dcb99c9..a199a67 100644
--- a/migration.c
+++ b/migration.c
@@ -36,7 +36,8 @@
#endif
enum {
- MIG_STATE_ERROR,
+ MIG_STATE_ERROR = -1,
+ MIG_STATE_NONE,
MIG_STATE_SETUP,
MIG_STATE_CANCELLED,
MIG_STATE_ACTIVE,
@@ -63,7 +64,7 @@ static NotifierList migration_state_notifiers =
MigrationState *migrate_get_current(void)
{
static MigrationState current_migration = {
- .state = MIG_STATE_SETUP,
+ .state = MIG_STATE_NONE,
.bandwidth_limit = MAX_THROTTLE,
.xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE,
.mbps = -1,
@@ -184,9 +185,13 @@ MigrationInfo *qmp_query_migrate(Error **errp)
MigrationState *s = migrate_get_current();
switch (s->state) {
- case MIG_STATE_SETUP:
+ case MIG_STATE_NONE:
/* no migration has happened ever */
break;
+ case MIG_STATE_SETUP:
+ info->has_status = true;
+ info->status = g_strdup("setup");
+ break;
case MIG_STATE_ACTIVE:
info->has_status = true;
info->status = g_strdup("active");
@@ -257,7 +262,7 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
MigrationState *s = migrate_get_current();
MigrationCapabilityStatusList *cap;
- if (s->state == MIG_STATE_ACTIVE) {
+ if (s->state == MIG_STATE_ACTIVE || s->state == MIG_STATE_SETUP) {
error_set(errp, QERR_MIGRATION_ACTIVE);
return;
}
@@ -316,7 +321,7 @@ static void migrate_fd_cancel(MigrationState *s)
{
DPRINTF("cancelling migration\n");
- migrate_set_state(s, MIG_STATE_ACTIVE, MIG_STATE_CANCELLED);
+ migrate_set_state(s, s->state, MIG_STATE_CANCELLED);
}
void add_migration_state_change_notifier(Notifier *notify)
@@ -393,7 +398,7 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk,
params.blk = blk;
params.shared = inc;
- if (s->state == MIG_STATE_ACTIVE) {
+ if (s->state == MIG_STATE_ACTIVE || s->state == MIG_STATE_SETUP) {
error_set(errp, QERR_MIGRATION_ACTIVE);
return;
}
@@ -525,6 +530,8 @@ static void *migration_thread(void *opaque)
DPRINTF("beginning savevm\n");
qemu_savevm_state_begin(s->file, &s->params);
+ migrate_set_state(s, MIG_STATE_SETUP, MIG_STATE_ACTIVE);
+
while (s->state == MIG_STATE_ACTIVE) {
int64_t current_time;
uint64_t pending_size;
@@ -604,8 +611,8 @@ static void *migration_thread(void *opaque)
void migrate_fd_connect(MigrationState *s)
{
- s->state = MIG_STATE_ACTIVE;
- trace_migrate_set_state(MIG_STATE_ACTIVE);
+ s->state = MIG_STATE_SETUP;
+ trace_migrate_set_state(MIG_STATE_SETUP);
/* This is a best 1st approximation. ns to ms */
s->expected_downtime = max_downtime/1000000;
--
1.7.10.4
next prev parent reply other threads:[~2013-06-26 1:36 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-26 1:35 [Qemu-devel] [PATCH v12 00/15] rdma: migration support mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 01/15] rdma: add documentation mrhines
2013-06-26 1:48 ` [Qemu-devel] [PATCH v12 00/15] rdma: migration support Michael R. Hines
2013-06-27 22:41 ` [Qemu-devel] [PATCH v12 01/15] rdma: add documentation Eric Blake
2013-06-27 22:48 ` Michael R. Hines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 02/15] rdma: introduce qemu_update_position() mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 03/15] rdma: export yield_until_fd_readable() mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 04/15] rdma: export throughput w/ MigrationStats QMP mrhines
2013-06-27 23:02 ` Eric Blake
2013-06-28 13:13 ` Michael R. Hines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 05/15] rdma: introduce qemu_file_mode_is_not_valid() mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 06/15] rdma: export qemu_fflush() mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 08/15] rdma: introduce qemu_ram_foreach_block() mrhines
2013-06-27 19:24 ` Peter Maydell
2013-06-27 19:56 ` Michael R. Hines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 09/15] rdma: new QEMUFileOps hooks mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 10/15] rdma: introduce capability x-rdma-pin-all mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 11/15] rdma: core logic mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 12/15] rdma: send pc.ram mrhines
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 13/15] rdma: allow state transitions between other states besides ACTIVE mrhines
2013-06-26 1:35 ` mrhines [this message]
2013-06-26 1:35 ` [Qemu-devel] [PATCH v12 15/15] rdma: account for the time spent in MIG_STATE_SETUP through QMP mrhines
2013-06-27 22:58 ` Eric Blake
2013-06-28 7:15 ` Paolo Bonzini
2013-06-28 13:15 ` Michael R. Hines
2013-06-28 13:32 ` Eric Blake
2013-06-28 14:45 ` Michael R. Hines
2013-06-28 13:14 ` Michael R. Hines
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1372210541-28092-15-git-send-email-mrhines@linux.vnet.ibm.com \
--to=mrhines@linux.vnet.ibm.com \
--cc=abali@us.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=chegu_vinod@hp.com \
--cc=gokul@us.ibm.com \
--cc=knoel@redhat.com \
--cc=mrhines@us.ibm.com \
--cc=owasserm@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).