Commit a2f9f438 authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar

x86_64: separate irq_cfgx from irq_cfgx_free

so later don't need to compare with -1U
Signed-off-by: default avatarYinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 67fb283e
...@@ -111,44 +111,44 @@ static void init_one_irq_cfg(struct irq_cfg *cfg) ...@@ -111,44 +111,44 @@ static void init_one_irq_cfg(struct irq_cfg *cfg)
memcpy(cfg, &irq_cfg_init, sizeof(struct irq_cfg)); memcpy(cfg, &irq_cfg_init, sizeof(struct irq_cfg));
} }
static struct irq_cfg *irq_cfgx;
static struct irq_cfg *irq_cfgx_free;
static void __init init_work(void *data) static void __init init_work(void *data)
{ {
struct dyn_array *da = data; struct dyn_array *da = data;
struct irq_cfg *cfg; struct irq_cfg *cfg;
int legacy_count;
int i; int i;
cfg = *da->name; cfg = *da->name;
memcpy(cfg, irq_cfg_legacy, sizeof(irq_cfg_legacy)); memcpy(cfg, irq_cfg_legacy, sizeof(irq_cfg_legacy));
i = sizeof(irq_cfg_legacy)/sizeof(irq_cfg_legacy[0]); legacy_count = sizeof(irq_cfg_legacy)/sizeof(irq_cfg_legacy[0]);
for (; i < *da->nr; i++) for (i = legacy_count; i < *da->nr; i++)
init_one_irq_cfg(&cfg[i]); init_one_irq_cfg(&cfg[i]);
for (i = 1; i < *da->nr; i++) for (i = 1; i < *da->nr; i++)
cfg[i-1].next = &cfg[i]; cfg[i-1].next = &cfg[i];
irq_cfgx_free = &irq_cfgx[legacy_count];
irq_cfgx[legacy_count - 1].next = NULL;
} }
#define for_each_irq_cfg(cfg) \ #define for_each_irq_cfg(cfg) \
for (cfg = irq_cfgx; cfg && cfg->irq != -1U; cfg = cfg->next) for (cfg = irq_cfgx; cfg; cfg = cfg->next)
static struct irq_cfg *irq_cfgx;
DEFINE_DYN_ARRAY(irq_cfgx, sizeof(struct irq_cfg), nr_irq_cfg, PAGE_SIZE, init_work); DEFINE_DYN_ARRAY(irq_cfgx, sizeof(struct irq_cfg), nr_irq_cfg, PAGE_SIZE, init_work);
static struct irq_cfg *irq_cfg(unsigned int irq) static struct irq_cfg *irq_cfg(unsigned int irq)
{ {
struct irq_cfg *cfg; struct irq_cfg *cfg;
BUG_ON(irq == -1U); cfg = irq_cfgx;
cfg = &irq_cfgx[0];
while (cfg) { while (cfg) {
if (cfg->irq == irq) if (cfg->irq == irq)
return cfg; return cfg;
if (cfg->irq == -1U)
return NULL;
cfg = cfg->next; cfg = cfg->next;
} }
...@@ -161,44 +161,70 @@ static struct irq_cfg *irq_cfg_alloc(unsigned int irq) ...@@ -161,44 +161,70 @@ static struct irq_cfg *irq_cfg_alloc(unsigned int irq)
int i; int i;
int count = 0; int count = 0;
BUG_ON(irq == -1U); cfg_pri = cfg = irq_cfgx;
cfg_pri = cfg = &irq_cfgx[0];
while (cfg) { while (cfg) {
if (cfg->irq == irq) if (cfg->irq == irq)
return cfg; return cfg;
if (cfg->irq == -1U) {
cfg->irq = irq;
return cfg;
}
cfg_pri = cfg; cfg_pri = cfg;
cfg = cfg->next; cfg = cfg->next;
count++; count++;
} }
if (!irq_cfgx_free) {
unsigned long phys;
unsigned long total_bytes;
/* /*
* we run out of pre-allocate ones, allocate more * we run out of pre-allocate ones, allocate more
*/ */
printk(KERN_DEBUG "try to get more irq_cfg %d\n", nr_irq_cfg); printk(KERN_DEBUG "try to get more irq_cfg %d\n", nr_irq_cfg);
total_bytes = sizeof(struct irq_cfg) * nr_irq_cfg;
if (after_bootmem) if (after_bootmem)
cfg = kzalloc(sizeof(struct irq_cfg)*nr_irq_cfg, GFP_ATOMIC); cfg = kzalloc(total_bytes, GFP_ATOMIC);
else else
cfg = __alloc_bootmem_nopanic(sizeof(struct irq_cfg)*nr_irq_cfg, PAGE_SIZE, 0); cfg = __alloc_bootmem_nopanic(total_bytes, PAGE_SIZE, 0);
if (!cfg) if (!cfg)
panic("please boot with nr_irq_cfg= %d\n", count * 2); panic("please boot with nr_irq_cfg= %d\n", count * 2);
phys = __pa(cfg);
printk(KERN_DEBUG "irq_irq ==> [%#lx - %#lx]\n", phys, phys + total_bytes);
for (i = 0; i < nr_irq_cfg; i++) for (i = 0; i < nr_irq_cfg; i++)
init_one_irq_cfg(&cfg[i]); init_one_irq_cfg(&cfg[i]);
for (i = 1; i < nr_irq_cfg; i++) for (i = 1; i < nr_irq_cfg; i++)
cfg[i-1].next = &cfg[i]; cfg[i-1].next = &cfg[i];
cfg->irq = irq; irq_cfgx_free = cfg;
}
cfg = irq_cfgx_free;
irq_cfgx_free = irq_cfgx_free->next;
cfg->next = NULL;
if (cfg_pri)
cfg_pri->next = cfg; cfg_pri->next = cfg;
else
irq_cfgx = cfg;
cfg->irq = irq;
printk(KERN_DEBUG "found new irq_cfg for irq %d\n", cfg->irq);
#ifdef CONFIG_HAVE_SPARSE_IRQ_DEBUG
{
/* dump the results */
struct irq_cfg *cfg;
unsigned long phys;
unsigned long bytes = sizeof(struct irq_cfg);
printk(KERN_DEBUG "=========================== %d\n", irq);
printk(KERN_DEBUG "irq_cfg dump after get that for %d\n", irq);
for_each_irq_cfg(cfg) {
phys = __pa(cfg);
printk(KERN_DEBUG "irq_cfg %d ==> [%#lx - %#lx]\n", cfg->irq, phys, phys + bytes);
}
printk(KERN_DEBUG "===========================\n");
}
#endif
return cfg; return cfg;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment