mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 07:23:14 +00:00
genirq: Provide new interfaces for affinity hints
The discussion about removing the side effect of irq_set_affinity_hint() of actually applying the cpumask (if not NULL) as affinity to the interrupt, unearthed a few unpleasantries: 1) The modular perf drivers rely on the current behaviour for the very wrong reasons. 2) While none of the other drivers prevents user space from changing the affinity, a cursorily inspection shows that there are at least expectations in some drivers. #1 needs to be cleaned up anyway, so that's not a problem #2 might result in subtle regressions especially when irqbalanced (which nowadays ignores the affinity hint) is disabled. Provide new interfaces: irq_update_affinity_hint() - Only sets the affinity hint pointer irq_set_affinity_and_hint() - Set the pointer and apply the affinity to the interrupt Make irq_set_affinity_hint() a wrapper around irq_apply_affinity_hint() and document it to be phased out. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Nitesh Narayan Lal <nitesh@redhat.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Ming Lei <ming.lei@redhat.com> Link: https://lore.kernel.org/r/20210501021832.743094-1-jesse.brandeburg@intel.com Link: https://lore.kernel.org/r/20210903152430.244937-2-nitesh@redhat.com
This commit is contained in:
parent
4946f15e8c
commit
65c7cdedeb
@ -329,7 +329,46 @@ extern int irq_force_affinity(unsigned int irq, const struct cpumask *cpumask);
|
||||
extern int irq_can_set_affinity(unsigned int irq);
|
||||
extern int irq_select_affinity(unsigned int irq);
|
||||
|
||||
extern int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m);
|
||||
extern int __irq_apply_affinity_hint(unsigned int irq, const struct cpumask *m,
|
||||
bool setaffinity);
|
||||
|
||||
/**
|
||||
* irq_update_affinity_hint - Update the affinity hint
|
||||
* @irq: Interrupt to update
|
||||
* @m: cpumask pointer (NULL to clear the hint)
|
||||
*
|
||||
* Updates the affinity hint, but does not change the affinity of the interrupt.
|
||||
*/
|
||||
static inline int
|
||||
irq_update_affinity_hint(unsigned int irq, const struct cpumask *m)
|
||||
{
|
||||
return __irq_apply_affinity_hint(irq, m, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_set_affinity_and_hint - Update the affinity hint and apply the provided
|
||||
* cpumask to the interrupt
|
||||
* @irq: Interrupt to update
|
||||
* @m: cpumask pointer (NULL to clear the hint)
|
||||
*
|
||||
* Updates the affinity hint and if @m is not NULL it applies it as the
|
||||
* affinity of that interrupt.
|
||||
*/
|
||||
static inline int
|
||||
irq_set_affinity_and_hint(unsigned int irq, const struct cpumask *m)
|
||||
{
|
||||
return __irq_apply_affinity_hint(irq, m, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Deprecated. Use irq_update_affinity_hint() or irq_set_affinity_and_hint()
|
||||
* instead.
|
||||
*/
|
||||
static inline int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m)
|
||||
{
|
||||
return irq_set_affinity_and_hint(irq, m);
|
||||
}
|
||||
|
||||
extern int irq_update_affinity_desc(unsigned int irq,
|
||||
struct irq_affinity_desc *affinity);
|
||||
|
||||
@ -361,6 +400,18 @@ static inline int irq_can_set_affinity(unsigned int irq)
|
||||
|
||||
static inline int irq_select_affinity(unsigned int irq) { return 0; }
|
||||
|
||||
static inline int irq_update_affinity_hint(unsigned int irq,
|
||||
const struct cpumask *m)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int irq_set_affinity_and_hint(unsigned int irq,
|
||||
const struct cpumask *m)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int irq_set_affinity_hint(unsigned int irq,
|
||||
const struct cpumask *m)
|
||||
{
|
||||
|
@ -486,7 +486,8 @@ int irq_force_affinity(unsigned int irq, const struct cpumask *cpumask)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(irq_force_affinity);
|
||||
|
||||
int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m)
|
||||
int __irq_apply_affinity_hint(unsigned int irq, const struct cpumask *m,
|
||||
bool setaffinity)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct irq_desc *desc = irq_get_desc_lock(irq, &flags, IRQ_GET_DESC_CHECK_GLOBAL);
|
||||
@ -495,12 +496,11 @@ int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m)
|
||||
return -EINVAL;
|
||||
desc->affinity_hint = m;
|
||||
irq_put_desc_unlock(desc, flags);
|
||||
/* set the initial affinity to prevent every interrupt being on CPU0 */
|
||||
if (m)
|
||||
if (m && setaffinity)
|
||||
__irq_set_affinity(irq, m, false);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(irq_set_affinity_hint);
|
||||
EXPORT_SYMBOL_GPL(__irq_apply_affinity_hint);
|
||||
|
||||
static void irq_affinity_notify(struct work_struct *work)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user