Re: [PATCH] cpu/hotplug: Fix NULL kobject warning in cpuhp_smt_enable()

From: Jinjie Ruan

Date: Thu Apr 23 2026 - 08:35:10 EST




On 4/23/2026 6:08 PM, Thomas Gleixner wrote:
> On Sat, Apr 18 2026 at 12:55, Catalin Marinas wrote:
>> Another option would have been to avoid marking such CPUs present but I
>> think this will break other things. Yet another option is to register
>> all CPU devices even if they never come up (like maxcpus greater than
>> actual CPUs).
>>
>> Opinions? It might be an arm64+ACPI-only thing.
>
> I think so. The proper thing to do is to apply sane limits:
>
> 1) The possible CPUs enumerated by firmware N_POSSIBLE_FW
>
> 2) The maxcpus limit on the command line N_MAXCPUS_CL
>
> So the actual possible CPUs evaluates to:
>
> num_possible = min(N_POSSIBLE_FW, N_MAXCPUS_CL, CONFIG_NR_CPUS);
>
> The evaluation of the firmware should not mark CPUs present which are
> actually not. ACPI gives you that information. See:
>
> 5.2.12.14 GIC CPU Interface (GICC) Structure
>
> in the ACPI spec. That has two related bits:
>
> Enabled:
>
> If this bit is set, the processor is ready for use. If this bit is
> clear and the Online Capable bit is set, the system supports enabling
> this processor during OS runtime. If this bit is clear and the Online
> Capable bit is also clear, this processor is un- usable, and the
> operating system support will not attempt to use it.
>
> Online Capable:
>
> The information conveyed by this bit depends on the value of the
> Enabled bit. If the Enabled bit is set, this bit is reserved and must
> be zero. Otherwise, if this bit is set, the system supports enabling
> this processor later during OS runtime
>
> So the combination of those gives you the right answer:
>
> Enabled Online
> Capable
> 0 0 Not present, not possible
> 0 1 Not present, but possible to "hotplug" layter
> 1 0 Present
> 1 1 Invalid

On x86, it seems that all CPUs with the ACPI_MADT_ENABLED bit set will
be marked as present.

acpi_parse_x2apic()
-> enabled = processor->lapic_flags & ACPI_MADT_ENABLED
-> topology_register_apic(enabled)
-> topo_register_apic(enabled)
-> set_cpu_present(cpu, true)

>
> The kernel sizes everything on the number of possible CPUs and the
> present CPU mask is only there to figure out which CPUs are actually
> usable and can be brought up.

>
> The runtime physical hotplug mechanics use acpi_[un]map_cpu() to toggle
> the present bit.
>
> Thanks,
>
> tglx
>
>
>