2010/6/24 Alex Williamson <alex.william...@redhat.com>: > 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,
Hi Alex, Is there additional overhead to save rams introduce by this series? If so, how much? Thanks, Yoshi > > 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(-) > > >