[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH RFC V5 11/30] arm/virt: Init PMU at host for all possible vCPUs
From: |
Salil Mehta |
Subject: |
[PATCH RFC V5 11/30] arm/virt: Init PMU at host for all possible vCPUs |
Date: |
Tue, 15 Oct 2024 10:59:53 +0100 |
The PMU for all possible vCPUs must be initialized during VM initialization.
Refactor the existing code to accommodate possible vCPUs. This assumes that all
processors being used are identical. It is an architectural constraint of ARM
CPUs that all vCPUs MUST have identical feature sets, at least until the ARM
specification is updated to allow otherwise.
Past discussion for reference:
Link: https://lists.gnu.org/archive/html/qemu-devel/2020-06/msg00131.html
Co-developed-by: Keqian Zhu <zhukeqian1@huawei.com>
Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
---
hw/arm/virt.c | 9 +++++----
include/hw/arm/virt.h | 1 +
include/hw/core/cpu.h | 5 +++++
3 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index b9df428049..6ac2d8826e 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2035,12 +2035,13 @@ static void finalize_gic_version(VirtMachineState *vms)
*/
static void virt_cpu_post_init(VirtMachineState *vms, MemoryRegion *sysmem)
{
+ CPUArchIdList *possible_cpus = vms->parent.possible_cpus;
int max_cpus = MACHINE(vms)->smp.max_cpus;
- bool aarch64, pmu, steal_time;
+ bool aarch64, steal_time;
CPUState *cpu;
aarch64 = object_property_get_bool(OBJECT(first_cpu), "aarch64", NULL);
- pmu = object_property_get_bool(OBJECT(first_cpu), "pmu", NULL);
+ vms->pmu = object_property_get_bool(OBJECT(first_cpu), "pmu", NULL);
steal_time = object_property_get_bool(OBJECT(first_cpu),
"kvm-steal-time", NULL);
@@ -2067,8 +2068,8 @@ static void virt_cpu_post_init(VirtMachineState *vms,
MemoryRegion *sysmem)
memory_region_add_subregion(sysmem, pvtime_reg_base, pvtime);
}
- CPU_FOREACH(cpu) {
- if (pmu) {
+ CPU_FOREACH_POSSIBLE(cpu, possible_cpus) {
+ if (vms->pmu) {
assert(arm_feature(&ARM_CPU(cpu)->env, ARM_FEATURE_PMU));
if (kvm_irqchip_in_kernel()) {
kvm_arm_pmu_set_irq(ARM_CPU(cpu), VIRTUAL_PMU_IRQ);
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index b5bfb75f71..98ce68eae1 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -161,6 +161,7 @@ struct VirtMachineState {
bool mte;
bool dtb_randomness;
bool second_ns_uart_present;
+ bool pmu;
OnOffAuto acpi;
VirtGICType gic_version;
VirtIOMMUType iommu;
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index 0be1984698..4a74c383ab 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -618,6 +618,11 @@ extern CPUTailQ cpus_queue;
#define CPU_FOREACH_SAFE(cpu, next_cpu) \
QTAILQ_FOREACH_SAFE_RCU(cpu, &cpus_queue, node, next_cpu)
+#define CPU_FOREACH_POSSIBLE(cpu, poslist) \
+ for (int iter = 0; \
+ iter < (poslist)->len && ((cpu) = (poslist)->cpus[iter].cpu, 1); \
+ iter++)
+
extern __thread CPUState *current_cpu;
/**
--
2.34.1
- [PATCH RFC V5 01/30] arm/virt, target/arm: Add new ARMCPU {socket, cluster, core, thread}-id property, (continued)
- [PATCH RFC V5 01/30] arm/virt, target/arm: Add new ARMCPU {socket, cluster, core, thread}-id property, Salil Mehta, 2024/10/15
- [PATCH RFC V5 02/30] hw/arm/virt: Disable vCPU hotplug for *unsupported* Accel or GIC Type, Salil Mehta, 2024/10/15
- [PATCH RFC V5 03/30] hw/arm/virt: Move setting of common vCPU properties in a function, Salil Mehta, 2024/10/15
- [PATCH RFC V5 04/30] arm/virt, target/arm: Machine init time change common to vCPU {cold|hot}-plug, Salil Mehta, 2024/10/15
- [PATCH RFC V5 05/30] arm/virt, kvm: Pre-create KVM vCPUs for all unplugged QOM vCPUs @machine init, Salil Mehta, 2024/10/15
- [PATCH RFC V5 06/30] arm/virt, gicv3: Changes to pre-size GIC with possible vCPUs @machine init, Salil Mehta, 2024/10/15
- [PATCH RFC V5 07/30] arm/virt, gicv3: Introduce GICv3 CPU Interface *accessibility* flag and checks, Salil Mehta, 2024/10/15
- [PATCH RFC V5 08/30] hw/intc/arm-gicv3*: Changes required to (re)init the GICv3 vCPU Interface, Salil Mehta, 2024/10/15
- [PATCH RFC V5 09/30] arm/acpi: Enable ACPI support for vCPU hotplug, Salil Mehta, 2024/10/15
- [PATCH RFC V5 10/30] arm/virt: Enhance GED framework to handle vCPU hotplug events, Salil Mehta, 2024/10/15
- [PATCH RFC V5 11/30] arm/virt: Init PMU at host for all possible vCPUs,
Salil Mehta <=
- [PATCH RFC V5 12/30] arm/virt: Release objects for *disabled* possible vCPUs after init, Salil Mehta, 2024/10/15
- [PATCH RFC V5 13/30] arm/virt/acpi: Update ACPI DSDT Tbl to include CPUs AML with hotplug support, Salil Mehta, 2024/10/15
- [PATCH RFC V5 14/30] hw/acpi: Make _MAT method optional, Salil Mehta, 2024/10/15
- [PATCH RFC V5 15/30] hw/arm/acpi: MADT Tbl change to size the guest with possible vCPUs, Salil Mehta, 2024/10/15
- [PATCH RFC V5 16/30] target/arm: Force ARM vCPU *present* status ACPI *persistent*, Salil Mehta, 2024/10/15
- [PATCH RFC V5 17/30] arm/virt: Add/update basic hot-(un)plug framework, Salil Mehta, 2024/10/15
- [PATCH RFC V5 18/30] arm/virt: Changes to (un)wire GICC<->vCPU IRQs during hot-(un)plug, Salil Mehta, 2024/10/15
- [PATCH RFC V5 19/30] hw/arm, gicv3: Changes to notify GICv3 CPU state with vCPU hot-(un)plug event, Salil Mehta, 2024/10/15
- [PATCH RFC V5 20/30] hw/arm: Changes required for reset and to support next boot, Salil Mehta, 2024/10/15
- [PATCH RFC V5 21/30] arm/virt: Update the guest(via GED) about vCPU hot-(un)plug events, Salil Mehta, 2024/10/15