diff mbox series

[RFC,07/22] arm/cpuhp: Init PMU at host for all possible vcpus

Message ID 20200613213629.21984-8-salil.mehta@huawei.com (mailing list archive)
State New, archived
Headers show
Series Support of Virtual CPU Hotplug for ARMv8 Arch | expand

Commit Message

Salil Mehta June 13, 2020, 9:36 p.m. UTC
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(-)

Comments

Andrew Jones June 23, 2020, 9 a.m. UTC | #1
On Sat, Jun 13, 2020 at 10:36:14PM +0100, Salil Mehta wrote:
> 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(-)
>

I have a similar patch to this one in my steal-time dev branch that I just
started last week. I'm creating a new function that must be called after
cpu realization and gic creation that completes cpu setup. There's a few
things that will end up there (including steal-time stuff).

Thanks,
drew
Salil Mehta June 23, 2020, 9:52 a.m. UTC | #2
> From: Andrew Jones [mailto:drjones@redhat.com]
> Sent: Tuesday, June 23, 2020 10:01 AM
> To: Salil Mehta <salil.mehta@huawei.com>
> Cc: qemu-devel@nongnu.org; qemu-arm@nongnu.org; peter.maydell@linaro.org;
> sudeep.holla@arm.com; gshan@redhat.com; mst@redhat.com; jiakernel2@gmail.com;
> maz@kernel.org; zhukeqian <zhukeqian1@huawei.com>; david@redhat.com;
> richard.henderson@linaro.org; Linuxarm <linuxarm@huawei.com>;
> eric.auger@redhat.com; james.morse@arm.com; catalin.marinas@arm.com;
> imammedo@redhat.com; pbonzini@redhat.com; mehta.salil.lnk@gmail.com;
> maran.wilson@oracle.com; will@kernel.org; wangxiongfeng (C)
> <wangxiongfeng2@huawei.com>
> Subject: Re: [PATCH RFC 07/22] arm/cpuhp: Init PMU at host for all possible vcpus
> 
> On Sat, Jun 13, 2020 at 10:36:14PM +0100, Salil Mehta wrote:
> > 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(-)
> >
> 
> I have a similar patch to this one in my steal-time dev branch that I just
> started last week. I'm creating a new function that must be called after
> cpu realization and gic creation that completes cpu setup. There's a few
> things that will end up there (including steal-time stuff).

ok. 

> 
> Thanks,
> drew
diff mbox series

Patch

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;