Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2203d6ed authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Fix ACPI processor power block initialization



Properly clear the memory, and set "pr->flags.power" only if a C2 or
deeper state is valid (to make the code match both the comment and
previous behaviour).

This fixes a boot-time lockup reported by Maneesh Soni when using
"maxcpus=1".

Acked-by: default avatarManeesh Soni <maneesh@in.ibm.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2656c076
Loading
Loading
Loading
Loading
+4 −10
Original line number Diff line number Diff line
@@ -514,8 +514,6 @@ static int acpi_processor_set_power_policy(struct acpi_processor *pr)

static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
{
	int i;

	ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_fadt");

	if (!pr)
@@ -524,8 +522,7 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)
	if (!pr->pblk)
		return_VALUE(-ENODEV);

	for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
		memset(pr->power.states, 0, sizeof(struct acpi_processor_cx));
	memset(pr->power.states, 0, sizeof(pr->power.states));

	/* if info is obtained from pblk/fadt, type equals state */
	pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
@@ -555,13 +552,9 @@ static int acpi_processor_get_power_info_fadt(struct acpi_processor *pr)

static int acpi_processor_get_power_info_default_c1(struct acpi_processor *pr)
{
	int i;

	ACPI_FUNCTION_TRACE("acpi_processor_get_power_info_default_c1");

	for (i = 0; i < ACPI_PROCESSOR_MAX_POWER; i++)
		memset(&(pr->power.states[i]), 0,
		       sizeof(struct acpi_processor_cx));
	memset(pr->power.states, 0, sizeof(pr->power.states));

	/* if info is obtained from pblk/fadt, type equals state */
	pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
@@ -873,6 +866,7 @@ static int acpi_processor_get_power_info(struct acpi_processor *pr)
	for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
		if (pr->power.states[i].valid) {
			pr->power.count = i;
			if (pr->power.states[i].type >= ACPI_STATE_C2)
				pr->flags.power = 1;
		}
	}