mirror of https://github.com/torvalds/linux.git
genirq: Add affinity to percpu_devid interrupt requests
Add an affinity field to both the irqaction structure and the interrupt request primitives. Nothing is making use of it yet, and the only value used it NULL, which is used as a shorthand for cpu_possible_mask. This will shortly get used with actual affinities. Signed-off-by: Marc Zyngier <maz@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Will Deacon <will@kernel.org> Link: https://patch.msgid.link/20251020122944.3074811-15-maz@kernel.org
This commit is contained in:
parent
9047a39daa
commit
258e7d28a3
|
|
@ -125,6 +125,7 @@ struct irqaction {
|
|||
void *dev_id;
|
||||
void __percpu *percpu_dev_id;
|
||||
};
|
||||
const struct cpumask *affinity;
|
||||
struct irqaction *next;
|
||||
irq_handler_t thread_fn;
|
||||
struct task_struct *thread;
|
||||
|
|
@ -181,7 +182,7 @@ request_any_context_irq(unsigned int irq, irq_handler_t handler,
|
|||
extern int __must_check
|
||||
__request_percpu_irq(unsigned int irq, irq_handler_t handler,
|
||||
unsigned long flags, const char *devname,
|
||||
void __percpu *percpu_dev_id);
|
||||
const cpumask_t *affinity, void __percpu *percpu_dev_id);
|
||||
|
||||
extern int __must_check
|
||||
request_nmi(unsigned int irq, irq_handler_t handler, unsigned long flags,
|
||||
|
|
@ -192,7 +193,7 @@ request_percpu_irq(unsigned int irq, irq_handler_t handler,
|
|||
const char *devname, void __percpu *percpu_dev_id)
|
||||
{
|
||||
return __request_percpu_irq(irq, handler, 0,
|
||||
devname, percpu_dev_id);
|
||||
devname, NULL, percpu_dev_id);
|
||||
}
|
||||
|
||||
extern int __must_check
|
||||
|
|
|
|||
|
|
@ -2444,10 +2444,14 @@ int setup_percpu_irq(unsigned int irq, struct irqaction *act)
|
|||
|
||||
static
|
||||
struct irqaction *create_percpu_irqaction(irq_handler_t handler, unsigned long flags,
|
||||
const char *devname, void __percpu *dev_id)
|
||||
const char *devname, const cpumask_t *affinity,
|
||||
void __percpu *dev_id)
|
||||
{
|
||||
struct irqaction *action;
|
||||
|
||||
if (!affinity)
|
||||
affinity = cpu_possible_mask;
|
||||
|
||||
action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);
|
||||
if (!action)
|
||||
return NULL;
|
||||
|
|
@ -2456,6 +2460,7 @@ struct irqaction *create_percpu_irqaction(irq_handler_t handler, unsigned long f
|
|||
action->flags = flags | IRQF_PERCPU | IRQF_NO_SUSPEND;
|
||||
action->name = devname;
|
||||
action->percpu_dev_id = dev_id;
|
||||
action->affinity = affinity;
|
||||
|
||||
return action;
|
||||
}
|
||||
|
|
@ -2466,6 +2471,7 @@ struct irqaction *create_percpu_irqaction(irq_handler_t handler, unsigned long f
|
|||
* @handler: Function to be called when the IRQ occurs.
|
||||
* @flags: Interrupt type flags (IRQF_TIMER only)
|
||||
* @devname: An ascii name for the claiming device
|
||||
* @affinity: A cpumask describing the target CPUs for this interrupt
|
||||
* @dev_id: A percpu cookie passed back to the handler function
|
||||
*
|
||||
* This call allocates interrupt resources, but doesn't enable the interrupt
|
||||
|
|
@ -2478,7 +2484,7 @@ struct irqaction *create_percpu_irqaction(irq_handler_t handler, unsigned long f
|
|||
*/
|
||||
int __request_percpu_irq(unsigned int irq, irq_handler_t handler,
|
||||
unsigned long flags, const char *devname,
|
||||
void __percpu *dev_id)
|
||||
const cpumask_t *affinity, void __percpu *dev_id)
|
||||
{
|
||||
struct irqaction *action;
|
||||
struct irq_desc *desc;
|
||||
|
|
@ -2495,7 +2501,7 @@ int __request_percpu_irq(unsigned int irq, irq_handler_t handler,
|
|||
if (flags && flags != IRQF_TIMER)
|
||||
return -EINVAL;
|
||||
|
||||
action = create_percpu_irqaction(handler, flags, devname, dev_id);
|
||||
action = create_percpu_irqaction(handler, flags, devname, affinity, dev_id);
|
||||
if (!action)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -2560,7 +2566,7 @@ int request_percpu_nmi(unsigned int irq, irq_handler_t handler,
|
|||
return -EINVAL;
|
||||
|
||||
action = create_percpu_irqaction(handler, IRQF_NO_THREAD | IRQF_NOBALANCING,
|
||||
name, dev_id);
|
||||
name, NULL, dev_id);
|
||||
if (!action)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue