diff mbox

efi var store migration assert (bdrv_co_do_pwritev: Assertion `!(bs->open_flags & 0x0800)' failed.)

Message ID 570244B3.4070105@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Paolo Bonzini April 4, 2016, 10:40 a.m. UTC
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...

Paolo

Comments

Dr. David Alan Gilbert April 5, 2016, 10:48 a.m. UTC | #1
* 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?

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
Laszlo Ersek April 5, 2016, 10:58 a.m. UTC | #2
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
>
Dr. David Alan Gilbert April 5, 2016, 11:25 a.m. UTC | #3
* Laszlo Ersek (lersek@redhat.com) wrote:
> 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.

OK, yes that works; and I also tried using efibootmgr to tweak the timeout,
seeing that the sha changed and then check the sha was correct again after
migration.

Dave

> 
> 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
> > 
> 
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
Laszlo Ersek April 5, 2016, 11:34 a.m. UTC | #4
On 04/05/16 13:25, Dr. David Alan Gilbert wrote:
> * Laszlo Ersek (lersek@redhat.com) wrote:
>> 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.
> 
> OK, yes that works; and I also tried using efibootmgr to tweak the timeout,
> seeing that the sha changed and then check the sha was correct again after
> migration.

Thank you both for fixing up the buggy-on-arrival code I had added.
Laszlo
Paolo Bonzini April 5, 2016, 1:06 p.m. UTC | #5
On 05/04/2016 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?

Use "-S" on the destination and check if the file has the same contents.

Paolo

> 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
>
Peter Maydell April 14, 2016, 3:30 p.m. UTC | #6
On 4 April 2016 at 11:40, 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...

Hi Paolo -- this bug is on the list of "things we should probably
fix for 2.6", but your fix below doesn't have your Signed-off-by
line. Were you planning to send this as a proper patch, or could
you provide an s-o-b line so somebody else (David?) can take the
code and clean it up into an actual patch?

thanks
-- PMM

>
> 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;
>  }
Paolo Bonzini April 15, 2016, 10:49 a.m. UTC | #7
On 14/04/2016 17:30, Peter Maydell wrote:
> On 4 April 2016 at 11:40, 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...
> 
> Hi Paolo -- this bug is on the list of "things we should probably
> fix for 2.6", but your fix below doesn't have your Signed-off-by
> line. Were you planning to send this as a proper patch, or could
> you provide an s-o-b line so somebody else (David?) can take the
> code and clean it up into an actual patch?

Indeed. I had sent the S-o-b to David, but that was a private email so

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Thanks,

Paolo

> thanks
> -- PMM
> 
>>
>> 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;
>>  }
diff mbox

Patch

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;
 }