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

Commit 0edc0b32 authored by Jiri Slaby's avatar Jiri Slaby Committed by Ingo Molnar
Browse files

x86_32: apic/es7000_32, fix cpu_mask_to_apicid



Perform same-cluster checking even for masks with all (nr_cpu_ids)
bits set and report BAD_APICID on failure.

While at it, convert it to for_each_cpu.

Signed-off-by: default avatarJiri Slaby <jirislaby@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c2b20cbd
Loading
Loading
Loading
Loading
+10 −20
Original line number Diff line number Diff line
@@ -577,32 +577,22 @@ static int es7000_check_phys_apicid_present(int cpu_physical_apicid)

static unsigned int es7000_cpu_mask_to_apicid(const cpumask_t *cpumask)
{
	unsigned int cpu, num_bits_set, cpus_found = 0;
	int apicid;
	unsigned int round = 0;
	int cpu, uninitialized_var(apicid);

	num_bits_set = cpumask_weight(cpumask);
	/* Return id to all */
	if (num_bits_set == nr_cpu_ids)
		return es7000_cpu_to_logical_apicid(0);
	/*
	 * The cpus in the mask must all be on the apic cluster.  If are not
	 * on the same apicid cluster return default value of target_cpus():
	 * The cpus in the mask must all be on the apic cluster.
	 */
	cpu = cpumask_first(cpumask);
	apicid = es7000_cpu_to_logical_apicid(cpu);
	while (cpus_found < num_bits_set) {
		if (cpumask_test_cpu(cpu, cpumask)) {
	for_each_cpu(cpu, cpumask) {
		int new_apicid = es7000_cpu_to_logical_apicid(cpu);

			if (APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) {
		if (round && APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) {
			WARN(1, "Not a valid mask!");

				return es7000_cpu_to_logical_apicid(0);
			return BAD_APICID;
		}
		apicid = new_apicid;
			cpus_found++;
		}
		cpu++;
		round++;
	}
	return apicid;
}