From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [PATCH RFC] Mark a device as non-migratable Date: Tue, 15 Jun 2010 11:32:28 -0500 Message-ID: <4C17AB1C.7010701@codemonkey.ws> References: <4C16558A.5010005@codemonkey.ws> <1276618603-24184-1-git-send-email-cam@cs.ualberta.ca> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org To: Cam Macdonell Return-path: Received: from mail-gw0-f46.google.com ([74.125.83.46]:32864 "EHLO mail-gw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753958Ab0FOQcQ (ORCPT ); Tue, 15 Jun 2010 12:32:16 -0400 Received: by gwj15 with SMTP id 15so3338052gwj.19 for ; Tue, 15 Jun 2010 09:32:15 -0700 (PDT) In-Reply-To: <1276618603-24184-1-git-send-email-cam@cs.ualberta.ca> Sender: kvm-owner@vger.kernel.org List-ID: On 06/15/2010 11:16 AM, Cam Macdonell wrote: > How does this look for marking the device as non-migratable? It adds a field > 'no_migrate' to the SaveStateEntry and tests for it in vmstate_save. This would > replace anything that touches memory. > > Cam > > --- > hw/hw.h | 1 + > savevm.c | 32 +++++++++++++++++++++++++++++--- > 2 files changed, 30 insertions(+), 3 deletions(-) > > diff --git a/hw/hw.h b/hw/hw.h > index d78d814..7c93f08 100644 > --- a/hw/hw.h > +++ b/hw/hw.h > @@ -263,6 +263,7 @@ int register_savevm_live(const char *idstr, > void *opaque); > > void unregister_savevm(const char *idstr, void *opaque); > +void mark_no_migrate(const char *idstr, void *opaque); > I'm not thrilled with the name but the functionality is spot on. I lack the creativity to offer a better name suggestion :-) Regards, Anthony Liguori > typedef void QEMUResetHandler(void *opaque); > > diff --git a/savevm.c b/savevm.c > index 017695b..2642a9c 100644 > --- a/savevm.c > +++ b/savevm.c > @@ -1023,6 +1023,7 @@ typedef struct SaveStateEntry { > LoadStateHandler *load_state; > const VMStateDescription *vmsd; > void *opaque; > + int no_migrate; > } SaveStateEntry; > > > @@ -1069,6 +1070,7 @@ int register_savevm_live(const char *idstr, > se->load_state = load_state; > se->opaque = opaque; > se->vmsd = NULL; > + se->no_migrate = 0; > > if (instance_id == -1) { > se->instance_id = calculate_new_instance_id(idstr); > @@ -1103,6 +1105,19 @@ void unregister_savevm(const char *idstr, void *opaque) > } > } > > +/* mark a device as not to be migrated, that is the device should be > + unplugged before migration */ > +void mark_no_migrate(const char *idstr, void *opaque) > +{ > + SaveStateEntry *se; > + > + QTAILQ_FOREACH(se,&savevm_handlers, entry) { > + if (strcmp(se->idstr, idstr) == 0&& se->opaque == opaque) { > + se->no_migrate = 1; > + } > + } > +} > + > int vmstate_register_with_alias_id(int instance_id, > const VMStateDescription *vmsd, > void *opaque, int alias_id, > @@ -1277,13 +1292,19 @@ static int vmstate_load(QEMUFile *f, SaveStateEntry *se, int version_id) > return vmstate_load_state(f, se->vmsd, se->opaque, version_id); > } > > -static void vmstate_save(QEMUFile *f, SaveStateEntry *se) > +static int vmstate_save(QEMUFile *f, SaveStateEntry *se) > { > + if (se->no_migrate) { > + return -1; > + } > + > if (!se->vmsd) { /* Old style */ > se->save_state(f, se->opaque); > - return; > + return 0; > } > vmstate_save_state(f,se->vmsd, se->opaque); > + > + return 0; > } > > #define QEMU_VM_FILE_MAGIC 0x5145564d > @@ -1377,6 +1398,7 @@ int qemu_savevm_state_iterate(Monitor *mon, QEMUFile *f) > int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f) > { > SaveStateEntry *se; > + int r; > > cpu_synchronize_all_states(); > > @@ -1409,7 +1431,11 @@ int qemu_savevm_state_complete(Monitor *mon, QEMUFile *f) > qemu_put_be32(f, se->instance_id); > qemu_put_be32(f, se->version_id); > > - vmstate_save(f, se); > + r = vmstate_save(f, se); > + if (r< 0) { > + monitor_printf(mon, "cannot migrate with device '%s'\n", se->idstr); > + return r; > + } > } > > qemu_put_byte(f, QEMU_VM_EOF); >