Skip to content

Commit

Permalink
genirq: Implement irq_data based move_*_irq() versions
Browse files Browse the repository at this point in the history
No need to lookup the irq descriptor when calling from a chip callback
function which has irq_data already handy.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Thomas Gleixner committed Feb 19, 2011
1 parent 77694b4 commit a439520
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
4 changes: 4 additions & 0 deletions include/linux/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -363,9 +363,13 @@ extern void remove_irq(unsigned int irq, struct irqaction *act);
#if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ)
void move_native_irq(int irq);
void move_masked_irq(int irq);
void irq_move_irq(struct irq_data *data);
void irq_move_masked_irq(struct irq_data *data);
#else
static inline void move_native_irq(int irq) { }
static inline void move_masked_irq(int irq) { }
static inline void irq_move_irq(struct irq_data *data) { }
static inline void irq_move_masked_irq(struct irq_data *data) { }
#endif

extern int no_irq_affinity;
Expand Down
28 changes: 19 additions & 9 deletions kernel/irq/migration.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

#include "internals.h"

void move_masked_irq(int irq)
void irq_move_masked_irq(struct irq_data *idata)
{
struct irq_desc *desc = irq_to_desc(irq);
struct irq_chip *chip = desc->irq_data.chip;
struct irq_desc *desc = irq_data_to_desc(idata);
struct irq_chip *chip = idata->chip;

if (likely(!irqd_is_setaffinity_pending(&desc->irq_data)))
return;
Expand Down Expand Up @@ -53,12 +53,17 @@ void move_masked_irq(int irq)
cpumask_clear(desc->pending_mask);
}

void move_native_irq(int irq)
void move_masked_irq(int irq)
{
irq_move_masked_irq(irq_get_irq_data(irq));
}

void irq_move_irq(struct irq_data *idata)
{
struct irq_desc *desc = irq_to_desc(irq);
struct irq_desc *desc = irq_data_to_desc(idata);
bool masked;

if (likely(!irqd_is_setaffinity_pending(&desc->irq_data)))
if (likely(!irqd_is_setaffinity_pending(idata)))
return;

if (unlikely(desc->istate & IRQS_DISABLED))
Expand All @@ -71,8 +76,13 @@ void move_native_irq(int irq)
*/
masked = desc->istate & IRQS_MASKED;
if (!masked)
desc->irq_data.chip->irq_mask(&desc->irq_data);
move_masked_irq(irq);
idata->chip->irq_mask(idata);
irq_move_masked_irq(idata);
if (!masked)
desc->irq_data.chip->irq_unmask(&desc->irq_data);
idata->chip->irq_unmask(idata);
}

void move_native_irq(int irq)
{
irq_move_irq(irq_get_irq_data(irq));
}

0 comments on commit a439520

Please sign in to comment.