Skip to content

Commit 34c5357

Browse files
ffainelliKAGA-KOKO
authored andcommitted
irqchip/bcm7038-l1: Implement irq_cpu_offline() callback
We did not implement an irq_cpu_offline callback for our irqchip, yet we support setting a given IRQ's affinity. This resulted in interrupts whose affinity mask included CPUs being taken offline not to work correctly once the CPU had been put offline. Fixes: 5f7f031 ("IRQCHIP: Add new driver for BCM7038-style level 1 interrupt controllers") Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Cc: linux-mips@linux-mips.org Cc: jason@lakedaemon.net Cc: marc.zyngier@arm.com Cc: cernekee@gmail.com Cc: jaedon.shin@gmail.com Cc: ralf@linux-mips.org Cc: justinpopo6@gmail.com Link: http://lkml.kernel.org/r/1477948656-12966-2-git-send-email-f.fainelli@gmail.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
1 parent b6e5d5b commit 34c5357

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

drivers/irqchip/irq-bcm7038-l1.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,31 @@ static int bcm7038_l1_set_affinity(struct irq_data *d,
215215
return 0;
216216
}
217217

218+
static void bcm7038_l1_cpu_offline(struct irq_data *d)
219+
{
220+
struct cpumask *mask = irq_data_get_affinity_mask(d);
221+
int cpu = smp_processor_id();
222+
cpumask_t new_affinity;
223+
224+
/* This CPU was not on the affinity mask */
225+
if (!cpumask_test_cpu(cpu, mask))
226+
return;
227+
228+
if (cpumask_weight(mask) > 1) {
229+
/*
230+
* Multiple CPU affinity, remove this CPU from the affinity
231+
* mask
232+
*/
233+
cpumask_copy(&new_affinity, mask);
234+
cpumask_clear_cpu(cpu, &new_affinity);
235+
} else {
236+
/* Only CPU, put on the lowest online CPU */
237+
cpumask_clear(&new_affinity);
238+
cpumask_set_cpu(cpumask_first(cpu_online_mask), &new_affinity);
239+
}
240+
irq_set_affinity_locked(d, &new_affinity, false);
241+
}
242+
218243
static int __init bcm7038_l1_init_one(struct device_node *dn,
219244
unsigned int idx,
220245
struct bcm7038_l1_chip *intc)
@@ -266,6 +291,7 @@ static struct irq_chip bcm7038_l1_irq_chip = {
266291
.irq_mask = bcm7038_l1_mask,
267292
.irq_unmask = bcm7038_l1_unmask,
268293
.irq_set_affinity = bcm7038_l1_set_affinity,
294+
.irq_cpu_offline = bcm7038_l1_cpu_offline,
269295
};
270296

271297
static int bcm7038_l1_map(struct irq_domain *d, unsigned int virq,

0 commit comments

Comments
 (0)