genirq: Warn when effective affinity is not updated
Emit a one time warning when the effective affinity mask is enabled in Kconfig, but the interrupt chip does not update the mask in its irq_set_affinity() callback, Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Marc Zyngier <marc.zyngier@arm.com> Link: http://lkml.kernel.org/r/alpine.DEB.2.20.1710042208400.2406@nanospull/479/merge
parent
8a5776a5f4
commit
19e1d4e947
|
|
@ -168,6 +168,19 @@ void irq_set_thread_affinity(struct irq_desc *desc)
|
||||||
set_bit(IRQTF_AFFINITY, &action->thread_flags);
|
set_bit(IRQTF_AFFINITY, &action->thread_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void irq_validate_effective_affinity(struct irq_data *data)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
|
||||||
|
const struct cpumask *m = irq_data_get_effective_affinity_mask(data);
|
||||||
|
struct irq_chip *chip = irq_data_get_irq_chip(data);
|
||||||
|
|
||||||
|
if (!cpumask_empty(m))
|
||||||
|
return;
|
||||||
|
pr_warn_once("irq_chip %s did not update eff. affinity mask of irq %u\n",
|
||||||
|
chip->name, data->irq);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
||||||
bool force)
|
bool force)
|
||||||
{
|
{
|
||||||
|
|
@ -181,6 +194,7 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask,
|
||||||
case IRQ_SET_MASK_OK_DONE:
|
case IRQ_SET_MASK_OK_DONE:
|
||||||
cpumask_copy(desc->irq_common_data.affinity, mask);
|
cpumask_copy(desc->irq_common_data.affinity, mask);
|
||||||
case IRQ_SET_MASK_OK_NOCOPY:
|
case IRQ_SET_MASK_OK_NOCOPY:
|
||||||
|
irq_validate_effective_affinity(data);
|
||||||
irq_set_thread_affinity(desc);
|
irq_set_thread_affinity(desc);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue