From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58130) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anOhA-0000gr-DU for qemu-devel@nongnu.org; Tue, 05 Apr 2016 06:58:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1anOh7-0004i0-3q for qemu-devel@nongnu.org; Tue, 05 Apr 2016 06:58:52 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42031) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anOh6-0004hv-UK for qemu-devel@nongnu.org; Tue, 05 Apr 2016 06:58:49 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4412B8F505 for ; Tue, 5 Apr 2016 10:58:48 +0000 (UTC) References: <20160401175819.GK2242@work-vm> <570244B3.4070105@redhat.com> <20160405104813.GB2242@work-vm> From: Laszlo Ersek Message-ID: <57039A66.6060808@redhat.com> Date: Tue, 5 Apr 2016 12:58:46 +0200 MIME-Version: 1.0 In-Reply-To: <20160405104813.GB2242@work-vm> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] efi var store migration assert (bdrv_co_do_pwritev: Assertion `!(bs->open_flags & 0x0800)' failed.) List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Dr. David Alan Gilbert" , Paolo Bonzini Cc: kwolf@redhat.com, jsnow@redhat.com, qemu-devel@nongnu.org On 04/05/16 12:48, Dr. David Alan Gilbert wrote: > * Paolo Bonzini (pbonzini@redhat.com) wrote: >> >> >> On 01/04/2016 19:58, Dr. David Alan Gilbert wrote: >>> In the continuing journeys of trying to migrate a q35 guest with ovmf, >>> I've just hit this assert: >>> >>> qemu-system-x86_64: /root/git/qemu/block/io.c:1297: bdrv_co_do_pwritev: Assertion `!(bs->open_flags & 0x0800)' failed. >>> >>> This is just ahead of rc0 - 1458317c8ada834cf39287f6d11a8cb8a37360d6 from yesterday. >> >> Try this... > > Well, migration survives; how do I test if pflash is sane after migration? You can run sha1sum before / after. The varstore is expected to change only when the UEFI variable servies are exercised. So, if you boot e.g. a Linux guest to a login prompt on the source host, checksum the varstore, then migrate the guest, then verify the checksum on the target host (or, well, shared storage, if you have set it up), it should match. Thanks Laszlo > > Dave > >> Paolo >> >> diff --git a/hw/block/pflash_cfi01.c b/hw/block/pflash_cfi01.c >> index c475c2a..e96a7b0 100644 >> --- a/hw/block/pflash_cfi01.c >> +++ b/hw/block/pflash_cfi01.c >> @@ -46,6 +46,7 @@ >> #include "exec/address-spaces.h" >> #include "qemu/host-utils.h" >> #include "hw/sysbus.h" >> +#include "sysemu/sysemu.h" >> >> #define PFLASH_BUG(fmt, ...) \ >> do { \ >> @@ -97,6 +98,7 @@ struct pflash_t { >> MemoryRegion mem; >> char *name; >> void *storage; >> + VMChangeStateEntry *vmstate; >> }; >> >> static int pflash_post_load(void *opaque, int version_id); >> @@ -944,13 +946,24 @@ MemoryRegion *pflash_cfi01_get_memory(pflash_t *fl) >> return &fl->mem; >> } >> >> +static void postload_update_cb(void *opaque, int running, RunState state) >> +{ >> + pflash_t *pfl = opaque; >> + >> + /* This is called after bdrv_invalidate_cache_all. */ >> + qemu_del_vm_change_state_handler(pfl->vmstate); >> + pfl->vmstate = NULL; >> + >> + DPRINTF("%s: updating bdrv for %s\n", __func__, pfl->name); >> + pflash_update(pfl, 0, pfl->sector_len * pfl->nb_blocs); >> +} >> + >> static int pflash_post_load(void *opaque, int version_id) >> { >> pflash_t *pfl = opaque; >> >> if (!pfl->ro) { >> - DPRINTF("%s: updating bdrv for %s\n", __func__, pfl->name); >> - pflash_update(pfl, 0, pfl->sector_len * pfl->nb_blocs); >> + pfl->vmstate = qemu_add_vm_change_state_handler(postload_update_cb, pfl); >> } >> return 0; >> } > -- > Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK >