From patchwork Thu Nov 13 15:40:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 410473 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 7F5891400DD for ; Fri, 14 Nov 2014 02:47:00 +1100 (AEDT) Received: from localhost ([::1]:60619 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xowbq-0006y4-Ox for incoming@patchwork.ozlabs.org; Thu, 13 Nov 2014 10:46:58 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37368) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XowW3-0004ir-H1 for qemu-devel@nongnu.org; Thu, 13 Nov 2014 10:41:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XowVx-0007nZ-GL for qemu-devel@nongnu.org; Thu, 13 Nov 2014 10:40:59 -0500 Received: from mail-wi0-x22d.google.com ([2a00:1450:400c:c05::22d]:59662) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XowVx-0007nK-1C for qemu-devel@nongnu.org; Thu, 13 Nov 2014 10:40:53 -0500 Received: by mail-wi0-f173.google.com with SMTP id n3so8732057wiv.0 for ; Thu, 13 Nov 2014 07:40:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=rXkK6HyE6hUCDWIM9huf2auE99TGqtm+OoeO3cweRmA=; b=hPVXh8CCrv3JJXLA/l1D0nI33g08javYcycn5q9teTRVCi3w7ZJYFF+HzvvLj4DgKs H8o1znS8PX6NSfnf+4qtW+Ac+0f6Dv9ioup3LLV/mOMXnX1phQCjRM8ukP3P/yGMSP8u Cxg5CsPzRAjsDsNkQtlUupb+yk5iiodx15ugpjaz+hQ2YqRM3B5QMJlxtzk7gEimKoLp uH0vwUoEjs/eKr8A3YTpEn0nNYmpg8ajqVFw/+EqRFD5TPcpeCjSWS23tZYzqsJGyIuR jNJHqasvbf5HAAp9NzpQib9Gfu5ZOllwbLb/Io1tcK4EVsShW4LZ5XUSrrIP452P0aP6 aWfQ== X-Received: by 10.180.187.234 with SMTP id fv10mr5011741wic.25.1415893252425; Thu, 13 Nov 2014 07:40:52 -0800 (PST) Received: from playground.station (net-37-117-142-149.cust.vodafonedsl.it. [37.117.142.149]) by mx.google.com with ESMTPSA id u13sm26168441wiv.10.2014.11.13.07.40.50 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Nov 2014 07:40:51 -0800 (PST) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Thu, 13 Nov 2014 16:40:24 +0100 Message-Id: <1415893228-25823-10-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1415893228-25823-1-git-send-email-pbonzini@redhat.com> References: <1415893228-25823-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c05::22d Cc: Pavel Dovgalyuk Subject: [Qemu-devel] [PULL 09/13] apic_common: migrate missing fields X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Pavel Dovgalyuk This patch adds missed sipi_vector and wait_for_sipi fields to a new subsection of the vmstate of the apic_common module. Saving and loading of these fields makes migration of the apic state deterministic. Signed-off-by: Pavel Dovgalyuk [Initialize the field in pre_load and kvm_apic_realize. - Paolo] Signed-off-by: Paolo Bonzini --- hw/i386/kvm/apic.c | 3 +++ hw/intc/apic_common.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/hw/i386/kvm/apic.c b/hw/i386/kvm/apic.c index e873b50..271e97f 100644 --- a/hw/i386/kvm/apic.c +++ b/hw/i386/kvm/apic.c @@ -175,6 +175,9 @@ static void kvm_apic_realize(DeviceState *dev, Error **errp) { APICCommonState *s = APIC_COMMON(dev); + /* Not used by KVM, which uses the CPU mp_state instead. */ + s->wait_for_sipi = 0; + memory_region_init_io(&s->io_memory, NULL, &kvm_apic_io_ops, s, "kvm-apic-msi", APIC_SPACE_SIZE); diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c index ce3d903..4e62f25 100644 --- a/hw/intc/apic_common.c +++ b/hw/intc/apic_common.c @@ -324,6 +324,19 @@ static void apic_common_realize(DeviceState *dev, Error **errp) } +static int apic_pre_load(void *opaque) +{ + APICCommonState *s = APIC_COMMON(opaque); + + /* The default is !cpu_is_bsp(s->cpu), but the common value is 0 + * so that's what apic_common_sipi_needed checks for. Reset to + * the value that is assumed when the apic_sipi subsection is + * absent. + */ + s->wait_for_sipi = 0; + return 0; +} + static void apic_dispatch_pre_save(void *opaque) { APICCommonState *s = APIC_COMMON(opaque); @@ -345,12 +358,30 @@ static int apic_dispatch_post_load(void *opaque, int version_id) return 0; } +static bool apic_common_sipi_needed(void *opaque) +{ + APICCommonState *s = APIC_COMMON(opaque); + return s->wait_for_sipi != 0; +} + +static const VMStateDescription vmstate_apic_common_sipi = { + .name = "apic_sipi", + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_INT32(sipi_vector, APICCommonState), + VMSTATE_INT32(wait_for_sipi, APICCommonState), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_apic_common = { .name = "apic", .version_id = 3, .minimum_version_id = 3, .minimum_version_id_old = 1, .load_state_old = apic_load_old, + .pre_load = apic_pre_load, .pre_save = apic_dispatch_pre_save, .post_load = apic_dispatch_post_load, .fields = (VMStateField[]) { @@ -375,6 +406,13 @@ static const VMStateDescription vmstate_apic_common = { VMSTATE_INT64(timer_expiry, APICCommonState), /* open-coded timer state */ VMSTATE_END_OF_LIST() + }, + .subsections = (VMStateSubsection[]) { + { + .vmsd = &vmstate_apic_common_sipi, + .needed = apic_common_sipi_needed, + }, + VMSTATE_END_OF_LIST() } };