From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=43907 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OOZ3l-0000Ng-JP for qemu-devel@nongnu.org; Tue, 15 Jun 2010 12:32:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OOZ3k-0000BO-9H for qemu-devel@nongnu.org; Tue, 15 Jun 2010 12:32:21 -0400 Received: from mail-vw0-f45.google.com ([209.85.212.45]:64629) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OOZ3k-0000BF-1C for qemu-devel@nongnu.org; Tue, 15 Jun 2010 12:32:20 -0400 Received: by vws17 with SMTP id 17so1567755vws.4 for ; Tue, 15 Jun 2010 09:32:19 -0700 (PDT) Message-ID: <4C17AB1C.7010701@codemonkey.ws> Date: Tue, 15 Jun 2010 11:32:28 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <4C16558A.5010005@codemonkey.ws> <1276618603-24184-1-git-send-email-cam@cs.ualberta.ca> In-Reply-To: <1276618603-24184-1-git-send-email-cam@cs.ualberta.ca> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH RFC] Mark a device as non-migratable List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Cam Macdonell Cc: qemu-devel@nongnu.org, kvm@vger.kernel.org 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); >