Unverified Commit 9b147854 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!11259 ACPI: processor_idle: Fix invalid comparison with insertion sort for latency

parents 8d1d3b03 979f3fa5
Loading
Loading
Loading
Loading
+16 −24
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@
#include <linux/acpi.h>
#include <linux/dmi.h>
#include <linux/sched.h>       /* need_resched() */
#include <linux/sort.h>
#include <linux/tick.h>
#include <linux/cpuidle.h>
#include <linux/cpu.h>
@@ -407,28 +406,24 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr,
	return;
}

static int acpi_cst_latency_cmp(const void *a, const void *b)
static void acpi_cst_latency_sort(struct acpi_processor_cx *states, size_t length)
{
	const struct acpi_processor_cx *x = a, *y = b;
	int i, j, k;

	if (!(x->valid && y->valid))
		return 0;
	if (x->latency > y->latency)
		return 1;
	if (x->latency < y->latency)
		return -1;
	return 0;
}
static void acpi_cst_latency_swap(void *a, void *b, int n)
{
	struct acpi_processor_cx *x = a, *y = b;
	u32 tmp;
	for (i = 1; i < length; i++) {
		if (!states[i].valid)
			continue;

	if (!(x->valid && y->valid))
		return;
	tmp = x->latency;
	x->latency = y->latency;
	y->latency = tmp;
		for (j = i - 1, k = i; j >= 0; j--) {
			if (!states[j].valid)
				continue;

			if (states[j].latency > states[k].latency)
				swap(states[j].latency, states[k].latency);

			k = j;
		}
	}
}

static int acpi_processor_power_verify(struct acpi_processor *pr)
@@ -473,10 +468,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)

	if (buggy_latency) {
		pr_notice("FW issue: working around C-state latencies out of order\n");
		sort(&pr->power.states[1], max_cstate,
		     sizeof(struct acpi_processor_cx),
		     acpi_cst_latency_cmp,
		     acpi_cst_latency_swap);
		acpi_cst_latency_sort(&pr->power.states[1], max_cstate);
	}

	lapic_timer_propagate_broadcast(pr);