From: "wangyanan (Y)" <wangyanan55@huawei.com>
To: Andrew Jones <drjones@redhat.com>
Cc: "Barry Song" <song.bao.hua@hisilicon.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Michael S . Tsirkin" <mst@redhat.com>,
wanghaibin.wang@huawei.com, zhukeqian1@huawei.com,
qemu-devel@nongnu.org, yangyicong@huawei.com,
"Shannon Zhao" <shannon.zhaosl@gmail.com>,
qemu-arm@nongnu.org,
"Alistair Francis" <alistair.francis@wdc.com>,
prime.zeng@hisilicon.com, "Paolo Bonzini" <pbonzini@redhat.com>,
yuzenghui@huawei.com, "Igor Mammedov" <imammedo@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>,
"David Gibson" <david@gibson.dropbear.id.au>
Subject: Re: [RFC PATCH v3 6/9] hw/arm/virt-acpi-build: Use possible cpus in generation of MADT
Date: Tue, 18 May 2021 00:27:59 +0800 [thread overview]
Message-ID: <ac1b0f17-523d-adb8-c4f4-aa5c93966726@huawei.com> (raw)
In-Reply-To: <20210517074256.xjqwejbi4mfsvug2@gator.home>
Hi Drew,
On 2021/5/17 15:42, Andrew Jones wrote:
> On Sun, May 16, 2021 at 06:28:57PM +0800, Yanan Wang wrote:
>> When building ACPI tables regarding CPUs we should always build
>> them for the number of possible CPUs, not the number of present
>> CPUs. So we create gicc nodes in MADT for possible cpus and then
>> ensure only the present CPUs are marked ENABLED. Furthermore, it
>> also needed if we are going to support CPU hotplug in the future.
>>
>> Co-developed-by: Andrew Jones <drjones@redhat.com>
>> Signed-off-by: Andrew Jones <drjones@redhat.com>
>> Co-developed-by: Ying Fang <fangying1@huawei.com>
>> Signed-off-by: Ying Fang <fangying1@huawei.com>
>> Co-developed-by: Yanan Wang <wangyanan55@huawei.com>
>> Signed-off-by: Yanan Wang <wangyanan55@huawei.com>
>> ---
>> hw/arm/virt-acpi-build.c | 29 +++++++++++++++++++++++++----
>> 1 file changed, 25 insertions(+), 4 deletions(-)
>>
>> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
>> index a2d8e87616..4d64aeb865 100644
>> --- a/hw/arm/virt-acpi-build.c
>> +++ b/hw/arm/virt-acpi-build.c
>> @@ -481,6 +481,9 @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>> const int *irqmap = vms->irqmap;
>> AcpiMadtGenericDistributor *gicd;
>> AcpiMadtGenericMsiFrame *gic_msi;
>> + MachineClass *mc = MACHINE_GET_CLASS(vms);
>> + const CPUArchIdList *possible_cpus = mc->possible_cpu_arch_ids(MACHINE(vms));
>> + bool pmu;
>> int i;
>>
>> acpi_data_push(table_data, sizeof(AcpiMultipleApicTable));
>> @@ -491,11 +494,21 @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>> gicd->base_address = cpu_to_le64(memmap[VIRT_GIC_DIST].base);
>> gicd->version = vms->gic_version;
>>
>> - for (i = 0; i < MACHINE(vms)->smp.cpus; i++) {
>> + for (i = 0; i < possible_cpus->len; i++) {
>> AcpiMadtGenericCpuInterface *gicc = acpi_data_push(table_data,
>> sizeof(*gicc));
>> ARMCPU *armcpu = ARM_CPU(qemu_get_cpu(i));
>>
>> + /*
>> + * PMU should have been either implemented for all CPUs or not,
>> + * so we only get information from the first CPU, which could
>> + * represent the others.
>> + */
>> + if (i == 0) {
>> + pmu = arm_feature(&armcpu->env, ARM_FEATURE_PMU);
>> + }
>> + assert(!armcpu || arm_feature(&armcpu->env, ARM_FEATURE_PMU) == pmu);
> This doesn't belong in this patch. The commit message doesn't even mention
> it. Also, I don't think we should do this here at all. If we want to
> ensure that all cpus have a pmu when one does, then that should be done
> somewhere like machvirt_init(), not in ACPI generation code which doesn't
> even run for non-ACPI VMs.
Sorry, I should have stated the reason of this change in the commit message.
Actually code change here and mp_affinity part below aim to make it correct
to create gicc entries for all possible cpus.
We only initialize and realize cpuobj for present cpus in machvirt_init,
so that we will get null ARMCPU pointer here for the non-present cpus,
and consequently we won't able to check from "armcpu->env" for the
non-present cpus. The same about "armcpu->mp_affinity".
That's the reason I use PMU configuration of the first cpu to represent the
others. I assume all cpus should have a pmu when one does here since it's
how armcpu->env is initialized. And the assert seems not needed here.
Is there any better alternative way about this?
>> +
>> gicc->type = ACPI_APIC_GENERIC_CPU_INTERFACE;
>> gicc->length = sizeof(*gicc);
>> if (vms->gic_version == 2) {
>> @@ -504,11 +517,19 @@ build_madt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>> gicc->gicv_base_address = cpu_to_le64(memmap[VIRT_GIC_VCPU].base);
>> }
>> gicc->cpu_interface_number = cpu_to_le32(i);
>> - gicc->arm_mpidr = cpu_to_le64(armcpu->mp_affinity);
>> + gicc->arm_mpidr = cpu_to_le64(possible_cpus->cpus[i].arch_id);
> Hmm, I think we may have a problem. I don't think there's any guarantee
> that possible_cpus->cpus[i].arch_id == armcpu->mp_affinity, because
> arch_id comes from virt_cpu_mp_affinity(), which is arm_cpu_mp_affinity,
> but with a variable cluster size, however mp_affinity comes from
> arm_cpu_mp_affinity with a set cluster size. Also, when KVM is used,
> then all bets are off as to what mp_affinity is.
Right! Arch_id is initialized by virt_cpu_mp_affinity() in machvirt and then
mp_affinity is initialized by arch_id. Here they two have the same value.
But mp_affinity will be overridden in kvm_arch_init_vcpu() when KVM is
enabled. Here they two won't have the same value.
> We need to add some code that ensures arch_id == mp_affinity,
Can we also update the arch_id at the same time when we change mp_affinity?
> and, for
> now, we should stick with mp_affinity, since, at least when KVM is used,
> that's the correct one.
I also prefer sticking with mp_affinity, if the problem I explain about
ARMCPU
above can be perfectly solved.
>> gicc->uid = cpu_to_le32(i);
>> - gicc->flags = cpu_to_le32(ACPI_MADT_GICC_ENABLED);
>>
>> - if (arm_feature(&armcpu->env, ARM_FEATURE_PMU)) {
>> + /*
>> + * ACPI spec says that LAPIC entry for non present CPU may be
> Why are we talking about LAPICs in a GICC generator?
Ah, sorry. This ought to be GICC entry. Will fix.
Thanks,
Yanan
>> + * omitted from MADT or it must be marked as disabled. Here we
>> + * choose to also keep the disabled ones in MADT.
>> + */
>> + if (possible_cpus->cpus[i].cpu != NULL) {
>> + gicc->flags = cpu_to_le32(ACPI_MADT_GICC_ENABLED);
>> + }
>> +
>> + if (pmu) {
>> gicc->performance_interrupt = cpu_to_le32(PPI(VIRTUAL_PMU_IRQ));
>> }
>> if (vms->virt) {
>> --
>> 2.19.1
>>
> Thanks,
> drew
>
> .
next prev parent reply other threads:[~2021-05-17 16:41 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-16 10:28 [RFC PATCH v3 0/9] hw/arm/virt: Introduce cpu topology support Yanan Wang
2021-05-16 10:28 ` [RFC PATCH v3 1/9] hw/arm/virt: Disable cpu topology support on older machine types Yanan Wang
2021-05-16 10:28 ` [RFC PATCH v3 2/9] device_tree: Add qemu_fdt_add_path Yanan Wang
2021-05-17 3:11 ` David Gibson
2021-05-17 13:18 ` wangyanan (Y)
2021-05-17 6:27 ` Andrew Jones
2021-05-17 13:21 ` wangyanan (Y)
2021-05-16 10:28 ` [RFC PATCH v3 3/9] hw/arm/virt: Add cpu-map to device tree Yanan Wang
2021-05-17 6:41 ` Andrew Jones
2021-05-17 15:00 ` wangyanan (Y)
2021-05-18 7:46 ` Andrew Jones
2021-05-18 10:50 ` wangyanan (Y)
2021-05-16 10:28 ` [RFC PATCH v3 4/9] hw/arm/virt: Initialize the present cpu members Yanan Wang
2021-05-17 6:43 ` Andrew Jones
2021-05-17 20:48 ` Salil Mehta
2021-05-18 4:42 ` wangyanan (Y)
2021-05-18 7:04 ` Salil Mehta
2021-05-18 7:50 ` Andrew Jones
2021-05-18 18:50 ` Salil Mehta
2021-05-16 10:28 ` [RFC PATCH v3 5/9] hw/arm/virt-acpi-build: Use possible cpus in generation of DSDT Yanan Wang
2021-05-16 10:28 ` [RFC PATCH v3 6/9] hw/arm/virt-acpi-build: Use possible cpus in generation of MADT Yanan Wang
2021-05-17 7:42 ` Andrew Jones
2021-05-17 16:27 ` wangyanan (Y) [this message]
2021-05-18 8:15 ` Andrew Jones
2021-05-18 11:47 ` wangyanan (Y)
2021-05-18 13:40 ` Andrew Jones
2021-05-17 17:07 ` Salil Mehta
2021-05-18 5:02 ` wangyanan (Y)
2021-05-18 6:47 ` Salil Mehta
2021-05-18 11:58 ` wangyanan (Y)
2021-05-16 10:28 ` [RFC PATCH v3 7/9] hw/acpi/aml-build: Add Processor hierarchy node structure Yanan Wang
2021-05-17 7:47 ` Andrew Jones
2021-05-16 10:28 ` [RFC PATCH v3 8/9] hw/arm/virt-acpi-build: Generate PPTT table Yanan Wang
2021-05-17 8:02 ` Andrew Jones
2021-05-17 13:43 ` wangyanan (Y)
2021-05-17 14:45 ` Andrew Jones
2021-05-17 16:02 ` wangyanan (Y)
2021-05-16 10:29 ` [RFC PATCH v3 9/9] hw/arm/virt: Add separate -smp parsing function for ARM machines Yanan Wang
2021-05-17 8:24 ` Andrew Jones
2021-05-18 2:16 ` wangyanan (Y)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ac1b0f17-523d-adb8-c4f4-aa5c93966726@huawei.com \
--to=wangyanan55@huawei.com \
--cc=alistair.francis@wdc.com \
--cc=david@gibson.dropbear.id.au \
--cc=drjones@redhat.com \
--cc=imammedo@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@redhat.com \
--cc=prime.zeng@hisilicon.com \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=shannon.zhaosl@gmail.com \
--cc=song.bao.hua@hisilicon.com \
--cc=wanghaibin.wang@huawei.com \
--cc=yangyicong@huawei.com \
--cc=yuzenghui@huawei.com \
--cc=zhukeqian1@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).