mirror_qemu/hw/block
Laszlo Ersek 4c0cfc72b3 pflash_cfi01: write flash contents to bdrv on incoming migration
A drive that backs a pflash device is special:
- it is very small,
- its entire contents are kept in a RAMBlock at all times, covering the
  guest-phys address range that provides the guest's view of the emulated
  flash chip.

The pflash device model keeps the drive (the host-side file) and the
guest-visible flash contents in sync. When migrating the guest, the
guest-visible flash contents (the RAMBlock) is migrated by default, but on
the target host, the drive (the host-side file) remains in full sync with
the RAMBlock only if:
- the source and target hosts share the storage underlying the pflash
  drive,
- or the migration requests full or incremental block migration too, which
  then covers all drives.

Due to the special nature of pflash drives, the following scenario makes
sense as well:
- no full nor incremental block migration, covering all drives, alongside
  the base migration (justified eg. by shared storage for "normal" (big)
  drives),
- non-shared storage for pflash drives.

In this case, currently only those portions of the flash drive are updated
on the target disk that the guest reprograms while running on the target
host.

In order to restore accord, dump the entire flash contents to the bdrv in
a post_load() callback.

- The read-only check follows the other call-sites of pflash_update();
- both "pfl->ro" and pflash_update() reflect / consider the case when
  "pfl->bs" is NULL;
- the total size of the flash device is calculated as in
  pflash_cfi01_realize().

When using shared storage, or requesting full or incremental block
migration along with the normal migration, the patch should incur a
harmless rewrite from the target side.

It is assumed that, on the target host, RAM is loaded ahead of the call to
pflash_post_load().

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
2014-09-08 11:12:43 +01:00
..
dataplane virtio-blk: allow drive_del with dataplane 2014-08-29 16:01:48 +01:00
Makefile.objs pc_sysfw: do not make it a device anymore 2013-08-12 09:31:14 -05:00
block.c block: Pass errp in blkconf_geometry 2014-08-26 13:20:44 +02:00
cdrom.c bswap.h: Remove cpu_to_be32wu() 2013-11-05 19:57:47 -08:00
ecc.c savevm: Remove all the unneeded version_minimum_id_old (arm) 2014-05-13 16:09:35 +01:00
fdc.c savevm: Remove all the unneeded version_minimum_id_old (x86) 2014-06-16 04:55:26 +02:00
hd-geometry.c hw: move target-independent files to subdirectories 2013-04-08 18:13:12 +02:00
m25p80.c block: m25p80: Support read only bdrvs. 2014-06-21 16:40:14 +08:00
nand.c savevm: Remove all the unneeded version_minimum_id_old (arm) 2014-05-13 16:09:35 +01:00
nvme.c block: Use g_new() & friends to avoid multiplying sizes 2014-08-20 11:51:28 +02:00
nvme.h NVMe: Initial commit for new storage interface 2013-06-17 17:47:59 +02:00
onenand.c block: Drop superfluous conditionals around g_free() 2014-06-16 17:23:19 +08:00
pflash_cfi01.c pflash_cfi01: write flash contents to bdrv on incoming migration 2014-09-08 11:12:43 +01:00
pflash_cfi02.c memory: remove memory_region_destroy 2014-08-18 12:06:21 +02:00
tc58128.c shix: Don't require firmware presence for qtest 2013-11-05 17:47:29 +01:00
virtio-blk.c SCSI patches include bug fixes from Fam and Peter, improved error 2014-08-28 17:08:13 +01:00
xen_blkif.h xen_disk: add discard support 2014-05-07 16:18:04 +00:00
xen_disk.c xen_disk: fix possible null-ptr dereference 2014-08-15 15:07:13 +02:00