generic: sparse irqs: use irq_desc() together with dyn_array, instead of irq_desc[]
add CONFIG_HAVE_SPARSE_IRQ to for use condensed array. Get rid of irq_desc[] array assumptions. Preallocate 32 irq_desc, and irq_desc() will try to get more. ( No change in functionality is expected anywhere, except the odd build failure where we missed a code site or where a crossing commit itroduces new irq_desc[] usage. ) v2: according to Eric, change get_irq_desc() to irq_desc() Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -39,7 +39,7 @@ unsigned long probe_irq_on(void)
|
||||
* flush such a longstanding irq before considering it as spurious.
|
||||
*/
|
||||
for (i = nr_irqs-1; i > 0; i--) {
|
||||
desc = irq_desc + i;
|
||||
desc = irq_to_desc(i);
|
||||
|
||||
spin_lock_irq(&desc->lock);
|
||||
if (!desc->action && !(desc->status & IRQ_NOPROBE)) {
|
||||
@@ -69,7 +69,7 @@ unsigned long probe_irq_on(void)
|
||||
* happened in the previous stage, it may have masked itself)
|
||||
*/
|
||||
for (i = nr_irqs-1; i > 0; i--) {
|
||||
desc = irq_desc + i;
|
||||
desc = irq_to_desc(i);
|
||||
|
||||
spin_lock_irq(&desc->lock);
|
||||
if (!desc->action && !(desc->status & IRQ_NOPROBE)) {
|
||||
@@ -92,7 +92,7 @@ unsigned long probe_irq_on(void)
|
||||
for (i = 0; i < nr_irqs; i++) {
|
||||
unsigned int status;
|
||||
|
||||
desc = irq_desc + i;
|
||||
desc = irq_to_desc(i);
|
||||
spin_lock_irq(&desc->lock);
|
||||
status = desc->status;
|
||||
|
||||
@@ -131,7 +131,7 @@ unsigned int probe_irq_mask(unsigned long val)
|
||||
|
||||
mask = 0;
|
||||
for (i = 0; i < nr_irqs; i++) {
|
||||
struct irq_desc *desc = irq_desc + i;
|
||||
struct irq_desc *desc = irq_to_desc(i);
|
||||
unsigned int status;
|
||||
|
||||
spin_lock_irq(&desc->lock);
|
||||
@@ -174,7 +174,7 @@ int probe_irq_off(unsigned long val)
|
||||
int i, irq_found = 0, nr_irqs = 0;
|
||||
|
||||
for (i = 0; i < nr_irqs; i++) {
|
||||
struct irq_desc *desc = irq_desc + i;
|
||||
struct irq_desc *desc = irq_to_desc(i);
|
||||
unsigned int status;
|
||||
|
||||
spin_lock_irq(&desc->lock);
|
||||
|
@@ -33,7 +33,7 @@ void dynamic_irq_init(unsigned int irq)
|
||||
}
|
||||
|
||||
/* Ensure we don't have left over values from a previous use of this irq */
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
desc->status = IRQ_DISABLED;
|
||||
desc->chip = &no_irq_chip;
|
||||
@@ -65,7 +65,7 @@ void dynamic_irq_cleanup(unsigned int irq)
|
||||
return;
|
||||
}
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
if (desc->action) {
|
||||
spin_unlock_irqrestore(&desc->lock, flags);
|
||||
@@ -100,7 +100,7 @@ int set_irq_chip(unsigned int irq, struct irq_chip *chip)
|
||||
if (!chip)
|
||||
chip = &no_irq_chip;
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
irq_chip_set_defaults(chip);
|
||||
desc->chip = chip;
|
||||
@@ -126,7 +126,7 @@ int set_irq_type(unsigned int irq, unsigned int type)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
if (type == IRQ_TYPE_NONE)
|
||||
return 0;
|
||||
|
||||
@@ -155,7 +155,7 @@ int set_irq_data(unsigned int irq, void *data)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
desc->handler_data = data;
|
||||
spin_unlock_irqrestore(&desc->lock, flags);
|
||||
@@ -180,7 +180,7 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)
|
||||
"Trying to install msi data for IRQ%d\n", irq);
|
||||
return -EINVAL;
|
||||
}
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
desc->msi_desc = entry;
|
||||
if (entry)
|
||||
@@ -198,9 +198,10 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)
|
||||
*/
|
||||
int set_irq_chip_data(unsigned int irq, void *data)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc;
|
||||
unsigned long flags;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
if (irq >= nr_irqs || !desc->chip) {
|
||||
printk(KERN_ERR "BUG: bad set_irq_chip_data(IRQ#%d)\n", irq);
|
||||
return -EINVAL;
|
||||
@@ -219,8 +220,9 @@ EXPORT_SYMBOL(set_irq_chip_data);
|
||||
*/
|
||||
static void default_enable(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
desc->chip->unmask(irq);
|
||||
desc->status &= ~IRQ_MASKED;
|
||||
}
|
||||
@@ -237,7 +239,10 @@ static void default_disable(unsigned int irq)
|
||||
*/
|
||||
static unsigned int default_startup(unsigned int irq)
|
||||
{
|
||||
irq_desc[irq].chip->enable(irq);
|
||||
struct irq_desc *desc;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
desc->chip->enable(irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -247,8 +252,9 @@ static unsigned int default_startup(unsigned int irq)
|
||||
*/
|
||||
static void default_shutdown(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
desc->chip->mask(irq);
|
||||
desc->status |= IRQ_MASKED;
|
||||
}
|
||||
@@ -551,7 +557,7 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
|
||||
return;
|
||||
}
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
|
||||
if (!handle)
|
||||
handle = handle_bad_irq;
|
||||
@@ -616,7 +622,7 @@ void __init set_irq_noprobe(unsigned int irq)
|
||||
return;
|
||||
}
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
desc->status |= IRQ_NOPROBE;
|
||||
@@ -634,7 +640,7 @@ void __init set_irq_probe(unsigned int irq)
|
||||
return;
|
||||
}
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
desc->status &= ~IRQ_NOPROBE;
|
||||
|
@@ -18,6 +18,14 @@
|
||||
|
||||
#include "internals.h"
|
||||
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
|
||||
/*
|
||||
* lockdep: we want to handle all irq_desc locks as a single lock-class:
|
||||
*/
|
||||
static struct lock_class_key irq_desc_lock_class;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* handle_bad_irq - handle spurious and unhandled irqs
|
||||
* @irq: the interrupt number
|
||||
@@ -51,7 +59,8 @@ int nr_irqs = NR_IRQS;
|
||||
EXPORT_SYMBOL_GPL(nr_irqs);
|
||||
|
||||
#ifdef CONFIG_HAVE_DYN_ARRAY
|
||||
static struct irq_desc irq_desc_init __initdata = {
|
||||
static struct irq_desc irq_desc_init = {
|
||||
.irq = -1U,
|
||||
.status = IRQ_DISABLED,
|
||||
.chip = &no_irq_chip,
|
||||
.handle_irq = handle_bad_irq,
|
||||
@@ -62,6 +71,27 @@ static struct irq_desc irq_desc_init __initdata = {
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
static void init_one_irq_desc(struct irq_desc *desc)
|
||||
{
|
||||
memcpy(desc, &irq_desc_init, sizeof(struct irq_desc));
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
lockdep_set_class(&desc->lock, &irq_desc_lock_class);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAVE_SPARSE_IRQ
|
||||
static int nr_irq_desc = 32;
|
||||
|
||||
static int __init parse_nr_irq_desc(char *arg)
|
||||
{
|
||||
if (arg)
|
||||
nr_irq_desc = simple_strtoul(arg, NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_param("nr_irq_desc", parse_nr_irq_desc);
|
||||
|
||||
static void __init init_work(void *data)
|
||||
{
|
||||
struct dyn_array *da = data;
|
||||
@@ -71,12 +101,83 @@ static void __init init_work(void *data)
|
||||
desc = *da->name;
|
||||
|
||||
for (i = 0; i < *da->nr; i++)
|
||||
memcpy(&desc[i], &irq_desc_init, sizeof(struct irq_desc));
|
||||
init_one_irq_desc(&desc[i]);
|
||||
|
||||
for (i = 1; i < *da->nr; i++)
|
||||
desc[i-1].next = &desc[i];
|
||||
}
|
||||
|
||||
struct irq_desc *irq_desc;
|
||||
static struct irq_desc *sparse_irqs;
|
||||
DEFINE_DYN_ARRAY(sparse_irqs, sizeof(struct irq_desc), nr_irq_desc, PAGE_SIZE, init_work);
|
||||
|
||||
extern int after_bootmem;
|
||||
extern void *__alloc_bootmem_nopanic(unsigned long size,
|
||||
unsigned long align,
|
||||
unsigned long goal);
|
||||
struct irq_desc *irq_to_desc(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc, *desc_pri;
|
||||
int i;
|
||||
int count = 0;
|
||||
|
||||
BUG_ON(irq == -1U);
|
||||
|
||||
desc_pri = desc = &sparse_irqs[0];
|
||||
while (desc) {
|
||||
if (desc->irq == irq)
|
||||
return desc;
|
||||
|
||||
if (desc->irq == -1U) {
|
||||
desc->irq = irq;
|
||||
return desc;
|
||||
}
|
||||
desc_pri = desc;
|
||||
desc = desc->next;
|
||||
count++;
|
||||
}
|
||||
|
||||
/*
|
||||
* we run out of pre-allocate ones, allocate more
|
||||
*/
|
||||
printk(KERN_DEBUG "try to get more irq_desc %d\n", nr_irq_desc);
|
||||
|
||||
if (after_bootmem)
|
||||
desc = kzalloc(sizeof(struct irq_desc)*nr_irq_desc, GFP_ATOMIC);
|
||||
else
|
||||
desc = __alloc_bootmem_nopanic(sizeof(struct irq_desc)*nr_irq_desc, PAGE_SIZE, 0);
|
||||
|
||||
if (!desc)
|
||||
panic("please boot with nr_irq_desc= %d\n", count * 2);
|
||||
|
||||
for (i = 0; i < nr_irq_desc; i++)
|
||||
init_one_irq_desc(&desc[i]);
|
||||
|
||||
for (i = 1; i < nr_irq_desc; i++)
|
||||
desc[i-1].next = &desc[i];
|
||||
|
||||
desc->irq = irq;
|
||||
desc_pri->next = desc;
|
||||
|
||||
return desc;
|
||||
}
|
||||
#else
|
||||
static void __init init_work(void *data)
|
||||
{
|
||||
struct dyn_array *da = data;
|
||||
int i;
|
||||
struct irq_desc *desc;
|
||||
|
||||
desc = *da->name;
|
||||
|
||||
for (i = 0; i < *da->nr; i++)
|
||||
init_one_irq_desc(&desc[i]);
|
||||
|
||||
}
|
||||
static struct irq_desc *irq_desc;
|
||||
DEFINE_DYN_ARRAY(irq_desc, sizeof(struct irq_desc), nr_irqs, PAGE_SIZE, init_work);
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
|
||||
@@ -85,12 +186,23 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
|
||||
.chip = &no_irq_chip,
|
||||
.handle_irq = handle_bad_irq,
|
||||
.depth = 1,
|
||||
.lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock),
|
||||
.lock = __SPIN_LOCK_UNLOCKED(sparse_irqs->lock),
|
||||
#ifdef CONFIG_SMP
|
||||
.affinity = CPU_MASK_ALL
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_HAVE_SPARSE_IRQ
|
||||
struct irq_desc *irq_to_desc(unsigned int irq)
|
||||
{
|
||||
if (irq < nr_irqs)
|
||||
return &irq_desc[irq];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -99,7 +211,10 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
|
||||
*/
|
||||
static void ack_bad(unsigned int irq)
|
||||
{
|
||||
print_irq_desc(irq, irq_desc + irq);
|
||||
struct irq_desc *desc;
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
print_irq_desc(irq, desc);
|
||||
ack_bad_irq(irq);
|
||||
}
|
||||
|
||||
@@ -196,7 +311,7 @@ irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
|
||||
*/
|
||||
unsigned int __do_IRQ(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
struct irqaction *action;
|
||||
unsigned int status;
|
||||
|
||||
@@ -287,19 +402,16 @@ out:
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
|
||||
/*
|
||||
* lockdep: we want to handle all irq_desc locks as a single lock-class:
|
||||
*/
|
||||
static struct lock_class_key irq_desc_lock_class;
|
||||
|
||||
void early_init_irq_lock_class(void)
|
||||
{
|
||||
#ifndef CONFIG_HAVE_DYN_ARRAY
|
||||
int i;
|
||||
|
||||
for (i = 0; i < nr_irqs; i++)
|
||||
lockdep_set_class(&irq_desc[i].lock, &irq_desc_lock_class);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -31,7 +31,7 @@ cpumask_t irq_default_affinity = CPU_MASK_ALL;
|
||||
*/
|
||||
void synchronize_irq(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
unsigned int status;
|
||||
|
||||
if (irq >= nr_irqs)
|
||||
@@ -64,7 +64,7 @@ EXPORT_SYMBOL(synchronize_irq);
|
||||
*/
|
||||
int irq_can_set_affinity(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
|
||||
if (CHECK_IRQ_PER_CPU(desc->status) || !desc->chip ||
|
||||
!desc->chip->set_affinity)
|
||||
@@ -81,7 +81,7 @@ int irq_can_set_affinity(unsigned int irq)
|
||||
*/
|
||||
int irq_set_affinity(unsigned int irq, cpumask_t cpumask)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
|
||||
if (!desc->chip->set_affinity)
|
||||
return -EINVAL;
|
||||
@@ -111,14 +111,16 @@ int irq_set_affinity(unsigned int irq, cpumask_t cpumask)
|
||||
int irq_select_affinity(unsigned int irq)
|
||||
{
|
||||
cpumask_t mask;
|
||||
struct irq_desc *desc;
|
||||
|
||||
if (!irq_can_set_affinity(irq))
|
||||
return 0;
|
||||
|
||||
cpus_and(mask, cpu_online_map, irq_default_affinity);
|
||||
|
||||
irq_desc[irq].affinity = mask;
|
||||
irq_desc[irq].chip->set_affinity(irq, mask);
|
||||
desc = irq_to_desc(irq);
|
||||
desc->affinity = mask;
|
||||
desc->chip->set_affinity(irq, mask);
|
||||
|
||||
set_balance_irq_affinity(irq, mask);
|
||||
return 0;
|
||||
@@ -140,7 +142,7 @@ int irq_select_affinity(unsigned int irq)
|
||||
*/
|
||||
void disable_irq_nosync(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
unsigned long flags;
|
||||
|
||||
if (irq >= nr_irqs)
|
||||
@@ -169,7 +171,7 @@ EXPORT_SYMBOL(disable_irq_nosync);
|
||||
*/
|
||||
void disable_irq(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
|
||||
if (irq >= nr_irqs)
|
||||
return;
|
||||
@@ -211,7 +213,7 @@ static void __enable_irq(struct irq_desc *desc, unsigned int irq)
|
||||
*/
|
||||
void enable_irq(unsigned int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
unsigned long flags;
|
||||
|
||||
if (irq >= nr_irqs)
|
||||
@@ -225,7 +227,7 @@ EXPORT_SYMBOL(enable_irq);
|
||||
|
||||
static int set_irq_wake_real(unsigned int irq, unsigned int on)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
int ret = -ENXIO;
|
||||
|
||||
if (desc->chip->set_wake)
|
||||
@@ -248,7 +250,7 @@ static int set_irq_wake_real(unsigned int irq, unsigned int on)
|
||||
*/
|
||||
int set_irq_wake(unsigned int irq, unsigned int on)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
@@ -288,12 +290,13 @@ EXPORT_SYMBOL(set_irq_wake);
|
||||
*/
|
||||
int can_request_irq(unsigned int irq, unsigned long irqflags)
|
||||
{
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
struct irqaction *action;
|
||||
|
||||
if (irq >= nr_irqs || irq_desc[irq].status & IRQ_NOREQUEST)
|
||||
if (irq >= nr_irqs || desc->status & IRQ_NOREQUEST)
|
||||
return 0;
|
||||
|
||||
action = irq_desc[irq].action;
|
||||
action = desc->action;
|
||||
if (action)
|
||||
if (irqflags & action->flags & IRQF_SHARED)
|
||||
action = NULL;
|
||||
@@ -349,7 +352,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
|
||||
*/
|
||||
int setup_irq(unsigned int irq, struct irqaction *new)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
struct irqaction *old, **p;
|
||||
const char *old_name = NULL;
|
||||
unsigned long flags;
|
||||
@@ -518,7 +521,7 @@ void free_irq(unsigned int irq, void *dev_id)
|
||||
if (irq >= nr_irqs)
|
||||
return;
|
||||
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
p = &desc->action;
|
||||
for (;;) {
|
||||
@@ -615,6 +618,7 @@ int request_irq(unsigned int irq, irq_handler_t handler,
|
||||
{
|
||||
struct irqaction *action;
|
||||
int retval;
|
||||
struct irq_desc *desc;
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
/*
|
||||
@@ -632,7 +636,8 @@ int request_irq(unsigned int irq, irq_handler_t handler,
|
||||
return -EINVAL;
|
||||
if (irq >= nr_irqs)
|
||||
return -EINVAL;
|
||||
if (irq_desc[irq].status & IRQ_NOREQUEST)
|
||||
desc = irq_to_desc(irq);
|
||||
if (desc->status & IRQ_NOREQUEST)
|
||||
return -EINVAL;
|
||||
if (!handler)
|
||||
return -EINVAL;
|
||||
|
@@ -3,18 +3,18 @@
|
||||
|
||||
void set_pending_irq(unsigned int irq, cpumask_t mask)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&desc->lock, flags);
|
||||
desc->status |= IRQ_MOVE_PENDING;
|
||||
irq_desc[irq].pending_mask = mask;
|
||||
desc->pending_mask = mask;
|
||||
spin_unlock_irqrestore(&desc->lock, flags);
|
||||
}
|
||||
|
||||
void move_masked_irq(int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
cpumask_t tmp;
|
||||
|
||||
if (likely(!(desc->status & IRQ_MOVE_PENDING)))
|
||||
@@ -30,7 +30,7 @@ void move_masked_irq(int irq)
|
||||
|
||||
desc->status &= ~IRQ_MOVE_PENDING;
|
||||
|
||||
if (unlikely(cpus_empty(irq_desc[irq].pending_mask)))
|
||||
if (unlikely(cpus_empty(desc->pending_mask)))
|
||||
return;
|
||||
|
||||
if (!desc->chip->set_affinity)
|
||||
@@ -38,7 +38,7 @@ void move_masked_irq(int irq)
|
||||
|
||||
assert_spin_locked(&desc->lock);
|
||||
|
||||
cpus_and(tmp, irq_desc[irq].pending_mask, cpu_online_map);
|
||||
cpus_and(tmp, desc->pending_mask, cpu_online_map);
|
||||
|
||||
/*
|
||||
* If there was a valid mask to work with, please
|
||||
@@ -55,12 +55,12 @@ void move_masked_irq(int irq)
|
||||
if (likely(!cpus_empty(tmp))) {
|
||||
desc->chip->set_affinity(irq,tmp);
|
||||
}
|
||||
cpus_clear(irq_desc[irq].pending_mask);
|
||||
cpus_clear(desc->pending_mask);
|
||||
}
|
||||
|
||||
void move_native_irq(int irq)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
|
||||
if (likely(!(desc->status & IRQ_MOVE_PENDING)))
|
||||
return;
|
||||
|
@@ -19,7 +19,7 @@ static struct proc_dir_entry *root_irq_dir;
|
||||
|
||||
static int irq_affinity_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + (long)m->private;
|
||||
struct irq_desc *desc = irq_to_desc((long)m->private);
|
||||
cpumask_t *mask = &desc->affinity;
|
||||
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
@@ -43,7 +43,7 @@ static ssize_t irq_affinity_proc_write(struct file *file,
|
||||
cpumask_t new_value;
|
||||
int err;
|
||||
|
||||
if (!irq_desc[irq].chip->set_affinity || no_irq_affinity ||
|
||||
if (!irq_to_desc(irq)->chip->set_affinity || no_irq_affinity ||
|
||||
irq_balancing_disabled(irq))
|
||||
return -EIO;
|
||||
|
||||
@@ -132,20 +132,20 @@ static const struct file_operations default_affinity_proc_fops = {
|
||||
static int irq_spurious_read(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
{
|
||||
struct irq_desc *d = &irq_desc[(long) data];
|
||||
struct irq_desc *desc = irq_to_desc((long) data);
|
||||
return sprintf(page, "count %u\n"
|
||||
"unhandled %u\n"
|
||||
"last_unhandled %u ms\n",
|
||||
d->irq_count,
|
||||
d->irqs_unhandled,
|
||||
jiffies_to_msecs(d->last_unhandled));
|
||||
desc->irq_count,
|
||||
desc->irqs_unhandled,
|
||||
jiffies_to_msecs(desc->last_unhandled));
|
||||
}
|
||||
|
||||
#define MAX_NAMELEN 128
|
||||
|
||||
static int name_unique(unsigned int irq, struct irqaction *new_action)
|
||||
{
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
struct irqaction *action;
|
||||
unsigned long flags;
|
||||
int ret = 1;
|
||||
@@ -165,8 +165,9 @@ static int name_unique(unsigned int irq, struct irqaction *new_action)
|
||||
void register_handler_proc(unsigned int irq, struct irqaction *action)
|
||||
{
|
||||
char name [MAX_NAMELEN];
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
|
||||
if (!irq_desc[irq].dir || action->dir || !action->name ||
|
||||
if (!desc->dir || action->dir || !action->name ||
|
||||
!name_unique(irq, action))
|
||||
return;
|
||||
|
||||
@@ -174,7 +175,7 @@ void register_handler_proc(unsigned int irq, struct irqaction *action)
|
||||
snprintf(name, MAX_NAMELEN, "%s", action->name);
|
||||
|
||||
/* create /proc/irq/1234/handler/ */
|
||||
action->dir = proc_mkdir(name, irq_desc[irq].dir);
|
||||
action->dir = proc_mkdir(name, desc->dir);
|
||||
}
|
||||
|
||||
#undef MAX_NAMELEN
|
||||
@@ -185,25 +186,24 @@ void register_irq_proc(unsigned int irq)
|
||||
{
|
||||
char name [MAX_NAMELEN];
|
||||
struct proc_dir_entry *entry;
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
|
||||
if (!root_irq_dir ||
|
||||
(irq_desc[irq].chip == &no_irq_chip) ||
|
||||
irq_desc[irq].dir)
|
||||
if (!root_irq_dir || (desc->chip == &no_irq_chip) || desc->dir)
|
||||
return;
|
||||
|
||||
memset(name, 0, MAX_NAMELEN);
|
||||
sprintf(name, "%d", irq);
|
||||
|
||||
/* create /proc/irq/1234 */
|
||||
irq_desc[irq].dir = proc_mkdir(name, root_irq_dir);
|
||||
desc->dir = proc_mkdir(name, root_irq_dir);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* create /proc/irq/<irq>/smp_affinity */
|
||||
proc_create_data("smp_affinity", 0600, irq_desc[irq].dir,
|
||||
proc_create_data("smp_affinity", 0600, desc->dir,
|
||||
&irq_affinity_proc_fops, (void *)(long)irq);
|
||||
#endif
|
||||
|
||||
entry = create_proc_entry("spurious", 0444, irq_desc[irq].dir);
|
||||
entry = create_proc_entry("spurious", 0444, desc->dir);
|
||||
if (entry) {
|
||||
entry->data = (void *)(long)irq;
|
||||
entry->read_proc = irq_spurious_read;
|
||||
@@ -214,8 +214,10 @@ void register_irq_proc(unsigned int irq)
|
||||
|
||||
void unregister_handler_proc(unsigned int irq, struct irqaction *action)
|
||||
{
|
||||
if (action->dir)
|
||||
remove_proc_entry(action->dir->name, irq_desc[irq].dir);
|
||||
if (action->dir) {
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
remove_proc_entry(action->dir->name, desc->dir);
|
||||
}
|
||||
}
|
||||
|
||||
void register_default_affinity_proc(void)
|
||||
|
@@ -36,7 +36,7 @@ static void resend_irqs(unsigned long arg)
|
||||
while (!bitmap_empty(irqs_resend, nr_irqs)) {
|
||||
irq = find_first_bit(irqs_resend, nr_irqs);
|
||||
clear_bit(irq, irqs_resend);
|
||||
desc = irq_desc + irq;
|
||||
desc = irq_to_desc(irq);
|
||||
local_irq_disable();
|
||||
desc->handle_irq(irq, desc);
|
||||
local_irq_enable();
|
||||
|
@@ -92,11 +92,12 @@ static int misrouted_irq(int irq)
|
||||
int ok = 0;
|
||||
|
||||
for (i = 1; i < nr_irqs; i++) {
|
||||
struct irq_desc *desc = irq_desc + i;
|
||||
struct irq_desc *desc;
|
||||
|
||||
if (i == irq) /* Already tried */
|
||||
continue;
|
||||
|
||||
desc = irq_to_desc(i);
|
||||
if (try_one_irq(i, desc))
|
||||
ok = 1;
|
||||
}
|
||||
@@ -108,7 +109,7 @@ static void poll_spurious_irqs(unsigned long dummy)
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i < nr_irqs; i++) {
|
||||
struct irq_desc *desc = irq_desc + i;
|
||||
struct irq_desc *desc = irq_to_desc(i);
|
||||
unsigned int status;
|
||||
|
||||
/* Racy but it doesn't matter */
|
||||
|
Reference in New Issue
Block a user