Re: [PATCH v7 04/16] ACPI: processor: Move checks and availability of acpi_processor earlier

From: Hanjun Guo
Date: Tue Apr 23 2024 - 08:04:32 EST


@@ -232,6 +263,7 @@ static int acpi_processor_get_info(struct acpi_device *device)
acpi_status status = AE_OK;
static int cpu0_initialized;
unsigned long long value;
+ int ret;
acpi_processor_errata();
@@ -316,10 +348,12 @@ static int acpi_processor_get_info(struct acpi_device *device)
* because cpuid <-> apicid mapping is persistent now.
*/
if (invalid_logical_cpuid(pr->id) || !cpu_present(pr->id)) {
- int ret = acpi_processor_hotadd_init(pr);
+ ret = acpi_processor_hotadd_init(pr, device);
if (ret)
- return ret;
+ goto err;
+ } else {
+ acpi_processor_set_per_cpu(pr, device);
}
/*
@@ -357,6 +391,10 @@ static int acpi_processor_get_info(struct acpi_device *device)
arch_fix_phys_package_id(pr->id, value);
return 0;
+
+err:
+ per_cpu(processors, pr->id) = NULL;

..

+ return ret;
}
/*
@@ -365,8 +403,6 @@ static int acpi_processor_get_info(struct acpi_device *device)
* (cpu_data(cpu)) values, like CPU feature flags, family, model, etc.
* Such things have to be put in and set up by the processor driver's .probe().
*/
-static DEFINE_PER_CPU(void *, processor_device_array);
-
static int acpi_processor_add(struct acpi_device *device,
const struct acpi_device_id *id)
{
@@ -395,28 +431,6 @@ static int acpi_processor_add(struct acpi_device *device,
if (result) /* Processor is not physically present or unavailable */
return 0;
- BUG_ON(pr->id >= nr_cpu_ids);
-
- /*
- * Buggy BIOS check.
- * ACPI id of processors can be reported wrongly by the BIOS.
- * Don't trust it blindly
- */
- if (per_cpu(processor_device_array, pr->id) != NULL &&
- per_cpu(processor_device_array, pr->id) != device) {
- dev_warn(&device->dev,
- "BIOS reported wrong ACPI id %d for the processor\n",
- pr->id);
- /* Give up, but do not abort the namespace scan. */
- goto err;
- }
- /*
- * processor_device_array is not cleared on errors to allow buggy BIOS
- * checks.
- */
- per_cpu(processor_device_array, pr->id) = device;
- per_cpu(processors, pr->id) = pr;

Nit: seems we need to remove the duplicated
per_cpu(processors, pr->id) = NULL; in acpi_processor_add():

--- a/drivers/acpi/acpi_processor.c
+++ b/drivers/acpi/acpi_processor.c
@@ -446,7 +446,6 @@ static int acpi_processor_add(struct acpi_device *device,
err:
free_cpumask_var(pr->throttling.shared_cpu_map);
device->driver_data = NULL;
- per_cpu(processors, pr->id) = NULL;
err_free_pr:
kfree(pr);
return result;

Thanks
Hanjun