Skip to contentSkip to conversation

irqchip/gicv3: iterate over possible CPUs by for_each_possible_cpu()

PATCH Superseded zijun_hu 2 participants 4 messages Sep 14, 2017 – Sep 15, 2017

Subsystems (2)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore

zijun_hu

author
#0 lore raw

PATCH 1/1 irqchip/gicv3: iterate over possible CPUs by for_each_possible_cpu()

From: zijun_hu <[email protected]>

get_cpu_number() doesn't use existing helper to iterate over possible CPUs, so error happens in case of discontinuous @cpu_possible_mask such as 0b11110001.

fixed by using existing helper for_each_possible_cpu().

---
 drivers/irqchip/irq-gic-v3.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/irqchip/irq-gic-v3.c +4 -4
index 19d642eae096..2a0427c2971e 100644
@@ -990,7 +990,7 @@ static int get_cpu_number(struct device_node *dn)
 {
 	const __be32 *cell;
 	u64 hwid;
-	int i;
+	int cpu;
 
 	cell = of_get_property(dn, "reg", NULL);
 	if (!cell)
@@ -1004,9 +1004,9 @@ static int get_cpu_number(struct device_node *dn)
 	if (hwid & ~MPIDR_HWID_BITMASK)
 		return -1;
 
-	for (i = 0; i < num_possible_cpus(); i++)
-		if (cpu_logical_map(i) == hwid)
-			return i;
+	for_each_possible_cpu(cpu)
+		if (cpu_logical_map(cpu) == hwid)
+			return cpu;
 
 	return -1;
 }
Signature · 1 line
1.9.1
#1 lore raw
Quoted 5 lines · zijun_hu

From: zijun_hu <[email protected]>

get_cpu_number() doesn't use existing helper to iterate over possible CPUs, so error happens in case of discontinuous @cpu_possible_mask such as 0b11110001.

Do you have an example of such a situation? Your patch is definitely an improvement, but I'd like to understand how you get there...

Thanks,

	M.
Signature · 1 line
Jazz is not dead. It just smells funny.
author
#2 lore raw
Quoted 7 lines · Marc Zyngier
Quoted 5 lines · zijun_hu

From: zijun_hu <[email protected]>

get_cpu_number() doesn't use existing helper to iterate over possible CPUs, so error happens in case of discontinuous @cpu_possible_mask such as 0b11110001.

Quoted 7 lines

Do you have an example of such a situation? Your patch is definitely an improvement, but I'd like to understand how you get there...

Thanks,

	M.

a few conditions which maybe result in discontiguous @cpu_possible_mask are noticed and considered of by ARM64 init code as indicated by bellow code segments:
in arch/arm64/kernel/smp.c :
void __init smp_init_cpus(void) {
......

	/*
	 * We need to set the cpu_logical_map entries before enabling
	 * the cpus so that cpu processor description entries (DT cpu nodes
	 * and ACPI MADT entries) can be retrieved by matching the cpu hwid
	 * with entries in cpu_logical_map while initializing the cpus.
	 * If the cpu set-up fails, invalidate the cpu_logical_map entry.
	 */
	for (i = 1; i < nr_cpu_ids; i++) {
		if (cpu_logical_map(i) != INVALID_HWID) {
			if (smp_cpu_setup(i))
				cpu_logical_map(i) = INVALID_HWID;
		}
	}

......
}

/*
* Initialize cpu operations for a logical cpu and
* set it in the possible mask on success */
static int __init smp_cpu_setup(int cpu)

{
	if (cpu_read_ops(cpu))
		return -ENODEV;

	if (cpu_ops[cpu]->cpu_init(cpu))
		return -ENODEV;

	set_cpu_possible(cpu, true);

	return 0;
}

i browses GICv3 drivers code and notice that a little weird code segments

#3 lore raw
Quoted 21 lines · zijun_hu
Quoted 7 lines · Marc Zyngier
Quoted 5 lines · zijun_hu

From: zijun_hu <[email protected]>

get_cpu_number() doesn't use existing helper to iterate over possible CPUs, so error happens in case of discontinuous @cpu_possible_mask such as 0b11110001.

Quoted 7 lines

Do you have an example of such a situation? Your patch is definitely an improvement, but I'd like to understand how you get there...

Thanks,

	M.

a few conditions which maybe result in discontiguous @cpu_possible_mask are noticed and considered of by ARM64 init code as indicated by bellow code segments:
in arch/arm64/kernel/smp.c :
void __init smp_init_cpus(void) {
......

Quoted 13 lines
	/*
	 * We need to set the cpu_logical_map entries before enabling
	 * the cpus so that cpu processor description entries (DT cpu nodes
	 * and ACPI MADT entries) can be retrieved by matching the cpu hwid
	 * with entries in cpu_logical_map while initializing the cpus.
	 * If the cpu set-up fails, invalidate the cpu_logical_map entry.
	 */
	for (i = 1; i < nr_cpu_ids; i++) {
		if (cpu_logical_map(i) != INVALID_HWID) {
			if (smp_cpu_setup(i))
				cpu_logical_map(i) = INVALID_HWID;
		}
	}

Right. It is not so much that the CPU doesn't exist as I initially thought (and couldn't really believe that it could happen), but rather that the CPU may have failed to come up (which is slightly more likely).

Well spotted. Would you mind respinning it with a commit message that outlines the condition under which this can happen? I'll the take it as a fix post -rc1.

Thanks,

	M.
Signature · 1 line
Jazz is not dead. It just smells funny.