[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 00/15] Make migration work with hotplug
From: |
Alex Williamson |
Subject: |
[Qemu-devel] [PATCH 00/15] Make migration work with hotplug |
Date: |
Wed, 23 Jun 2010 22:40:47 -0600 |
User-agent: |
StGIT/0.14.3 |
Ok, new approach. I'm going to attempt to extract myself for the
canonical device path approach, because we're missing too many pieces
to make that work. Instead, I'll take Anthony's advice and try to
simplify. We still want a unique name for ramblocks and savevm, but
the hotplug problem today is only for PCI devices. PCI conveniently
has globally unique, dare I say canonical, addressing in the form of
<domain>:<bus>:<device>.<func>. To get to this, let's add a new
function on the BusInfo structure called get_dev_path(). For a PCI
device, we can simply traverse up the qdev tree to the BusInfo
structure, look for the function, and call it to return a global PCI
address.
For some buses, these functions could chain up to their parent bus
appending strings together to get a unique path. An example would be
USB, where the USB port number may not be unique. If we traverse up
to the PCI device providing USB, and then to the PCI bus, we get a
globally unique PCI path, appended with a USB port number.
To make this work for ramblocks and savevm, we need a DeviceState
pointer when the they are create/registered, and we need a caller
provided context in case there are multiple ramblocks/savevm
associated with a device. Savevm already provies the context,
and I've attempted to make reasonable guesses at these for the
ramblocks. Note that most of the ramblocks aren't associated with
a device, so I don't think it makes sense to link savevm and
ramblocks together with the same absolute id string.
Once we have savevm with unique id strings, rather than hotplug
unfriendly instance numbers, we can be sure that the right driver
instance is loading the correct vmstate. I've also implemented
a compat field for this, so we can still accept incoming migrations
from previous versions.
Once we have ramblocks with a unique id string, we can switch to
using id + offset for migration, which enables a ram_addr_t space
that supports gaps, which enables us to implement qemu_ram_free().
With that, I think we can finally do migrations reliable after
hotplug! Note that the target VM still needs to be created to
match the current devices and bus addresses of the source VM. We
can also still maintain compatibility for migrations here by bumping
the ram migration version and supporting both new and old (just
hope the source hasn't done any hotplugs).
Sound reasonable? Is get_dev_path the right name? In the right
place? The PCI return is currently "dddd:bb:dd.f", should this be
"PCI:dddd:bb:dd.f"? Something else? Thanks,
Alex
---
Alex Williamson (15):
ramblocks: No more being lazy about duplicate names
pci: Free the space allocated for the option rom on removal
qemu_ram_free: Implement it
savevm: Create a new continue flag to avoid resending block name
savevm: Use RAM blocks for basis of migration
savevm: Migrate RAM based on name/offset
ramblocks: Make use of DeviceState pointer and BusInfo.get_dev_path
qemu_ram_alloc: Add DeviceState and name parameters
virtio-net: Incorporate a DeviceState pointer and let savevm track
instances
eepro100: Add a dev field to eeprom new/free functions
savevm: Make use of DeviceState
savevm: Add DeviceState param
pci: Implement BusInfo.get_dev_path()
qdev: Add a get_dev_path() function to BusInfo
Remove uses of ram.last_offset (aka last_ram_offset)
arch_init.c | 183 +++++++++++++++++++++++++++++++++++------
audio/audio.c | 2
block-migration.c | 4 -
cpu-all.h | 5 +
cpu-common.h | 2
exec.c | 96 +++++++++++++++++++---
hw/adb.c | 4 -
hw/ads7846.c | 2
hw/an5206.c | 4 -
hw/arm_gic.c | 2
hw/arm_timer.c | 4 -
hw/armv7m.c | 9 +-
hw/armv7m_nvic.c | 2
hw/axis_dev88.c | 4 -
hw/cirrus_vga.c | 2
hw/cuda.c | 2
hw/dma.c | 4 -
hw/dummy_m68k.c | 2
hw/eepro100.c | 8 +-
hw/eeprom93xx.c | 8 +-
hw/eeprom93xx.h | 4 -
hw/etraxfs.c | 6 +
hw/fw_cfg.c | 2
hw/g364fb.c | 4 -
hw/grackle_pci.c | 4 -
hw/gt64xxx.c | 3 -
hw/gumstix.c | 6 +
hw/heathrow_pic.c | 2
hw/hw.h | 18 ++--
hw/i2c.c | 2
hw/i8254.c | 2
hw/i8259.c | 2
hw/ide/cmd646.c | 2
hw/ide/isa.c | 2
hw/ide/macio.c | 2
hw/ide/microdrive.c | 2
hw/ide/mmio.c | 2
hw/ide/piix.c | 2
hw/integratorcp.c | 4 -
hw/m48t59.c | 2
hw/mac_dbdma.c | 2
hw/mac_nvram.c | 4 -
hw/mainstone.c | 6 +
hw/max111x.c | 3 -
hw/mcf5208.c | 4 -
hw/mips_jazz.c | 4 -
hw/mips_malta.c | 4 -
hw/mips_mipssim.c | 4 -
hw/mips_r4k.c | 6 +
hw/mipsnet.c | 4 -
hw/mst_fpga.c | 3 -
hw/musicpal.c | 11 ++
hw/nand.c | 2
hw/omap1.c | 6 +
hw/omap2.c | 6 +
hw/omap_sx1.c | 12 ++-
hw/onenand.c | 2
hw/openpic.c | 5 +
hw/palm.c | 3 -
hw/pc.c | 8 +-
hw/pci.c | 34 +++++++-
hw/pckbd.c | 2
hw/petalogix_s3adsp1800_mmu.c | 7 +-
hw/piix4.c | 2
hw/pl011.c | 2
hw/pl022.c | 2
hw/pl061.c | 2
hw/ppc405_boards.c | 18 ++--
hw/ppc405_uc.c | 2
hw/ppc4xx_devs.c | 4 +
hw/ppc4xx_pci.c | 4 -
hw/ppc_newworld.c | 6 +
hw/ppc_oldworld.c | 6 +
hw/ppc_prep.c | 4 -
hw/ppce500_mpc8544ds.c | 3 -
hw/ppce500_pci.c | 4 -
hw/ps2.c | 4 -
hw/pxa2xx.c | 39 +++++----
hw/pxa2xx_dma.c | 2
hw/pxa2xx_gpio.c | 2
hw/pxa2xx_keypad.c | 2
hw/pxa2xx_lcd.c | 2
hw/pxa2xx_mmci.c | 2
hw/pxa2xx_pic.c | 3 -
hw/pxa2xx_timer.c | 2
hw/qdev.c | 4 -
hw/qdev.h | 3 +
hw/r2d.c | 4 -
hw/rc4030.c | 2
hw/realview.c | 6 +
hw/s390-virtio.c | 2
hw/serial.c | 4 -
hw/sm501.c | 2
hw/spitz.c | 11 +-
hw/ssd0323.c | 3 -
hw/ssi-sd.c | 2
hw/stellaris.c | 11 +-
hw/stellaris_enet.c | 4 -
hw/stellaris_input.c | 2
hw/sun4m.c | 8 +-
hw/sun4u.c | 4 -
hw/syborg.c | 2
hw/syborg_fb.c | 2
hw/syborg_interrupt.c | 3 -
hw/syborg_keyboard.c | 2
hw/syborg_pointer.c | 2
hw/syborg_rtc.c | 3 -
hw/syborg_serial.c | 2
hw/syborg_timer.c | 2
hw/tc6393xb.c | 2
hw/tcx.c | 2
hw/tosa.c | 2
hw/tsc2005.c | 2
hw/tsc210x.c | 4 -
hw/unin_pci.c | 6 +
hw/versatilepb.c | 2
hw/vga-isa-mm.c | 2
hw/vga-isa.c | 2
hw/vga.c | 2
hw/virtio-balloon.c | 3 -
hw/virtio-blk.c | 2
hw/virtio-net.c | 7 +-
hw/virtio-serial-bus.c | 2
hw/vmmouse.c | 2
hw/vmware_vga.c | 4 -
hw/zaurus.c | 2
qemu-timer.c | 2
savevm.c | 106 +++++++++++++++++++++---
slirp/slirp.c | 5 +
vl.c | 2
130 files changed, 648 insertions(+), 286 deletions(-)
- [Qemu-devel] [PATCH 00/15] Make migration work with hotplug,
Alex Williamson <=
- [Qemu-devel] [PATCH 01/15] Remove uses of ram.last_offset (aka last_ram_offset), Alex Williamson, 2010/06/24
- [Qemu-devel] [PATCH 02/15] qdev: Add a get_dev_path() function to BusInfo, Alex Williamson, 2010/06/24
- [Qemu-devel] [PATCH 03/15] pci: Implement BusInfo.get_dev_path(), Alex Williamson, 2010/06/24
- [Qemu-devel] [PATCH 04/15] savevm: Add DeviceState param, Alex Williamson, 2010/06/24
- [Qemu-devel] [PATCH 05/15] savevm: Make use of DeviceState, Alex Williamson, 2010/06/24
- [Qemu-devel] [PATCH 06/15] eepro100: Add a dev field to eeprom new/free functions, Alex Williamson, 2010/06/24
- [Qemu-devel] [PATCH 07/15] virtio-net: Incorporate a DeviceState pointer and let savevm track instances, Alex Williamson, 2010/06/24
- [Qemu-devel] [PATCH 08/15] qemu_ram_alloc: Add DeviceState and name parameters, Alex Williamson, 2010/06/24