From patchwork Thu Dec 1 17:06:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laszlo Ersek X-Patchwork-Id: 701612 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 3tV3t254gdz9snk for ; Fri, 2 Dec 2016 04:19:06 +1100 (AEDT) Received: from localhost ([::1]:57654 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cCV0h-0000zs-Jn for incoming@patchwork.ozlabs.org; Thu, 01 Dec 2016 12:19:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36454) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cCUos-0008Ak-Sa for qemu-devel@nongnu.org; Thu, 01 Dec 2016 12:06:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cCUor-0006tc-FV for qemu-devel@nongnu.org; Thu, 01 Dec 2016 12:06:50 -0500 Received: from mx1.redhat.com ([209.132.183.28]:52256) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cCUor-0006st-6t for qemu-devel@nongnu.org; Thu, 01 Dec 2016 12:06:49 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 79B79C05B1EF for ; Thu, 1 Dec 2016 17:06:48 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-116-138.phx2.redhat.com [10.3.116.138]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id uB1H6SN3022984; Thu, 1 Dec 2016 12:06:46 -0500 From: Laszlo Ersek To: qemu devel list Date: Thu, 1 Dec 2016 18:06:24 +0100 Message-Id: <20161201170624.26496-8-lersek@redhat.com> In-Reply-To: <20161201170624.26496-1-lersek@redhat.com> References: <20161201170624.26496-1-lersek@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 01 Dec 2016 17:06:48 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v4 7/7] hw/i386/pc_q35: advertise broadcast SMI if VCPU hotplug is turned off X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Igor Mammedov , Paolo Bonzini , Gerd Hoffmann , Eduardo Habkost , "Michael S. Tsirkin" Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" For the time being, we cannot handle SMIs in OVMF if VCPUs can show up after boot. Otherwise, advertise ICH9_LPC_SMI_F_BROADCAST. Implement this generally, by introducing a new PCMachineClass method, namely get_smi_host_features(), and implement the above logic for pc-q35-2.9 and later. The idea is that future machine types might want to calculate (the same or different) SMI host features from different information, and that shouldn't affect earlier machine types. In turn, validating guest feature requests (inter-feature dependencies) should be possible purely based on the available host feature set. For example, in the future we might enforce that the guest select ICH9_LPC_SMI_F_VCPU_PARKING as a prerequisite for ICH9_LPC_SMI_F_BROADCAST, but only if the machine type itself advertises ICH9_LPC_SMI_F_VCPU_PARKING. Cc: "Michael S. Tsirkin" Cc: Eduardo Habkost Cc: Gerd Hoffmann Cc: Igor Mammedov Cc: Paolo Bonzini Signed-off-by: Laszlo Ersek --- include/hw/i386/pc.h | 1 + hw/i386/pc_q35.c | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h index 430735e501dd..e164947116b6 100644 --- a/include/hw/i386/pc.h +++ b/include/hw/i386/pc.h @@ -116,10 +116,11 @@ struct PCMachineClass { /*< public >*/ /* Methods: */ HotplugHandler *(*get_hotplug_handler)(MachineState *machine, DeviceState *dev); + uint64_t (*get_smi_host_features)(void); /* Device configuration: */ bool pci_enabled; bool kvmclock_enabled; diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index eb0953bb6b16..bc1ab48d2c4f 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -228,11 +228,13 @@ static void pc_q35_init(MachineState *machine) /* init basic PC hardware */ pc_basic_device_init(isa_bus, pcms->gsi, &rtc_state, !mc->no_floppy, (pcms->vmport != ON_OFF_AUTO_ON), 0xff0104); /* connect pm stuff to lpc */ - ich9_lpc_pm_init(lpc, pc_machine_is_smm_enabled(pcms), 0); + ich9_lpc_pm_init(lpc, pc_machine_is_smm_enabled(pcms), + pcmc->get_smi_host_features == NULL ? 0 : + pcmc->get_smi_host_features()); /* ahci and SATA device, for q35 1 ahci controller is built-in */ ahci = pci_create_simple_multifunction(host_bus, PCI_DEVFN(ICH9_SATA1_DEV, ICH9_SATA1_FUNC), @@ -267,10 +269,26 @@ static void pc_q35_init(MachineState *machine) nvdimm_init_acpi_state(&pcms->acpi_nvdimm_state, system_io, pcms->fw_cfg, OBJECT(pcms)); } } +static uint64_t pc_q35_get_smi_host_features(void) +{ + uint64_t host_features = 0; + + /* The host features are computed only at startup, they don't depend on + * guest actions. For now we only advertise SMI broadcast if VCPU hot-plug + * / hot-unplug are disabled. In the future we might advertise it + * unconditionally, but negotiate it only if VCPU hot-plug / hot-unplug are + * disabled, or if the guest negotiates another feature bit (VCPU parking). + */ + if (smp_cpus == max_cpus) { + host_features |= ICH9_LPC_SMI_F_BROADCAST; + } + return host_features; +} + #define DEFINE_Q35_MACHINE(suffix, name, compatfn, optionfn) \ static void pc_init_##suffix(MachineState *machine) \ { \ void (*compat)(MachineState *m) = (compatfn); \ if (compat) { \ @@ -281,19 +299,21 @@ static void pc_q35_init(MachineState *machine) DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn) static void pc_q35_machine_options(MachineClass *m) { + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); m->family = "pc_q35"; m->desc = "Standard PC (Q35 + ICH9, 2009)"; m->hot_add_cpu = pc_hot_add_cpu; m->units_per_default_bus = 1; m->default_machine_opts = "firmware=bios-256k.bin"; m->default_display = "std"; m->no_floppy = 1; m->has_dynamic_sysbus = true; m->max_cpus = 288; + pcmc->get_smi_host_features = pc_q35_get_smi_host_features; } static void pc_q35_2_9_machine_options(MachineClass *m) { pc_q35_machine_options(m); @@ -303,12 +323,14 @@ static void pc_q35_2_9_machine_options(MachineClass *m) DEFINE_Q35_MACHINE(v2_9, "pc-q35-2.9", NULL, pc_q35_2_9_machine_options); static void pc_q35_2_8_machine_options(MachineClass *m) { + PCMachineClass *pcmc = PC_MACHINE_CLASS(m); pc_q35_2_9_machine_options(m); m->alias = NULL; + pcmc->get_smi_host_features = NULL; SET_MACHINE_COMPAT(m, PC_COMPAT_2_8); } DEFINE_Q35_MACHINE(v2_8, "pc-q35-2.8", NULL, pc_q35_2_8_machine_options);