[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH RFC 07/22] arm/cpuhp: Init PMU at host for all possible vcpus
From: |
Salil Mehta |
Subject: |
[PATCH RFC 07/22] arm/cpuhp: Init PMU at host for all possible vcpus |
Date: |
Sat, 13 Jun 2020 22:36:14 +0100 |
PMU for all possible vcpus must be initialized at the virt machine
initialization time. This patch refactors existing code to accomodate possible
vcpus. This also assumes that all processor being used are identical at least
for now but does not affect the normal scanarios where they might not be in
future. This assumption only affects the future hotplug scenarios if ever there
exists any hetergenous processors. In such a case PMU might not be enabled on
some vcpus. Is it acceptable and doable tradeoff for now?
This perhaps needs more discussion. please check below link,
Link: https://lists.gnu.org/archive/html/qemu-devel/2020-06/msg00131.html
Co-developed-by: Keqian Zhu <zhukeqian1@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
---
hw/arm/virt.c | 51 ++++++++++++++++++++++++++++++-------------
include/hw/arm/virt.h | 1 +
2 files changed, 37 insertions(+), 15 deletions(-)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 9e55b20685..7f938f289b 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -525,23 +525,9 @@ static void fdt_add_gic_node(VirtMachineState *vms)
static void fdt_add_pmu_nodes(const VirtMachineState *vms)
{
- CPUState *cpu;
ARMCPU *armcpu;
uint32_t irqflags = GIC_FDT_IRQ_FLAGS_LEVEL_HI;
- CPU_FOREACH(cpu) {
- armcpu = ARM_CPU(cpu);
- if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
- return;
- }
- if (kvm_enabled()) {
- if (kvm_irqchip_in_kernel()) {
- kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
- }
- kvm_arm_pmu_init(cpu);
- }
- }
-
if (vms->gic_version == VIRT_GIC_VERSION_2) {
irqflags = deposit32(irqflags, GIC_FDT_IRQ_PPI_CPU_START,
GIC_FDT_IRQ_PPI_CPU_WIDTH,
@@ -1414,6 +1400,38 @@ static void create_secure_ram(VirtMachineState *vms,
g_free(nodename);
}
+static bool virt_pmu_init(VirtMachineState *vms)
+{
+ CPUArchIdList *possible_cpus = vms->parent.possible_cpus;
+ ARMCPU *armcpu;
+ int n;
+
+ /*
+ * As of now KVM ensures that within the host all the vcpus have same
+ * features configured. This cannot be changed later and cannot be diferent
+ * for new vcpus being plugged in. Also, -cpu option/virt machine cpu-type
+ * ensures all the vcpus are identical.
+ */
+ for (n = 0; n < possible_cpus->len; n++) {
+ CPUState *cpu = qemu_get_possible_cpu(n);
+ armcpu = ARM_CPU(cpu);
+
+ if (!arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
+ warn_report("Not all vcpus might have PMU initialized");
+ return false;
+ }
+
+ if (kvm_enabled()) {
+ if (kvm_irqchip_in_kernel()) {
+ kvm_arm_pmu_set_irq(cpu, PPI(VIRTUAL_PMU_IRQ));
+ }
+ kvm_arm_pmu_init(cpu);
+ }
+ }
+
+ return true;
+}
+
static void *machvirt_dtb(const struct arm_boot_info *binfo, int *fdt_size)
{
const VirtMachineState *board = container_of(binfo, VirtMachineState,
@@ -1909,7 +1927,10 @@ static void machvirt_init(MachineState *machine)
create_gic(vms);
- fdt_add_pmu_nodes(vms);
+ if (!vmc->no_pmu && virt_pmu_init(vms)) {
+ vms->pmu = true;
+ fdt_add_pmu_nodes(vms);
+ }
create_uart(vms, VIRT_UART, sysmem, serial_hd(0));
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 38a9cad168..3ffbda6217 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -134,6 +134,7 @@ typedef struct {
bool its;
bool virt;
bool ras;
+ bool pmu;
OnOffAuto acpi;
VirtGICType gic_version;
VirtIOMMUType iommu;
--
2.17.1
- [PATCH RFC 00/22] Support of Virtual CPU Hotplug for ARMv8 Arch, Salil Mehta, 2020/06/13
- [PATCH RFC 01/22] arm/cpuhp: Add QMP vcpu params validation support, Salil Mehta, 2020/06/13
- [PATCH RFC 02/22] arm/cpuhp: Add new ARMCPU core-id property, Salil Mehta, 2020/06/13
- [PATCH RFC 03/22] arm/cpuhp: Add common cpu utility for possible vcpus, Salil Mehta, 2020/06/13
- [PATCH RFC 05/22] arm/cpuhp: Pre-create disabled possible vcpus @machine init, Salil Mehta, 2020/06/13
- [PATCH RFC 04/22] arm/cpuhp: Machine init time change common to vcpu {cold|hot}-plug, Salil Mehta, 2020/06/13
- [PATCH RFC 06/22] arm/cpuhp: Changes to pre-size GIC with possible vcpus @machine init, Salil Mehta, 2020/06/13
- [PATCH RFC 07/22] arm/cpuhp: Init PMU at host for all possible vcpus,
Salil Mehta <=
- [PATCH RFC 08/22] arm/cpuhp: Enable ACPI support for vcpu hotplug, Salil Mehta, 2020/06/13
- [PATCH RFC 09/22] arm/cpuhp: Init GED framework with cpu hotplug events, Salil Mehta, 2020/06/13
- [PATCH RFC 10/22] arm/cpuhp: Update CPUs AML with cpu-(ctrl)dev change, Salil Mehta, 2020/06/13
- [PATCH RFC 11/22] arm/cpuhp: Update GED _EVT method AML with cpu scan, Salil Mehta, 2020/06/13
- [PATCH RFC 12/22] arm/cpuhp: MADT Tbl change to size the guest with possible vcpus, Salil Mehta, 2020/06/13
- [PATCH RFC 13/22] arm/cpuhp: Add ACPI _MAT entry for Processor object, Salil Mehta, 2020/06/13
- [PATCH RFC 14/22] arm/cpuhp: Release objects for *disabled* possible vcpus after init, Salil Mehta, 2020/06/13
- [PATCH RFC 15/22] arm/cpuhp: Update ACPI GED framework to support vcpu hotplug, Salil Mehta, 2020/06/13