From: "Maxiwell S. Garcia" <maxiwell@linux.ibm.com>
To: qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>,
dgilbert@redhat.com,
"Maxiwell S. Garcia" <maxiwell@linux.ibm.com>,
quintela@redhat.com
Subject: [Qemu-devel] [PATCH] migration: Use RunState enum to save global state pre migrate
Date: Mon, 24 Jun 2019 14:46:36 -0300 [thread overview]
Message-ID: <20190624174636.12428-1-maxiwell@linux.ibm.com> (raw)
The GlobalState struct has two confusing fields:
- uint8_t runstate[100]
- RunState state
The first field saves the 'current_run_state' from vl.c file before
migrate. The second field is filled in the post load func using the
'runstate' value. So, this commit renames the 'runstate' to
'state_pre_migrate' and use the same type used by 'state' and
'current_run_state' variables.
Signed-off-by: Maxiwell S. Garcia <maxiwell@linux.ibm.com>
---
include/sysemu/sysemu.h | 2 +-
migration/global_state.c | 65 ++++++----------------------------------
vl.c | 11 ++-----
3 files changed, 12 insertions(+), 66 deletions(-)
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index 61579ae71e..483b536c4f 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -23,7 +23,7 @@ bool runstate_check(RunState state);
void runstate_set(RunState new_state);
int runstate_is_running(void);
bool runstate_needs_reset(void);
-bool runstate_store(char *str, size_t size);
+RunState runstate_get(void);
typedef struct vm_change_state_entry VMChangeStateEntry;
typedef void VMChangeStateHandler(void *opaque, int running, RunState state);
diff --git a/migration/global_state.c b/migration/global_state.c
index 2c8c447239..b49b99f3a1 100644
--- a/migration/global_state.c
+++ b/migration/global_state.c
@@ -20,8 +20,7 @@
#include "trace.h"
typedef struct {
- uint32_t size;
- uint8_t runstate[100];
+ RunState state_pre_migrate;
RunState state;
bool received;
} GlobalState;
@@ -30,21 +29,14 @@ static GlobalState global_state;
int global_state_store(void)
{
- if (!runstate_store((char *)global_state.runstate,
- sizeof(global_state.runstate))) {
- error_report("runstate name too big: %s", global_state.runstate);
- trace_migrate_state_too_big();
- return -EINVAL;
- }
+ global_state.state_pre_migrate = runstate_get();
+
return 0;
}
void global_state_store_running(void)
{
- const char *state = RunState_str(RUN_STATE_RUNNING);
- assert(strlen(state) < sizeof(global_state.runstate));
- strncpy((char *)global_state.runstate,
- state, sizeof(global_state.runstate));
+ global_state.state_pre_migrate = RUN_STATE_RUNNING;
}
bool global_state_received(void)
@@ -60,7 +52,6 @@ RunState global_state_get_runstate(void)
static bool global_state_needed(void *opaque)
{
GlobalState *s = opaque;
- char *runstate = (char *)s->runstate;
/* If it is not optional, it is mandatory */
@@ -70,8 +61,8 @@ static bool global_state_needed(void *opaque)
/* If state is running or paused, it is not needed */
- if (strcmp(runstate, "running") == 0 ||
- strcmp(runstate, "paused") == 0) {
+ if (s->state_pre_migrate == RUN_STATE_RUNNING ||
+ s->state_pre_migrate == RUN_STATE_PAUSED) {
return false;
}
@@ -82,45 +73,10 @@ static bool global_state_needed(void *opaque)
static int global_state_post_load(void *opaque, int version_id)
{
GlobalState *s = opaque;
- Error *local_err = NULL;
- int r;
- char *runstate = (char *)s->runstate;
-
s->received = true;
- trace_migrate_global_state_post_load(runstate);
-
- if (strnlen((char *)s->runstate,
- sizeof(s->runstate)) == sizeof(s->runstate)) {
- /*
- * This condition should never happen during migration, because
- * all runstate names are shorter than 100 bytes (the size of
- * s->runstate). However, a malicious stream could overflow
- * the qapi_enum_parse() call, so we force the last character
- * to a NUL byte.
- */
- s->runstate[sizeof(s->runstate) - 1] = '\0';
- }
- r = qapi_enum_parse(&RunState_lookup, runstate, -1, &local_err);
-
- if (r == -1) {
- if (local_err) {
- error_report_err(local_err);
- }
- return -EINVAL;
- }
- s->state = r;
-
- return 0;
-}
-
-static int global_state_pre_save(void *opaque)
-{
- GlobalState *s = opaque;
-
- trace_migrate_global_state_pre_save((char *)s->runstate);
- s->size = strnlen((char *)s->runstate, sizeof(s->runstate)) + 1;
- assert(s->size <= sizeof(s->runstate));
+ s->state = s->state_pre_migrate;
+ trace_migrate_global_state_post_load(RunState_str(s->state));
return 0;
}
@@ -129,11 +85,9 @@ static const VMStateDescription vmstate_globalstate = {
.version_id = 1,
.minimum_version_id = 1,
.post_load = global_state_post_load,
- .pre_save = global_state_pre_save,
.needed = global_state_needed,
.fields = (VMStateField[]) {
- VMSTATE_UINT32(size, GlobalState),
- VMSTATE_BUFFER(runstate, GlobalState),
+ VMSTATE_UINT32(state_pre_migrate, GlobalState),
VMSTATE_END_OF_LIST()
},
};
@@ -141,7 +95,6 @@ static const VMStateDescription vmstate_globalstate = {
void register_global_state(void)
{
/* We would use it independently that we receive it */
- strcpy((char *)&global_state.runstate, "");
global_state.received = false;
vmstate_register(NULL, 0, &vmstate_globalstate, &global_state);
}
diff --git a/vl.c b/vl.c
index 99a56b5556..2b15d68d60 100644
--- a/vl.c
+++ b/vl.c
@@ -680,16 +680,9 @@ bool runstate_check(RunState state)
return current_run_state == state;
}
-bool runstate_store(char *str, size_t size)
+RunState runstate_get(void)
{
- const char *state = RunState_str(current_run_state);
- size_t len = strlen(state) + 1;
-
- if (len > size) {
- return false;
- }
- memcpy(str, state, len);
- return true;
+ return current_run_state;
}
static void runstate_init(void)
--
2.20.1
next reply other threads:[~2019-06-24 18:12 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-24 17:46 Maxiwell S. Garcia [this message]
2019-06-25 10:18 ` [Qemu-devel] [PATCH] migration: Use RunState enum to save global state pre migrate Dr. David Alan Gilbert
2019-06-25 10:56 ` Philippe Mathieu-Daudé
2019-06-25 21:35 ` Maxiwell S. Garcia
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=20190624174636.12428-1-maxiwell@linux.ibm.com \
--to=maxiwell@linux.ibm.com \
--cc=dgilbert@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).