From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:38731) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T7MpG-0002VL-CE for qemu-devel@nongnu.org; Fri, 31 Aug 2012 04:43:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1T7MpF-0004B6-7k for qemu-devel@nongnu.org; Fri, 31 Aug 2012 04:43:38 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54113) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1T7MpE-0004B2-Vz for qemu-devel@nongnu.org; Fri, 31 Aug 2012 04:43:37 -0400 Date: Fri, 31 Aug 2012 11:44:54 +0300 From: "Michael S. Tsirkin" Message-ID: <20120831084454.GB24072@redhat.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Subject: Re: [Qemu-devel] [PATCH 1/2] pcie: drop version_id field for live migration List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Jason Baron Cc: yamahata@valinux.co.jp, alex.williamson@redhat.com, jan.kiszka@siemens.com, qemu-devel@nongnu.org, quintela@redhat.com On Thu, Aug 30, 2012 at 01:51:10PM -0400, Jason Baron wrote: > While testing q35 live migration, I found that the migration would abort with > the following error: "Unknown savevm section type 76". > > The error is due to this check failing in 'vmstate_load_state()': > > while(field->name) { > if ((field->field_exists && > field->field_exists(opaque, version_id)) || > (!field->field_exists && > field->version_id <= version_id)) { > > The VMSTATE_PCIE_DEVICE() currently has a 'version_id' set to 2. However, > 'version_id' in the above check is 1. And thus we fail to load the pcie device > field. Further the code returns to 'qemu_loadvm_state()' which produces the > error that I saw. > > I'm proposing to fix this by simply dropping the 'version_id' field from > VMSTATE_PCIE_DEVICE(). VMSTATE_PCI_DEVICE() defines no such field and further > the vmstate_pcie_device that VMSTATE_PCI_DEVICE() refers to is already > versioned. Thus, any versioning issues could be detected at the vmsd level. > > Taking a step back, I think that the 'field->version_id' should be compared > against a saved version number for the field not the 'version_id'. Futhermore, > once vmstate_load_state() is called recursively on another vmsd, the check of: > > if (version_id > vmsd->version_id) { > return -EINVAL; > } > > Will never fail since version_id is always equal to vmsd->version_id. So I'm > wondering why we aren't storing the vmsd version id of the source in the > migration stream? > > This patch also renames the 'name' field of vmstate_pcie_device from: > PCIDevice -> PCIEDevice to differentiate it from vmstate_pci_device. > > Signed-off-by: Jason Baron I have this queued to apply already - this is just a repost or did I miss something? I have no idea about the larger issues - Juan? > --- > hw/pci.c | 2 +- > hw/pcie.h | 1 - > 2 files changed, 1 insertions(+), 2 deletions(-) > > diff --git a/hw/pci.c b/hw/pci.c > index 3727afa..5386a4f 100644 > --- a/hw/pci.c > +++ b/hw/pci.c > @@ -439,7 +439,7 @@ const VMStateDescription vmstate_pci_device = { > }; > > const VMStateDescription vmstate_pcie_device = { > - .name = "PCIDevice", > + .name = "PCIEDevice", > .version_id = 2, > .minimum_version_id = 1, > .minimum_version_id_old = 1, > diff --git a/hw/pcie.h b/hw/pcie.h > index b8ab0c7..4889194 100644 > --- a/hw/pcie.h > +++ b/hw/pcie.h > @@ -133,7 +133,6 @@ extern const VMStateDescription vmstate_pcie_device; > > #define VMSTATE_PCIE_DEVICE(_field, _state) { \ > .name = (stringify(_field)), \ > - .version_id = 2, \ > .size = sizeof(PCIDevice), \ > .vmsd = &vmstate_pcie_device, \ > .flags = VMS_STRUCT, \ > -- > 1.7.1