Message ID | 1271829445-5328-15-git-send-email-tamura.yoshiaki@lab.ntt.co.jp |
---|---|
State | New |
Headers | show |
On 04/21/2010 12:57 AM, Yoshiaki Tamura wrote: > Make a 32bit entry after QEMU_VM_FILE_VERSION to recognize whether the > transfered data is QEMU_VM_FT_MODE or QEMU_VM_LIVE_MIGRATION_MODE. > I'd rather you encapsulate the current protocol as opposed to extending it with a new version. You could also do this by just having a new -incoming option, right? All you really need is to indicate that this is for high frequency checkpointing, right? Regards, Anthony Liguori > Signed-off-by: Yoshiaki Tamura<tamura.yoshiaki@lab.ntt.co.jp> > --- > savevm.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > sysemu.h | 1 + > 2 files changed, 75 insertions(+), 2 deletions(-) > > diff --git a/savevm.c b/savevm.c > index 292ae32..19b3efb 100644 > --- a/savevm.c > +++ b/savevm.c > @@ -1402,8 +1402,10 @@ static void vmstate_save(QEMUFile *f, SaveStateEntry *se) > } > > #define QEMU_VM_FILE_MAGIC 0x5145564d > -#define QEMU_VM_FILE_VERSION_COMPAT 0x00000002 > -#define QEMU_VM_FILE_VERSION 0x00000003 > +#define QEMU_VM_FILE_VERSION_COMPAT 0x00000003 > +#define QEMU_VM_FILE_VERSION 0x00000004 > +#define QEMU_VM_LIVE_MIGRATION_MODE 0x00000005 > +#define QEMU_VM_FT_MODE 0x00000006 > > #define QEMU_VM_EOF 0x00 > #define QEMU_VM_SECTION_START 0x01 > @@ -1425,6 +1427,12 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable, > > qemu_put_be32(f, QEMU_VM_FILE_MAGIC); > qemu_put_be32(f, QEMU_VM_FILE_VERSION); > + > + if (ft_mode) { > + qemu_put_be32(f, QEMU_VM_FT_MODE); > + } else { > + qemu_put_be32(f, QEMU_VM_LIVE_MIGRATION_MODE); > + } > > QTAILQ_FOREACH(se,&savevm_handlers, entry) { > int len; > @@ -1533,6 +1541,66 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f) > return 0; > } > > +int qemu_savevm_state_all(Monitor *mon, QEMUFile *f) > +{ > + SaveStateEntry *se; > + > + QTAILQ_FOREACH(se,&savevm_handlers, entry) { > + int len; > + > + if (se->save_live_state == NULL) > + continue; > + > + /* Section type */ > + qemu_put_byte(f, QEMU_VM_SECTION_START); > + qemu_put_be32(f, se->section_id); > + > + /* ID string */ > + len = strlen(se->idstr); > + qemu_put_byte(f, len); > + qemu_put_buffer(f, (uint8_t *)se->idstr, len); > + > + qemu_put_be32(f, se->instance_id); > + qemu_put_be32(f, se->version_id); > + if (ft_mode == FT_INIT) { > + /* This is workaround. */ > + se->save_live_state(mon, f, QEMU_VM_SECTION_START, se->opaque); > + } else { > + se->save_live_state(mon, f, QEMU_VM_SECTION_PART, se->opaque); > + } > + } > + > + ft_mode = FT_TRANSACTION; > + QTAILQ_FOREACH(se,&savevm_handlers, entry) { > + int len; > + > + if (se->save_state == NULL&& se->vmsd == NULL) > + continue; > + > + /* Section type */ > + qemu_put_byte(f, QEMU_VM_SECTION_FULL); > + qemu_put_be32(f, se->section_id); > + > + /* ID string */ > + len = strlen(se->idstr); > + qemu_put_byte(f, len); > + qemu_put_buffer(f, (uint8_t *)se->idstr, len); > + > + qemu_put_be32(f, se->instance_id); > + qemu_put_be32(f, se->version_id); > + > + vmstate_save(f, se); > + } > + > + qemu_put_byte(f, QEMU_VM_EOF); > + > + if (qemu_file_has_error(f)) > + return -EIO; > + > + return 0; > +} > + > + > void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f) > { > SaveStateEntry *se; > @@ -1617,6 +1685,10 @@ int qemu_loadvm_state(QEMUFile *f, int skip_header) > if (v != QEMU_VM_FILE_VERSION) > return -ENOTSUP; > > + v = qemu_get_be32(f); > + if (v == QEMU_VM_FT_MODE) { > + ft_mode = FT_INIT; > + } > } > > while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) { > diff --git a/sysemu.h b/sysemu.h > index 6c1441f..df314bb 100644 > --- a/sysemu.h > +++ b/sysemu.h > @@ -67,6 +67,7 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable, > int shared); > int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f); > int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f); > +int qemu_savevm_state_all(Monitor *mon, QEMUFile *f); > void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f); > int qemu_loadvm_state(QEMUFile *f, int skip_header); > >
Anthony Liguori wrote: > On 04/21/2010 12:57 AM, Yoshiaki Tamura wrote: >> Make a 32bit entry after QEMU_VM_FILE_VERSION to recognize whether the >> transfered data is QEMU_VM_FT_MODE or QEMU_VM_LIVE_MIGRATION_MODE. > > I'd rather you encapsulate the current protocol as opposed to extending > it with a new version. > > You could also do this by just having a new -incoming option, right? All > you really need is to indicate that this is for high frequency > checkpointing, right? Exactly. I would use -incoming option. > > Regards, > > Anthony Liguori > >> Signed-off-by: Yoshiaki Tamura<tamura.yoshiaki@lab.ntt.co.jp> >> --- >> savevm.c | 76 >> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- >> sysemu.h | 1 + >> 2 files changed, 75 insertions(+), 2 deletions(-) >> >> diff --git a/savevm.c b/savevm.c >> index 292ae32..19b3efb 100644 >> --- a/savevm.c >> +++ b/savevm.c >> @@ -1402,8 +1402,10 @@ static void vmstate_save(QEMUFile *f, >> SaveStateEntry *se) >> } >> >> #define QEMU_VM_FILE_MAGIC 0x5145564d >> -#define QEMU_VM_FILE_VERSION_COMPAT 0x00000002 >> -#define QEMU_VM_FILE_VERSION 0x00000003 >> +#define QEMU_VM_FILE_VERSION_COMPAT 0x00000003 >> +#define QEMU_VM_FILE_VERSION 0x00000004 >> +#define QEMU_VM_LIVE_MIGRATION_MODE 0x00000005 >> +#define QEMU_VM_FT_MODE 0x00000006 >> >> #define QEMU_VM_EOF 0x00 >> #define QEMU_VM_SECTION_START 0x01 >> @@ -1425,6 +1427,12 @@ int qemu_savevm_state_begin(Monitor *mon, >> QEMUFile *f, int blk_enable, >> >> qemu_put_be32(f, QEMU_VM_FILE_MAGIC); >> qemu_put_be32(f, QEMU_VM_FILE_VERSION); >> + >> + if (ft_mode) { >> + qemu_put_be32(f, QEMU_VM_FT_MODE); >> + } else { >> + qemu_put_be32(f, QEMU_VM_LIVE_MIGRATION_MODE); >> + } >> >> QTAILQ_FOREACH(se,&savevm_handlers, entry) { >> int len; >> @@ -1533,6 +1541,66 @@ int qemu_savevm_state_complete(Monitor *mon, >> QEMUFile *f) >> return 0; >> } >> >> +int qemu_savevm_state_all(Monitor *mon, QEMUFile *f) >> +{ >> + SaveStateEntry *se; >> + >> + QTAILQ_FOREACH(se,&savevm_handlers, entry) { >> + int len; >> + >> + if (se->save_live_state == NULL) >> + continue; >> + >> + /* Section type */ >> + qemu_put_byte(f, QEMU_VM_SECTION_START); >> + qemu_put_be32(f, se->section_id); >> + >> + /* ID string */ >> + len = strlen(se->idstr); >> + qemu_put_byte(f, len); >> + qemu_put_buffer(f, (uint8_t *)se->idstr, len); >> + >> + qemu_put_be32(f, se->instance_id); >> + qemu_put_be32(f, se->version_id); >> + if (ft_mode == FT_INIT) { >> + /* This is workaround. */ >> + se->save_live_state(mon, f, QEMU_VM_SECTION_START, se->opaque); >> + } else { >> + se->save_live_state(mon, f, QEMU_VM_SECTION_PART, se->opaque); >> + } >> + } >> + >> + ft_mode = FT_TRANSACTION; >> + QTAILQ_FOREACH(se,&savevm_handlers, entry) { >> + int len; >> + >> + if (se->save_state == NULL&& se->vmsd == NULL) >> + continue; >> + >> + /* Section type */ >> + qemu_put_byte(f, QEMU_VM_SECTION_FULL); >> + qemu_put_be32(f, se->section_id); >> + >> + /* ID string */ >> + len = strlen(se->idstr); >> + qemu_put_byte(f, len); >> + qemu_put_buffer(f, (uint8_t *)se->idstr, len); >> + >> + qemu_put_be32(f, se->instance_id); >> + qemu_put_be32(f, se->version_id); >> + >> + vmstate_save(f, se); >> + } >> + >> + qemu_put_byte(f, QEMU_VM_EOF); >> + >> + if (qemu_file_has_error(f)) >> + return -EIO; >> + >> + return 0; >> +} >> + >> + >> void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f) >> { >> SaveStateEntry *se; >> @@ -1617,6 +1685,10 @@ int qemu_loadvm_state(QEMUFile *f, int >> skip_header) >> if (v != QEMU_VM_FILE_VERSION) >> return -ENOTSUP; >> >> + v = qemu_get_be32(f); >> + if (v == QEMU_VM_FT_MODE) { >> + ft_mode = FT_INIT; >> + } >> } >> >> while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) { >> diff --git a/sysemu.h b/sysemu.h >> index 6c1441f..df314bb 100644 >> --- a/sysemu.h >> +++ b/sysemu.h >> @@ -67,6 +67,7 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile >> *f, int blk_enable, >> int shared); >> int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f); >> int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f); >> +int qemu_savevm_state_all(Monitor *mon, QEMUFile *f); >> void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f); >> int qemu_loadvm_state(QEMUFile *f, int skip_header); >> > > > >
diff --git a/savevm.c b/savevm.c index 292ae32..19b3efb 100644 --- a/savevm.c +++ b/savevm.c @@ -1402,8 +1402,10 @@ static void vmstate_save(QEMUFile *f, SaveStateEntry *se) } #define QEMU_VM_FILE_MAGIC 0x5145564d -#define QEMU_VM_FILE_VERSION_COMPAT 0x00000002 -#define QEMU_VM_FILE_VERSION 0x00000003 +#define QEMU_VM_FILE_VERSION_COMPAT 0x00000003 +#define QEMU_VM_FILE_VERSION 0x00000004 +#define QEMU_VM_LIVE_MIGRATION_MODE 0x00000005 +#define QEMU_VM_FT_MODE 0x00000006 #define QEMU_VM_EOF 0x00 #define QEMU_VM_SECTION_START 0x01 @@ -1425,6 +1427,12 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable, qemu_put_be32(f, QEMU_VM_FILE_MAGIC); qemu_put_be32(f, QEMU_VM_FILE_VERSION); + + if (ft_mode) { + qemu_put_be32(f, QEMU_VM_FT_MODE); + } else { + qemu_put_be32(f, QEMU_VM_LIVE_MIGRATION_MODE); + } QTAILQ_FOREACH(se, &savevm_handlers, entry) { int len; @@ -1533,6 +1541,66 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f) return 0; } +int qemu_savevm_state_all(Monitor *mon, QEMUFile *f) +{ + SaveStateEntry *se; + + QTAILQ_FOREACH(se, &savevm_handlers, entry) { + int len; + + if (se->save_live_state == NULL) + continue; + + /* Section type */ + qemu_put_byte(f, QEMU_VM_SECTION_START); + qemu_put_be32(f, se->section_id); + + /* ID string */ + len = strlen(se->idstr); + qemu_put_byte(f, len); + qemu_put_buffer(f, (uint8_t *)se->idstr, len); + + qemu_put_be32(f, se->instance_id); + qemu_put_be32(f, se->version_id); + if (ft_mode == FT_INIT) { + /* This is workaround. */ + se->save_live_state(mon, f, QEMU_VM_SECTION_START, se->opaque); + } else { + se->save_live_state(mon, f, QEMU_VM_SECTION_PART, se->opaque); + } + } + + ft_mode = FT_TRANSACTION; + QTAILQ_FOREACH(se, &savevm_handlers, entry) { + int len; + + if (se->save_state == NULL && se->vmsd == NULL) + continue; + + /* Section type */ + qemu_put_byte(f, QEMU_VM_SECTION_FULL); + qemu_put_be32(f, se->section_id); + + /* ID string */ + len = strlen(se->idstr); + qemu_put_byte(f, len); + qemu_put_buffer(f, (uint8_t *)se->idstr, len); + + qemu_put_be32(f, se->instance_id); + qemu_put_be32(f, se->version_id); + + vmstate_save(f, se); + } + + qemu_put_byte(f, QEMU_VM_EOF); + + if (qemu_file_has_error(f)) + return -EIO; + + return 0; +} + + void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f) { SaveStateEntry *se; @@ -1617,6 +1685,10 @@ int qemu_loadvm_state(QEMUFile *f, int skip_header) if (v != QEMU_VM_FILE_VERSION) return -ENOTSUP; + v = qemu_get_be32(f); + if (v == QEMU_VM_FT_MODE) { + ft_mode = FT_INIT; + } } while ((section_type = qemu_get_byte(f)) != QEMU_VM_EOF) { diff --git a/sysemu.h b/sysemu.h index 6c1441f..df314bb 100644 --- a/sysemu.h +++ b/sysemu.h @@ -67,6 +67,7 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, int blk_enable, int shared); int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f); int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f); +int qemu_savevm_state_all(Monitor *mon, QEMUFile *f); void qemu_savevm_state_cancel(Monitor *mon, QEMUFile *f); int qemu_loadvm_state(QEMUFile *f, int skip_header);
Make a 32bit entry after QEMU_VM_FILE_VERSION to recognize whether the transfered data is QEMU_VM_FT_MODE or QEMU_VM_LIVE_MIGRATION_MODE. Signed-off-by: Yoshiaki Tamura <tamura.yoshiaki@lab.ntt.co.jp> --- savevm.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- sysemu.h | 1 + 2 files changed, 75 insertions(+), 2 deletions(-)