From 1fe39413c45e6cc19cdf8b2b89aae6c730d673d5 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 9 Apr 2019 19:22:08 +0000 Subject: [PATCH] Don't pre-reserve resources for CPU devices when they are set. CPUs can use shared (RF_SHAREABLE) resources for the I/O port used for entering and exiting C states. If this I/O port is included in an ACPI system resource device, then this happens to still work, but if the port wasn't part of a system resource device, only the first CPU could allocate the I/O port and use C states since resource_list_reserve() was always allocating the resource from nexus0 without RF_SHAREABLE. By avoiding the reservation, the flags from the bus_alloc_resource() in the CPU driver (which include RF_SHAREABLE) are honored. PR: 236513 Reported by: stockhausen@collogia.de Sleuthing by: avg Reviewed by: avg MFC after: 2 weeks --- sys/dev/acpica/acpi.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sys/dev/acpica/acpi.c b/sys/dev/acpica/acpi.c index 8ba2f397d8df..7715f0f03b5d 100644 --- a/sys/dev/acpica/acpi.c +++ b/sys/dev/acpica/acpi.c @@ -1352,6 +1352,14 @@ acpi_set_resource(device_t dev, device_t child, int type, int rid, if (type == SYS_RES_IRQ) return (0); + /* + * Don't reserve resources for CPU devices. Some of these + * resources need to be allocated as shareable, but reservations + * are always non-shareable. + */ + if (device_get_devclass(child) == devclass_find("cpu")) + return (0); + /* * Reserve the resource. *