On 31/10/2014 17:38, Igor Mammedov wrote: > check amount of available KVM memory slots after all > devices were initialized and exit with error if > there isn't enough free memory slots for DIMMs. > > Signed-off-by: Igor Mammedov <imamm...@redhat.com> > --- > hw/i386/pc.c | 32 ++++++++++++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > index f6dfd9b..41d91fb 100644 > --- a/hw/i386/pc.c > +++ b/hw/i386/pc.c > @@ -1125,6 +1125,36 @@ PcGuestInfo *pc_guest_info_init(ram_addr_t > below_4g_mem_size, > return guest_info; > } > > +static int pc_dimm_count(Object *obj, void *opaque) > +{ > + int *count = opaque; > + > + if (object_dynamic_cast(obj, TYPE_PC_DIMM)) { > + (*count)++; > + } > + > + object_child_foreach(obj, pc_dimm_count, opaque); > + return 0; > +} > + > +static void pc_kvm_slot_check(Notifier *notifier, void *data) > +{ > + MachineState *ms = MACHINE(qdev_get_machine()); > + int free_slots = kvm_free_slot_count(ms); > + int used_ram_slots = 0; > + > + pc_dimm_count(OBJECT(ms), &used_ram_slots); > + if ((ms->ram_slots - used_ram_slots) > free_slots) { > + error_report("KVM doesn't support more than %d memory slots", > + kvm_free_slot_count(ms)); > + exit(EXIT_FAILURE); > + } > +} > + > +static Notifier kvm_slot_check_on_machine_done = { > + .notify = pc_kvm_slot_check > + }; > + > /* setup pci memory address space mapping into system address space */ > void pc_pci_as_mapping_init(Object *owner, MemoryRegion *system_memory, > MemoryRegion *pci_address_space) > @@ -1269,6 +1299,8 @@ FWCfgState *pc_memory_init(MachineState *machine, > "hotplug-memory", hotplug_mem_size); > memory_region_add_subregion(system_memory, pcms->hotplug_memory_base, > &pcms->hotplug_memory); > + > + qemu_add_machine_init_done_notifier(&kvm_slot_check_on_machine_done); > } > > /* Initialize PC system firmware */ >
This will always be off by 4 or so due to system RAM and ROM slots. I think patch 1 is enough. Paolo