From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:37345) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UUf6X-0001SE-87 for qemu-devel@nongnu.org; Tue, 23 Apr 2013 11:26:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UUf6V-0003M1-P0 for qemu-devel@nongnu.org; Tue, 23 Apr 2013 11:26:01 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46444) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UUf6V-0003Lu-Ga for qemu-devel@nongnu.org; Tue, 23 Apr 2013 11:25:59 -0400 From: Juan Quintela In-Reply-To: <20130423145416.0253832c@nial.usersys.redhat.com> (Igor Mammedov's message of "Tue, 23 Apr 2013 14:54:16 +0200") References: <1366705795-24732-1-git-send-email-imammedo@redhat.com> <1366705795-24732-11-git-send-email-imammedo@redhat.com> <877gjtwk7x.fsf@elfo.elfo> <20130423145416.0253832c@nial.usersys.redhat.com> Date: Tue, 23 Apr 2013 17:25:50 +0200 Message-ID: <87haixuv41.fsf@elfo.elfo> MIME-Version: 1.0 Content-Type: text/plain Subject: Re: [Qemu-devel] [PATCH 10/21] acpi_piix4: add infrastructure to send CPU hot-plug GPE to guest Reply-To: quintela@redhat.com List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Igor Mammedov Cc: kwolf@redhat.com, peter.maydell@linaro.org, aliguori@us.ibm.com, ehabkost@redhat.com, gleb@redhat.com, mst@redhat.com, jan.kiszka@siemens.com, stefano.stabellini@eu.citrix.com, claudio.fontana@huawei.com, qemu-devel@nongnu.org, aderumier@odiso.com, lcapitulino@redhat.com, blauwirbel@gmail.com, anthony.perard@citrix.com, alex.williamson@redhat.com, kraxel@redhat.com, yang.z.zhang@intel.com, pbonzini@redhat.com, afaerber@suse.de, armbru@redhat.com, rth@twiddle.net Igor Mammedov wrote: > On Tue, 23 Apr 2013 13:38:10 +0200 > Juan Quintela wrote: Something like this (on top of your series) should work. It implements an optional subsection and is sent depending if we have used (or not) cpu hotplug. I just compiled it, haven't tested it, so it should be perfect (TM). What do you think? Thanks, Juan. >>From f887ce646f65a81ceff1920c7e6e2287b914b3ca Mon Sep 17 00:00:00 2001 From: Juan Quintela Date: Tue, 23 Apr 2013 17:23:29 +0200 Subject: [PATCH] vmstate subsection example Signed-off-by: Juan Quintela --- hw/acpi/piix4.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/hw/acpi/piix4.c b/hw/acpi/piix4.c index b845123..14dba76 100644 --- a/hw/acpi/piix4.c +++ b/hw/acpi/piix4.c @@ -60,6 +60,7 @@ struct pci_status { }; struct cpu_status { + bool hotplug_happened; uint8_t sts[PIIX4_PROC_LEN]; }; @@ -269,17 +270,23 @@ static int acpi_load_old(QEMUFile *f, void *opaque, int version_id) return ret; } -#define VMSTATE_CPU_STATUS_ARRAY(_field, _state) \ - { \ - .name = (stringify(_field)), \ - .version_id = 0, \ - .num = PIIX4_PROC_LEN, \ - .info = &vmstate_info_uint8, \ - .size = sizeof(uint8_t), \ - .flags = VMS_ARRAY, \ - .offset = vmstate_offset_array(_state, _field, uint8_t, \ - PIIX4_PROC_LEN), \ - } +static bool vmstate_piix4_hotplug_needed(void *opaque) +{ + PIIX4PMState *s = opaque; + + return s->gpe_cpu.hotplug_happened; +} + +static const VMStateDescription vmstate_piix4_hotplug_state = { + .name ="piix4_pm/hotplug", + .version_id = 1, + .minimum_version_id = 1, + .minimum_version_id_old = 1, + .fields = (VMStateField []) { + VMSTATE_UINT8_ARRAY(gpe_cpu.sts, PIIX4PMState, PIIX4_PROC_LEN), + VMSTATE_END_OF_LIST() + } +}; /* qemu-kvm 1.2 uses version 3 but advertised as 2 * To support incoming qemu-kvm 1.2 migration, change version_id @@ -289,7 +296,7 @@ static int acpi_load_old(QEMUFile *f, void *opaque, int version_id) */ static const VMStateDescription vmstate_acpi = { .name = "piix4_pm", - .version_id = 4, + .version_id = 3, .minimum_version_id = 3, .minimum_version_id_old = 1, .load_state_old = acpi_load_old, @@ -305,8 +312,15 @@ static const VMStateDescription vmstate_acpi = { VMSTATE_STRUCT(ar.gpe, PIIX4PMState, 2, vmstate_gpe, ACPIGPE), VMSTATE_STRUCT(pci0_status, PIIX4PMState, 2, vmstate_pci_status, struct pci_status), - VMSTATE_CPU_STATUS_ARRAY(gpe_cpu.sts, PIIX4PMState), VMSTATE_END_OF_LIST() + }, + .subsections = (VMStateSubsection[]) { + { + .vmsd = &vmstate_piix4_hotplug_state, + .needed = vmstate_piix4_hotplug_needed, + }, { + /* empty */ + } } }; @@ -664,6 +678,7 @@ static void piix4_cpu_added_req(Notifier *n, void *opaque) { PIIX4PMState *s = container_of(n, PIIX4PMState, cpu_added_notifier); + s->gpe_cpu.hotplug_happened = true; piix4_cpu_hotplug_req(s, CPU(opaque), PLUG); } @@ -706,6 +721,7 @@ static void piix4_acpi_system_hot_add_init(MemoryRegion *parent, pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev); piix4_init_cpu_status(qdev_get_machine(), &s->gpe_cpu); + s->gpe_cpu.hotplug_happened = false; memory_region_init_io(&s->io_cpu, &cpu_hotplug_ops, s, "apci-cpu-hotplug", PIIX4_PROC_LEN); memory_region_add_subregion(parent, PIIX4_PROC_BASE, &s->io_cpu); -- 1.8.1.4