Messages in this thread Patch in this message | | | From | Yinghai Lu <> | Subject | [PATCH 36/42] x86_64: introduce irq_cfg_with_new | Date | Fri, 8 Aug 2008 14:52:42 -0700 |
| |
So could only call that one time, when we call add_irq_2_pin
Singed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> --- arch/x86/kernel/io_apic_64.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c index fc1c6ba..1466e4b 100644 --- a/arch/x86/kernel/io_apic_64.c +++ b/arch/x86/kernel/io_apic_64.c @@ -135,7 +135,7 @@ static void __init init_work(void *data) static struct irq_cfg *irq_cfgx; DEFINE_DYN_ARRAY(irq_cfgx, sizeof(struct irq_cfg), nr_irq_cfg, PAGE_SIZE, init_work); -static struct irq_cfg *irq_cfg_without_new(unsigned int irq) +static struct irq_cfg *irq_cfg(unsigned int irq) { struct irq_cfg *cfg; @@ -155,7 +155,7 @@ static struct irq_cfg *irq_cfg_without_new(unsigned int irq) return NULL; } -static struct irq_cfg *irq_cfg(unsigned int irq) +static struct irq_cfg *irq_cfg_with_new(unsigned int irq) { struct irq_cfg *cfg, *cfg_pri; int i; @@ -545,7 +545,8 @@ static void add_pin_to_irq(unsigned int irq, int apic, int pin) struct irq_cfg *cfg; struct irq_pin_list *entry; - cfg = irq_cfg(irq); + /* first time to refer irq_cfg, so with new */ + cfg = irq_cfg_with_new(irq); entry = cfg->irq_2_pin; if (!entry) { entry = get_one_free_irq_2_pin(); @@ -1208,13 +1209,15 @@ static int setup_ioapic_entry(int apic, int irq, static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, int trigger, int polarity) { - struct irq_cfg *cfg = irq_cfg(irq); + struct irq_cfg *cfg; struct IO_APIC_route_entry entry; cpumask_t mask; if (!IO_APIC_IRQ(irq)) return; + cfg = irq_cfg(irq); + mask = TARGET_CPUS; if (assign_irq_vector(irq, mask)) return; @@ -2490,8 +2493,11 @@ int create_irq(void) if (platform_legacy_irq(new)) continue; cfg_new = irq_cfg(new); - if (cfg_new->vector != 0) + if (cfg_new && cfg_new->vector != 0) continue; + /* check if need to create one */ + if (!cfg_new) + cfg_new = irq_cfg_with_new(new); if (__assign_irq_vector(new, TARGET_CPUS) == 0) irq = new; break; -- 1.5.4.5
| |