72 lines
2.6 KiB
Diff
72 lines
2.6 KiB
Diff
|
|
From c375e6fdc49f7d3d0232786e4cfd8b792379107c Mon Sep 17 00:00:00 2001
|
||
|
|
From: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
Date: Wed, 6 May 2020 14:12:34 +0100
|
||
|
|
Subject: [PATCH] arm/virt: Init PMU at host for all possible vcpus
|
||
|
|
|
||
|
|
PMU for all possible vCPUs must be initialized at the VM initialization time.
|
||
|
|
Refactor existing code to accomodate possible vCPUs. This also assumes that all
|
||
|
|
processor being used are identical.
|
||
|
|
|
||
|
|
Past discussion for reference:
|
||
|
|
Link: https://lists.gnu.org/archive/html/qemu-devel/2020-06/msg00131.html
|
||
|
|
|
||
|
|
Co-developed-by: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
|
||
|
|
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 | 12 ++++++++----
|
||
|
|
include/hw/arm/virt.h | 1 +
|
||
|
|
2 files changed, 9 insertions(+), 4 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
||
|
|
index 08ba255317..78ed3c4ba8 100644
|
||
|
|
--- a/hw/arm/virt.c
|
||
|
|
+++ b/hw/arm/virt.c
|
||
|
|
@@ -2055,12 +2055,14 @@ 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;
|
||
|
|
+ int n;
|
||
|
|
|
||
|
|
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);
|
||
|
|
|
||
|
|
@@ -2087,8 +2089,10 @@ static void virt_cpu_post_init(VirtMachineState *vms, MemoryRegion *sysmem)
|
||
|
|
memory_region_add_subregion(sysmem, pvtime_reg_base, pvtime);
|
||
|
|
}
|
||
|
|
|
||
|
|
- CPU_FOREACH(cpu) {
|
||
|
|
- if (pmu) {
|
||
|
|
+ for (n = 0; n < possible_cpus->len; n++) {
|
||
|
|
+ cpu = qemu_get_possible_cpu(n);
|
||
|
|
+
|
||
|
|
+ if (vms->pmu) {
|
||
|
|
assert(arm_feature(&ARM_CPU(cpu)->env, ARM_FEATURE_PMU));
|
||
|
|
if (kvm_irqchip_in_kernel()) {
|
||
|
|
kvm_arm_pmu_set_irq(cpu, VIRTUAL_PMU_IRQ);
|
||
|
|
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
||
|
|
index a6977bade5..c2fde0522c 100644
|
||
|
|
--- a/include/hw/arm/virt.h
|
||
|
|
+++ b/include/hw/arm/virt.h
|
||
|
|
@@ -155,6 +155,7 @@ struct VirtMachineState {
|
||
|
|
bool ras;
|
||
|
|
bool mte;
|
||
|
|
bool dtb_randomness;
|
||
|
|
+ bool pmu;
|
||
|
|
OnOffAuto acpi;
|
||
|
|
VirtGICType gic_version;
|
||
|
|
VirtIOMMUType iommu;
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|