* [PATCH 1/2] irq: sparseirq enabling
@ 2008-11-24 2:59 Yinghai Lu
2008-11-24 14:40 ` Ingo Molnar
0 siblings, 1 reply; 20+ messages in thread
From: Yinghai Lu @ 2008-11-24 2:59 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel@vger.kernel.org
impact: new feature sparseirq
add some kind of hash table as Ingo suggesting.
remove dyna_array
when sparse_irq is used (CONFIG_SPARSE_IRQ), use kzalloc_node to get irq_desc, irq_cfg
use desc->chip_data for x86 to store irq_cfg
also prepare
need to add struct (irq_desc **descp) to ack_edge/level to make sure desc get updated
try to pass desc cfg as more as possible to avoid list looking up.
seperate move_irq_desc to another patch
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/Kconfig | 11
arch/x86/include/asm/hpet.h | 7
arch/x86/include/asm/irq_vectors.h | 2
arch/x86/kernel/hpet.c | 23 -
arch/x86/kernel/i8259.c | 29 +
arch/x86/kernel/io_apic.c | 751 +++++++++++++++++++++++++------------
arch/x86/kernel/irq.c | 24 +
arch/x86/kernel/irq_32.c | 4
arch/x86/kernel/irq_64.c | 8
arch/x86/kernel/irqinit_32.c | 3
arch/x86/kernel/irqinit_64.c | 3
arch/x86/kernel/uv_irq.c | 27 +
drivers/char/random.c | 31 +
drivers/pci/htirq.c | 44 +-
drivers/pci/intel-iommu.c | 23 -
drivers/pci/intr_remapping.c | 72 +++
drivers/pci/msi.c | 71 ++-
drivers/xen/events.c | 9
fs/proc/interrupts.c | 18
fs/proc/stat.c | 17
include/linux/dmar.h | 7
include/linux/htirq.h | 8
include/linux/interrupt.h | 2
include/linux/irq.h | 97 ++++
include/linux/irqnr.h | 15
include/linux/kernel_stat.h | 14
include/linux/msi.h | 10
init/main.c | 11
kernel/irq/autoprobe.c | 10
kernel/irq/chip.c | 39 +
kernel/irq/handle.c | 246 +++++++++++-
kernel/irq/manage.c | 6
kernel/irq/migration.c | 34 +
kernel/irq/proc.c | 3
kernel/irq/spurious.c | 4
35 files changed, 1313 insertions(+), 370 deletions(-)
Index: linux-2.6/arch/x86/Kconfig
===================================================================
--- linux-2.6.orig/arch/x86/Kconfig
+++ linux-2.6/arch/x86/Kconfig
@@ -241,6 +241,17 @@ config X86_HAS_BOOT_CPU_ID
def_bool y
depends on X86_VOYAGER
+config SPARSE_IRQ
+ bool "Support sparse irq numbering"
+ depends on PCI_MSI || HT_IRQ
+ default y
+ help
+ This enables support for sparse irq, esp for msi/msi-x. the irq
+ number will be bus/dev/fn + 12bit. You may need if you have lots of
+ cards supports msi-x installed.
+
+ If you don't know what to do here, say Y.
+
config X86_FIND_SMP_CONFIG
def_bool y
depends on X86_MPPARSE || X86_VOYAGER
Index: linux-2.6/arch/x86/kernel/io_apic.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/io_apic.c
+++ linux-2.6/arch/x86/kernel/io_apic.c
@@ -108,8 +108,33 @@ static int __init parse_noapic(char *str
early_param("noapic", parse_noapic);
struct irq_pin_list;
+
+/*
+ * This is performance-critical, we want to do it O(1)
+ *
+ * the indexing order of this array favors 1:1 mappings
+ * between pins and IRQs.
+ */
+
+struct irq_pin_list {
+ int apic, pin;
+ struct irq_pin_list *next;
+};
+
+static struct irq_pin_list *get_one_free_irq_2_pin(int cpu)
+{
+ struct irq_pin_list *pin;
+ int node;
+
+ node = cpu_to_node(cpu);
+
+ pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_2_pin on cpu %d node %d\n", cpu, node);
+
+ return pin;
+}
+
struct irq_cfg {
- unsigned int irq;
struct irq_pin_list *irq_2_pin;
cpumask_t domain;
cpumask_t old_domain;
@@ -119,81 +144,102 @@ struct irq_cfg {
};
/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_cfg irq_cfgx[] = {
+#else
static struct irq_cfg irq_cfgx[NR_IRQS] = {
- [0] = { .irq = 0, .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
- [1] = { .irq = 1, .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
- [2] = { .irq = 2, .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
- [3] = { .irq = 3, .domain = CPU_MASK_ALL, .vector = IRQ3_VECTOR, },
- [4] = { .irq = 4, .domain = CPU_MASK_ALL, .vector = IRQ4_VECTOR, },
- [5] = { .irq = 5, .domain = CPU_MASK_ALL, .vector = IRQ5_VECTOR, },
- [6] = { .irq = 6, .domain = CPU_MASK_ALL, .vector = IRQ6_VECTOR, },
- [7] = { .irq = 7, .domain = CPU_MASK_ALL, .vector = IRQ7_VECTOR, },
- [8] = { .irq = 8, .domain = CPU_MASK_ALL, .vector = IRQ8_VECTOR, },
- [9] = { .irq = 9, .domain = CPU_MASK_ALL, .vector = IRQ9_VECTOR, },
- [10] = { .irq = 10, .domain = CPU_MASK_ALL, .vector = IRQ10_VECTOR, },
- [11] = { .irq = 11, .domain = CPU_MASK_ALL, .vector = IRQ11_VECTOR, },
- [12] = { .irq = 12, .domain = CPU_MASK_ALL, .vector = IRQ12_VECTOR, },
- [13] = { .irq = 13, .domain = CPU_MASK_ALL, .vector = IRQ13_VECTOR, },
- [14] = { .irq = 14, .domain = CPU_MASK_ALL, .vector = IRQ14_VECTOR, },
- [15] = { .irq = 15, .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
+#endif
+ [0] = { .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
+ [1] = { .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
+ [2] = { .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
+ [3] = { .domain = CPU_MASK_ALL, .vector = IRQ3_VECTOR, },
+ [4] = { .domain = CPU_MASK_ALL, .vector = IRQ4_VECTOR, },
+ [5] = { .domain = CPU_MASK_ALL, .vector = IRQ5_VECTOR, },
+ [6] = { .domain = CPU_MASK_ALL, .vector = IRQ6_VECTOR, },
+ [7] = { .domain = CPU_MASK_ALL, .vector = IRQ7_VECTOR, },
+ [8] = { .domain = CPU_MASK_ALL, .vector = IRQ8_VECTOR, },
+ [9] = { .domain = CPU_MASK_ALL, .vector = IRQ9_VECTOR, },
+ [10] = { .domain = CPU_MASK_ALL, .vector = IRQ10_VECTOR, },
+ [11] = { .domain = CPU_MASK_ALL, .vector = IRQ11_VECTOR, },
+ [12] = { .domain = CPU_MASK_ALL, .vector = IRQ12_VECTOR, },
+ [13] = { .domain = CPU_MASK_ALL, .vector = IRQ13_VECTOR, },
+ [14] = { .domain = CPU_MASK_ALL, .vector = IRQ14_VECTOR, },
+ [15] = { .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
};
-#define for_each_irq_cfg(irq, cfg) \
- for (irq = 0, cfg = irq_cfgx; irq < nr_irqs; irq++, cfg++)
-
-static struct irq_cfg *irq_cfg(unsigned int irq)
+void __init arch_early_irq_init(void)
{
- return irq < nr_irqs ? irq_cfgx + irq : NULL;
+ struct irq_cfg *cfg;
+ struct irq_desc *desc;
+ int count;
+ int i;
+#ifdef CONFIG_SPARSE_IRQ
+ int count_desc = NR_IRQS_LEGACY;
+#else
+ int count_desc = NR_IRQS;
+#endif
+
+ cfg = irq_cfgx;
+ count = ARRAY_SIZE(irq_cfgx);
+
+ BUG_ON(count > count_desc);
+
+ for (i = 0; i < count; i++) {
+ desc = irq_to_desc(i);
+ desc->chip_data = &cfg[i];
+ }
}
-static struct irq_cfg *irq_cfg_alloc(unsigned int irq)
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_cfg *irq_cfg(unsigned int irq)
{
- return irq_cfg(irq);
+ struct irq_cfg *cfg = NULL;
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+ if (desc)
+ cfg = desc->chip_data;
+
+ return cfg;
}
-/*
- * Rough estimation of how many shared IRQs there are, can be changed
- * anytime.
- */
-#define MAX_PLUS_SHARED_IRQS NR_IRQS
-#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
+static struct irq_cfg *get_one_free_irq_cfg(int cpu)
+{
+ struct irq_cfg *cfg;
+ int node;
-/*
- * This is performance-critical, we want to do it O(1)
- *
- * the indexing order of this array favors 1:1 mappings
- * between pins and IRQs.
- */
+ node = cpu_to_node(cpu);
-struct irq_pin_list {
- int apic, pin;
- struct irq_pin_list *next;
-};
+ cfg = kzalloc_node(sizeof(*cfg), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_cfg on cpu %d node %d\n", cpu, node);
-static struct irq_pin_list irq_2_pin_head[PIN_MAP_SIZE];
-static struct irq_pin_list *irq_2_pin_ptr;
+ return cfg;
+}
-static void __init irq_2_pin_init(void)
+void arch_init_chip_data(struct irq_desc *desc, int cpu)
{
- struct irq_pin_list *pin = irq_2_pin_head;
- int i;
-
- for (i = 1; i < PIN_MAP_SIZE; i++)
- pin[i-1].next = &pin[i];
+ struct irq_cfg *cfg;
- irq_2_pin_ptr = &pin[0];
+ cfg = desc->chip_data;
+ if (!cfg) {
+ desc->chip_data = get_one_free_irq_cfg(cpu);
+ if (!desc->chip_data) {
+ printk(KERN_ERR "can not alloc irq_cfg\n");
+ BUG_ON(1);
+ }
+ }
}
-static struct irq_pin_list *get_one_free_irq_2_pin(void)
+#else
+static struct irq_cfg *irq_cfg(unsigned int irq)
{
- struct irq_pin_list *pin = irq_2_pin_ptr;
+ return irq < nr_irqs ? irq_cfgx + irq : NULL;
+}
- if (!pin)
- panic("can not get more irq_2_pin\n");
+#endif
- irq_2_pin_ptr = pin->next;
- pin->next = NULL;
- return pin;
+static inline void set_extra_move_desc(struct irq_desc *desc, cpumask_t mask)
+{
}
struct io_apic {
@@ -237,11 +283,10 @@ static inline void io_apic_modify(unsign
writel(value, &io_apic->data);
}
-static bool io_apic_level_ack_pending(unsigned int irq)
+static bool io_apic_level_ack_pending(struct irq_cfg *cfg)
{
struct irq_pin_list *entry;
unsigned long flags;
- struct irq_cfg *cfg = irq_cfg(irq);
spin_lock_irqsave(&ioapic_lock, flags);
entry = cfg->irq_2_pin;
@@ -323,13 +368,12 @@ static void ioapic_mask_entry(int apic,
}
#ifdef CONFIG_SMP
-static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, u8 vector)
+static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg)
{
int apic, pin;
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
+ u8 vector = cfg->vector;
- cfg = irq_cfg(irq);
entry = cfg->irq_2_pin;
for (;;) {
unsigned int reg;
@@ -359,24 +403,27 @@ static void __target_IO_APIC_irq(unsigne
}
}
-static int assign_irq_vector(int irq, cpumask_t mask);
+static int assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask);
-static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+static void set_ioapic_affinity_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
unsigned long flags;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- cfg = irq_cfg(irq);
- if (assign_irq_vector(irq, mask))
+ irq = desc->irq;
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
/*
@@ -384,12 +431,24 @@ static void set_ioapic_affinity_irq(unsi
*/
dest = SET_APIC_LOGICAL_ID(dest);
- desc = irq_to_desc(irq);
spin_lock_irqsave(&ioapic_lock, flags);
- __target_IO_APIC_irq(irq, dest, cfg->vector);
+ __target_IO_APIC_irq(irq, dest, cfg);
desc->affinity = mask;
spin_unlock_irqrestore(&ioapic_lock, flags);
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define set_ioapic_affinity_irq set_ioapic_affinity_irq_desc
+#else
+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ set_ioapic_affinity_irq_desc(desc, mask);
+}
+#endif
#endif /* CONFIG_SMP */
/*
@@ -397,16 +456,18 @@ static void set_ioapic_affinity_irq(unsi
* shared ISA-space IRQs, so we have to support them. We are super
* fast in the common case, and fast for shared ISA-space IRQs.
*/
-static void add_pin_to_irq(unsigned int irq, int apic, int pin)
+static void add_pin_to_irq_cpu(struct irq_cfg *cfg, int cpu, int apic, int pin)
{
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
- /* first time to refer irq_cfg, so with new */
- cfg = irq_cfg_alloc(irq);
entry = cfg->irq_2_pin;
if (!entry) {
- entry = get_one_free_irq_2_pin();
+ entry = get_one_free_irq_2_pin(cpu);
+ if (!entry) {
+ printk(KERN_ERR "can not alloc irq_2_pin to add %d - %d\n",
+ apic, pin);
+ return;
+ }
cfg->irq_2_pin = entry;
entry->apic = apic;
entry->pin = pin;
@@ -421,7 +482,7 @@ static void add_pin_to_irq(unsigned int
entry = entry->next;
}
- entry->next = get_one_free_irq_2_pin();
+ entry->next = get_one_free_irq_2_pin(cpu);
entry = entry->next;
entry->apic = apic;
entry->pin = pin;
@@ -430,11 +491,10 @@ static void add_pin_to_irq(unsigned int
/*
* Reroute an IRQ to a different pin.
*/
-static void __init replace_pin_at_irq(unsigned int irq,
+static void __init replace_pin_at_irq_cpu(struct irq_cfg *cfg, int cpu,
int oldapic, int oldpin,
int newapic, int newpin)
{
- struct irq_cfg *cfg = irq_cfg(irq);
struct irq_pin_list *entry = cfg->irq_2_pin;
int replaced = 0;
@@ -451,18 +511,16 @@ static void __init replace_pin_at_irq(un
/* why? call replace before add? */
if (!replaced)
- add_pin_to_irq(irq, newapic, newpin);
+ add_pin_to_irq_cpu(cfg, cpu, newapic, newpin);
}
-static inline void io_apic_modify_irq(unsigned int irq,
+static inline void io_apic_modify_irq(struct irq_cfg *cfg,
int mask_and, int mask_or,
void (*final)(struct irq_pin_list *entry))
{
int pin;
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
- cfg = irq_cfg(irq);
for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) {
unsigned int reg;
pin = entry->pin;
@@ -475,9 +533,9 @@ static inline void io_apic_modify_irq(un
}
}
-static void __unmask_IO_APIC_irq(unsigned int irq)
+static void __unmask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED, 0, NULL);
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED, 0, NULL);
}
#ifdef CONFIG_X86_64
@@ -492,47 +550,69 @@ void io_apic_sync(struct irq_pin_list *e
readl(&io_apic->data);
}
-static void __mask_IO_APIC_irq(unsigned int irq)
+static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
+ io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
}
#else /* CONFIG_X86_32 */
-static void __mask_IO_APIC_irq(unsigned int irq)
+static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, NULL);
+ io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, NULL);
}
-static void __mask_and_edge_IO_APIC_irq(unsigned int irq)
+static void __mask_and_edge_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_LEVEL_TRIGGER,
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_LEVEL_TRIGGER,
IO_APIC_REDIR_MASKED, NULL);
}
-static void __unmask_and_level_IO_APIC_irq(unsigned int irq)
+static void __unmask_and_level_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED,
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED,
IO_APIC_REDIR_LEVEL_TRIGGER, NULL);
}
#endif /* CONFIG_X86_32 */
-static void mask_IO_APIC_irq (unsigned int irq)
+static void mask_IO_APIC_irq_desc(struct irq_desc **descp)
{
+ struct irq_cfg *cfg = (*descp)->chip_data;
unsigned long flags;
+ BUG_ON(!cfg);
+
spin_lock_irqsave(&ioapic_lock, flags);
- __mask_IO_APIC_irq(irq);
+ __mask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
-static void unmask_IO_APIC_irq (unsigned int irq)
+static void unmask_IO_APIC_irq_desc(struct irq_desc **descp)
{
+ struct irq_cfg *cfg = (*descp)->chip_data;
unsigned long flags;
spin_lock_irqsave(&ioapic_lock, flags);
- __unmask_IO_APIC_irq(irq);
+ __unmask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
+#ifdef CONFIG_SPARSE_IRQ
+#define mask_IO_APIC_irq mask_IO_APIC_irq_desc
+#define unmask_IO_APIC_irq unmask_IO_APIC_irq_desc
+#else
+static void mask_IO_APIC_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_IO_APIC_irq_desc(&desc);
+}
+static void unmask_IO_APIC_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_IO_APIC_irq_desc(&desc);
+}
+#endif
+
static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
{
struct IO_APIC_route_entry entry;
@@ -809,7 +889,7 @@ EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector
*/
static int EISA_ELCR(unsigned int irq)
{
- if (irq < 16) {
+ if (irq < NR_IRQS_LEGACY) {
unsigned int port = 0x4d0 + (irq >> 3);
return (inb(port) >> (irq & 7)) & 1;
}
@@ -1034,7 +1114,7 @@ void unlock_vector_lock(void)
spin_unlock(&vector_lock);
}
-static int __assign_irq_vector(int irq, cpumask_t mask)
+static int __assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
{
/*
* NOTE! The local APIC isn't very good at handling
@@ -1050,16 +1130,13 @@ static int __assign_irq_vector(int irq,
static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
unsigned int old_vector;
int cpu;
- struct irq_cfg *cfg;
- cfg = irq_cfg(irq);
+ if ((cfg->move_in_progress) || cfg->move_cleanup_count)
+ return -EBUSY;
/* Only try and allocate irqs on cpus that are present */
cpus_and(mask, mask, cpu_online_map);
- if ((cfg->move_in_progress) || cfg->move_cleanup_count)
- return -EBUSY;
-
old_vector = cfg->vector;
if (old_vector) {
cpumask_t tmp;
@@ -1113,24 +1190,22 @@ next:
return -ENOSPC;
}
-static int assign_irq_vector(int irq, cpumask_t mask)
+static int assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
{
int err;
unsigned long flags;
spin_lock_irqsave(&vector_lock, flags);
- err = __assign_irq_vector(irq, mask);
+ err = __assign_irq_vector(irq, cfg, mask);
spin_unlock_irqrestore(&vector_lock, flags);
return err;
}
-static void __clear_irq_vector(int irq)
+static void __clear_irq_vector(int irq, struct irq_cfg *cfg)
{
- struct irq_cfg *cfg;
cpumask_t mask;
int cpu, vector;
- cfg = irq_cfg(irq);
BUG_ON(!cfg->vector);
vector = cfg->vector;
@@ -1162,14 +1237,16 @@ void __setup_vector_irq(int cpu)
/* This function must be called with vector_lock held */
int irq, vector;
struct irq_cfg *cfg;
+ struct irq_desc *desc;
/* Mark the inuse vectors */
- for_each_irq_cfg(irq, cfg) {
+ for_each_irq_desc(irq, desc) {
+ cfg = desc->chip_data;
if (!cpu_isset(cpu, cfg->domain))
continue;
vector = cfg->vector;
per_cpu(vector_irq, cpu)[vector] = irq;
- }
+ } end_for_each_irq_desc();
/* Mark the free vectors */
for (vector = 0; vector < NR_VECTORS; ++vector) {
irq = per_cpu(vector_irq, cpu)[vector];
@@ -1215,11 +1292,8 @@ static inline int IO_APIC_irq_trigger(in
}
#endif
-static void ioapic_register_intr(int irq, unsigned long trigger)
+static void ioapic_register_intr(int irq, struct irq_desc *desc, unsigned long trigger)
{
- struct irq_desc *desc;
-
- desc = irq_to_desc(irq);
if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
trigger == IOAPIC_LEVEL)
@@ -1311,7 +1385,7 @@ static int setup_ioapic_entry(int apic,
return 0;
}
-static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,
+static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_desc *desc,
int trigger, int polarity)
{
struct irq_cfg *cfg;
@@ -1321,10 +1395,10 @@ static void setup_IO_APIC_irq(int apic,
if (!IO_APIC_IRQ(irq))
return;
- cfg = irq_cfg(irq);
+ cfg = desc->chip_data;
mask = TARGET_CPUS;
- if (assign_irq_vector(irq, mask))
+ if (assign_irq_vector(irq, cfg, mask))
return;
cpus_and(mask, cfg->domain, mask);
@@ -1341,12 +1415,12 @@ static void setup_IO_APIC_irq(int apic,
cfg->vector)) {
printk("Failed to setup ioapic entry for ioapic %d, pin %d\n",
mp_ioapics[apic].mp_apicid, pin);
- __clear_irq_vector(irq);
+ __clear_irq_vector(irq, cfg);
return;
}
- ioapic_register_intr(irq, trigger);
- if (irq < 16)
+ ioapic_register_intr(irq, desc, trigger);
+ if (irq < NR_IRQS_LEGACY)
disable_8259A_irq(irq);
ioapic_write_entry(apic, pin, entry);
@@ -1356,6 +1430,9 @@ static void __init setup_IO_APIC_irqs(vo
{
int apic, pin, idx, irq;
int notcon = 0;
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+ int cpu = boot_cpu_id;
apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
@@ -1387,9 +1464,11 @@ static void __init setup_IO_APIC_irqs(vo
if (multi_timer_check(apic, irq))
continue;
#endif
- add_pin_to_irq(irq, apic, pin);
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ cfg = desc->chip_data;
+ add_pin_to_irq_cpu(cfg, cpu, apic, pin);
- setup_IO_APIC_irq(apic, pin, irq,
+ setup_IO_APIC_irq(apic, pin, irq, desc,
irq_trigger(idx), irq_polarity(idx));
}
}
@@ -1448,6 +1527,7 @@ __apicdebuginit(void) print_IO_APIC(void
union IO_APIC_reg_03 reg_03;
unsigned long flags;
struct irq_cfg *cfg;
+ struct irq_desc *desc;
unsigned int irq;
if (apic_verbosity == APIC_QUIET)
@@ -1537,8 +1617,10 @@ __apicdebuginit(void) print_IO_APIC(void
}
}
printk(KERN_DEBUG "IRQ to pin mappings:\n");
- for_each_irq_cfg(irq, cfg) {
- struct irq_pin_list *entry = cfg->irq_2_pin;
+ for_each_irq_desc(irq, desc) {
+ struct irq_pin_list *entry;
+ cfg = desc->chip_data;
+ entry = cfg->irq_2_pin;
if (!entry)
continue;
printk(KERN_DEBUG "IRQ%d ", irq);
@@ -1549,7 +1631,7 @@ __apicdebuginit(void) print_IO_APIC(void
entry = entry->next;
}
printk("\n");
- }
+ } end_for_each_irq_desc();
printk(KERN_INFO ".................................... done.\n");
@@ -2022,14 +2104,16 @@ static unsigned int startup_ioapic_irq(u
{
int was_pending = 0;
unsigned long flags;
+ struct irq_cfg *cfg;
spin_lock_irqsave(&ioapic_lock, flags);
- if (irq < 16) {
+ if (irq < NR_IRQS_LEGACY) {
disable_8259A_irq(irq);
if (i8259A_irq_pending(irq))
was_pending = 1;
}
- __unmask_IO_APIC_irq(irq);
+ cfg = irq_cfg(irq);
+ __unmask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
return was_pending;
@@ -2092,35 +2176,37 @@ static DECLARE_DELAYED_WORK(ir_migration
* as simple as edge triggered migration and we can do the irq migration
* with a simple atomic update to IO-APIC RTE.
*/
-static void migrate_ioapic_irq(int irq, cpumask_t mask)
+static void migrate_ioapic_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
- struct irq_desc *desc;
cpumask_t tmp, cleanup_mask;
struct irte irte;
int modify_ioapic_rte;
unsigned int dest;
unsigned long flags;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
+ irq = desc->irq;
if (get_irte(irq, &irte))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
- desc = irq_to_desc(irq);
modify_ioapic_rte = desc->status & IRQ_LEVEL;
if (modify_ioapic_rte) {
spin_lock_irqsave(&ioapic_lock, flags);
- __target_IO_APIC_irq(irq, dest, cfg->vector);
+ __target_IO_APIC_irq(irq, dest, cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
@@ -2142,14 +2228,14 @@ static void migrate_ioapic_irq(int irq,
desc->affinity = mask;
}
-static int migrate_irq_remapped_level(int irq)
+static int migrate_irq_remapped_level_desc(struct irq_desc *desc)
{
int ret = -1;
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_cfg *cfg = desc->chip_data;
- mask_IO_APIC_irq(irq);
+ mask_IO_APIC_irq_desc(&desc);
- if (io_apic_level_ack_pending(irq)) {
+ if (io_apic_level_ack_pending(cfg)) {
/*
* Interrupt in progress. Migrating irq now will change the
* vector information in the IO-APIC RTE and that will confuse
@@ -2161,14 +2247,15 @@ static int migrate_irq_remapped_level(in
}
/* everthing is clear. we have right of way */
- migrate_ioapic_irq(irq, desc->pending_mask);
+ migrate_ioapic_irq_desc(desc, desc->pending_mask);
ret = 0;
desc->status &= ~IRQ_MOVE_PENDING;
cpus_clear(desc->pending_mask);
unmask:
- unmask_IO_APIC_irq(irq);
+ unmask_IO_APIC_irq_desc(&desc);
+
return ret;
}
@@ -2189,29 +2276,37 @@ static void ir_irq_migration(struct work
continue;
}
- desc->chip->set_affinity(irq, desc->pending_mask);
+ desc_chip_set_affinity(irq, desc, desc->pending_mask);
spin_unlock_irqrestore(&desc->lock, flags);
}
- }
+ } end_for_each_irq_desc();
}
/*
* Migrates the IRQ destination in the process context.
*/
-static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+static void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
- struct irq_desc *desc = irq_to_desc(irq);
-
if (desc->status & IRQ_LEVEL) {
desc->status |= IRQ_MOVE_PENDING;
desc->pending_mask = mask;
- migrate_irq_remapped_level(irq);
+ migrate_irq_remapped_level_desc(desc);
return;
}
- migrate_ioapic_irq(irq, mask);
+ migrate_ioapic_irq_desc(desc, mask);
+}
+#ifdef CONFIG_SPARSE_IRQ
+#define set_ir_ioapic_affinity_irq set_ir_ioapic_affinity_irq_desc
+#else
+static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ set_ir_ioapic_affinity_irq_desc(desc, mask);
}
#endif
+#endif
asmlinkage void smp_irq_move_cleanup_interrupt(void)
{
@@ -2250,9 +2345,10 @@ unlock:
irq_exit();
}
-static void irq_complete_move(unsigned int irq)
+static void irq_complete_move(struct irq_desc **descp)
{
- struct irq_cfg *cfg = irq_cfg(irq);
+ struct irq_desc *desc = *descp;
+ struct irq_cfg *cfg = desc->chip_data;
unsigned vector, me;
if (likely(!cfg->move_in_progress))
@@ -2270,9 +2366,24 @@ static void irq_complete_move(unsigned i
}
}
#else
-static inline void irq_complete_move(unsigned int irq) {}
+static inline void irq_complete_move(struct irq_desc **descp) {}
#endif
+
#ifdef CONFIG_INTR_REMAP
+#ifdef CONFIG_SPARSE_IRQ
+static void ack_x2apic_level_desc(struct irq_desc **descp)
+{
+ ack_x2APIC_irq();
+}
+
+static void ack_x2apic_edge_desc(struct irq_desc **descp)
+{
+ ack_x2APIC_irq();
+}
+
+#define ack_x2apic_level ack_x2apic_level_desc
+#define ack_x2apic_edge ack_x2apic_edge_desc
+#else
static void ack_x2apic_level(unsigned int irq)
{
ack_x2APIC_irq();
@@ -2284,29 +2395,34 @@ static void ack_x2apic_edge(unsigned int
}
#endif
-static void ack_apic_edge(unsigned int irq)
+#endif
+
+static void ack_apic_edge_desc(struct irq_desc **descp)
{
- irq_complete_move(irq);
- move_native_irq(irq);
+ irq_complete_move(descp);
+#ifdef CONFIG_SMP
+ move_native_irq_desc(descp);
+#endif
ack_APIC_irq();
}
atomic_t irq_mis_count;
-static void ack_apic_level(unsigned int irq)
+static void ack_apic_level_desc(struct irq_desc **descp)
{
#ifdef CONFIG_X86_32
unsigned long v;
int i;
#endif
+ struct irq_cfg *cfg;
int do_unmask_irq = 0;
- irq_complete_move(irq);
+ irq_complete_move(descp);
#ifdef CONFIG_GENERIC_PENDING_IRQ
/* If we are moving the irq we need to mask it */
- if (unlikely(irq_to_desc(irq)->status & IRQ_MOVE_PENDING)) {
+ if (unlikely((*descp)->status & IRQ_MOVE_PENDING)) {
do_unmask_irq = 1;
- mask_IO_APIC_irq(irq);
+ mask_IO_APIC_irq_desc(descp);
}
#endif
@@ -2330,7 +2446,8 @@ static void ack_apic_level(unsigned int
* operation to prevent an edge-triggered interrupt escaping meanwhile.
* The idea is from Manfred Spraul. --macro
*/
- i = irq_cfg(irq)->vector;
+ cfg = (*descp)->chip_data;
+ i = cfg->vector;
v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
#endif
@@ -2369,22 +2486,44 @@ static void ack_apic_level(unsigned int
* accurate and is causing problems then it is a hardware bug
* and you can go talk to the chipset vendor about it.
*/
- if (!io_apic_level_ack_pending(irq))
- move_masked_irq(irq);
- unmask_IO_APIC_irq(irq);
+ cfg = (*descp)->chip_data;
+ if (!io_apic_level_ack_pending(cfg)) {
+# ifdef CONFIG_SMP
+ move_masked_irq_desc(descp);
+# endif
+ }
+ unmask_IO_APIC_irq_desc(descp);
}
#ifdef CONFIG_X86_32
if (!(v & (1 << (i & 0x1f)))) {
atomic_inc(&irq_mis_count);
spin_lock(&ioapic_lock);
- __mask_and_edge_IO_APIC_irq(irq);
- __unmask_and_level_IO_APIC_irq(irq);
+ __mask_and_edge_IO_APIC_irq(cfg);
+ __unmask_and_level_IO_APIC_irq(cfg);
spin_unlock(&ioapic_lock);
}
#endif
}
+#ifdef CONFIG_SPARSE_IRQ
+#define ack_apic_edge ack_apic_edge_desc
+#define ack_apic_level ack_apic_level_desc
+#else
+static void ack_apic_edge(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ ack_apic_edge_desc(&desc);
+}
+static void ack_apic_level(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ ack_apic_level_desc(&desc);
+}
+#endif
+
static struct irq_chip ioapic_chip __read_mostly = {
.name = "IO-APIC",
.startup = startup_ioapic_irq,
@@ -2430,29 +2569,28 @@ static inline void init_IO_APIC_traps(vo
* Also, we've got to be careful not to trash gate
* 0x80, because int 0x80 is hm, kind of importantish. ;)
*/
- for_each_irq_cfg(irq, cfg) {
- if (IO_APIC_IRQ(irq) && !cfg->vector) {
+ for_each_irq_desc(irq, desc) {
+ cfg = desc->chip_data;
+ if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) {
/*
* Hmm.. We don't have an entry for this,
* so default to an old-fashioned 8259
* interrupt if we can..
*/
- if (irq < 16)
+ if (irq < NR_IRQS_LEGACY)
make_8259A_irq(irq);
- else {
- desc = irq_to_desc(irq);
+ else
/* Strange. Oh, well.. */
desc->chip = &no_irq_chip;
- }
}
- }
+ } end_for_each_irq_desc();
}
/*
* The local APIC irq-chip implementation:
*/
-static void mask_lapic_irq(unsigned int irq)
+static void mask_lapic_irq_desc(struct irq_desc **descp)
{
unsigned long v;
@@ -2460,7 +2598,7 @@ static void mask_lapic_irq(unsigned int
apic_write(APIC_LVT0, v | APIC_LVT_MASKED);
}
-static void unmask_lapic_irq(unsigned int irq)
+static void unmask_lapic_irq_desc(struct irq_desc **descp)
{
unsigned long v;
@@ -2468,11 +2606,36 @@ static void unmask_lapic_irq(unsigned in
apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED);
}
-static void ack_lapic_irq (unsigned int irq)
+static void ack_lapic_irq_desc(struct irq_desc **descp)
{
ack_APIC_irq();
}
+#ifdef CONFIG_SPARSE_IRQ
+#define mask_lapic_irq mask_lapic_irq_desc
+#define unmask_lapic_irq unmask_lapic_irq_desc
+#define ack_lapic_irq ack_lapic_irq_desc
+#else
+static void mask_lapic_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_lapic_irq_desc(&desc);
+}
+static void unmask_lapic_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_lapic_irq_desc(&desc);
+}
+static void ack_lapic_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ ack_lapic_irq_desc(&desc);
+}
+#endif
+
static struct irq_chip lapic_chip __read_mostly = {
.name = "local-APIC",
.mask = mask_lapic_irq,
@@ -2480,11 +2643,8 @@ static struct irq_chip lapic_chip __read
.ack = ack_lapic_irq,
};
-static void lapic_register_intr(int irq)
+static void lapic_register_intr(int irq, struct irq_desc *desc)
{
- struct irq_desc *desc;
-
- desc = irq_to_desc(irq);
desc->status &= ~IRQ_LEVEL;
set_irq_chip_and_handler_name(irq, &lapic_chip, handle_edge_irq,
"edge");
@@ -2588,7 +2748,9 @@ int timer_through_8259 __initdata;
*/
static inline void __init check_timer(void)
{
- struct irq_cfg *cfg = irq_cfg(0);
+ struct irq_desc *desc = irq_to_desc(0);
+ struct irq_cfg *cfg = desc->chip_data;
+ int cpu = boot_cpu_id;
int apic1, pin1, apic2, pin2;
unsigned long flags;
unsigned int ver;
@@ -2603,7 +2765,7 @@ static inline void __init check_timer(vo
* get/set the timer IRQ vector:
*/
disable_8259A_irq(0);
- assign_irq_vector(0, TARGET_CPUS);
+ assign_irq_vector(0, cfg, TARGET_CPUS);
/*
* As IRQ0 is to be enabled in the 8259A, the virtual
@@ -2654,10 +2816,10 @@ static inline void __init check_timer(vo
* Ok, does IRQ0 through the IOAPIC work?
*/
if (no_pin1) {
- add_pin_to_irq(0, apic1, pin1);
+ add_pin_to_irq_cpu(cfg, cpu, apic1, pin1);
setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
}
- unmask_IO_APIC_irq(0);
+ unmask_IO_APIC_irq_desc(&desc);
if (timer_irq_works()) {
if (nmi_watchdog == NMI_IO_APIC) {
setup_nmi();
@@ -2683,9 +2845,9 @@ static inline void __init check_timer(vo
/*
* legacy devices should be connected to IO APIC #0
*/
- replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
+ replace_pin_at_irq_cpu(cfg, cpu, apic1, pin1, apic2, pin2);
setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
- unmask_IO_APIC_irq(0);
+ unmask_IO_APIC_irq_desc(&desc);
enable_8259A_irq(0);
if (timer_irq_works()) {
apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
@@ -2717,7 +2879,7 @@ static inline void __init check_timer(vo
apic_printk(APIC_QUIET, KERN_INFO
"...trying to set up timer as Virtual Wire IRQ...\n");
- lapic_register_intr(0);
+ lapic_register_intr(0, desc);
apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */
enable_8259A_irq(0);
@@ -2902,22 +3064,26 @@ unsigned int create_irq_nr(unsigned int
unsigned int irq;
unsigned int new;
unsigned long flags;
- struct irq_cfg *cfg_new;
+ struct irq_cfg *cfg_new = NULL;
+ int cpu = boot_cpu_id;
+ struct irq_desc *desc_new = NULL;
+#ifndef CONFIG_SPARSE_IRQ
irq_want = nr_irqs - 1;
+#endif
irq = 0;
spin_lock_irqsave(&vector_lock, flags);
for (new = irq_want; new > 0; new--) {
if (platform_legacy_irq(new))
continue;
- cfg_new = irq_cfg(new);
- if (cfg_new && cfg_new->vector != 0)
+
+ desc_new = irq_to_desc_alloc_cpu(new, cpu);
+ cfg_new = desc_new->chip_data;
+
+ if (cfg_new->vector != 0)
continue;
- /* check if need to create one */
- if (!cfg_new)
- cfg_new = irq_cfg_alloc(new);
- if (__assign_irq_vector(new, TARGET_CPUS) == 0)
+ if (__assign_irq_vector(new, cfg_new, TARGET_CPUS) == 0)
irq = new;
break;
}
@@ -2925,6 +3091,9 @@ unsigned int create_irq_nr(unsigned int
if (irq > 0) {
dynamic_irq_init(irq);
+ /* restore it, in case dynamic_irq_init clear it */
+ if (desc_new)
+ desc_new->chip_data = cfg_new;
}
return irq;
}
@@ -2944,14 +3113,22 @@ int create_irq(void)
void destroy_irq(unsigned int irq)
{
unsigned long flags;
+ struct irq_cfg *cfg;
+ struct irq_desc *desc;
+ /* store it, in case dynamic_irq_cleanup clear it */
+ desc = irq_to_desc(irq);
+ cfg = desc->chip_data;
dynamic_irq_cleanup(irq);
+ /* connect back irq_cfg */
+ if (desc)
+ desc->chip_data = cfg;
#ifdef CONFIG_INTR_REMAP
free_irte(irq);
#endif
spin_lock_irqsave(&vector_lock, flags);
- __clear_irq_vector(irq);
+ __clear_irq_vector(irq, cfg);
spin_unlock_irqrestore(&vector_lock, flags);
}
@@ -2966,12 +3143,12 @@ static int msi_compose_msg(struct pci_de
unsigned dest;
cpumask_t tmp;
+ cfg = irq_cfg(irq);
tmp = TARGET_CPUS;
- err = assign_irq_vector(irq, tmp);
+ err = assign_irq_vector(irq, cfg, tmp);
if (err)
return err;
- cfg = irq_cfg(irq);
cpus_and(tmp, cfg->domain, tmp);
dest = cpu_mask_to_apicid(tmp);
@@ -3027,61 +3204,75 @@ static int msi_compose_msg(struct pci_de
}
#ifdef CONFIG_SMP
-static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
+static void set_msi_irq_affinity_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq = desc->irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
- read_msi_msg(irq, &msg);
+ read_msi_msg_desc(desc, &msg);
msg.data &= ~MSI_DATA_VECTOR_MASK;
msg.data |= MSI_DATA_VECTOR(cfg->vector);
msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
- write_msi_msg(irq, &msg);
- desc = irq_to_desc(irq);
+ write_msi_msg_desc(desc, &msg);
desc->affinity = mask;
}
+#ifdef CONFIG_SPARSE_IRQ
+#define set_msi_irq_affinity set_msi_irq_affinity_desc
+#else
+static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ set_msi_irq_affinity_desc(desc, mask);
+}
+#endif
#ifdef CONFIG_INTR_REMAP
/*
* Migrate the MSI irq to another cpumask. This migration is
* done in the process context using interrupt-remapping hardware.
*/
-static void ir_set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
+static void ir_set_msi_irq_affinity_desc(struct irq_desc *desc,
+ cpumask_t mask)
{
struct irq_cfg *cfg;
unsigned int dest;
cpumask_t tmp, cleanup_mask;
struct irte irte;
- struct irq_desc *desc;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
+ irq = desc->irq;
if (get_irte(irq, &irte))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3105,9 +3296,20 @@ static void ir_set_msi_irq_affinity(unsi
cfg->move_in_progress = 0;
}
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define ir_set_msi_irq_affinity ir_set_msi_irq_affinity_desc
+#else
+static void ir_set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ ir_set_msi_irq_affinity_desc(desc, mask);
+}
+#endif
+
#endif
#endif /* CONFIG_SMP */
@@ -3166,7 +3368,7 @@ static int msi_alloc_irte(struct pci_dev
}
#endif
-static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc, int irq)
+static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
{
int ret;
struct msi_msg msg;
@@ -3175,7 +3377,7 @@ static int setup_msi_irq(struct pci_dev
if (ret < 0)
return ret;
- set_irq_msi(irq, desc);
+ set_irq_msi(irq, msidesc);
write_msi_msg(irq, &msg);
#ifdef CONFIG_INTR_REMAP
@@ -3190,7 +3392,7 @@ static int setup_msi_irq(struct pci_dev
#endif
set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge");
- dev_printk(KERN_DEBUG, &dev->dev, "irq %d for MSI/MSI-X\n", irq);
+ dev_printk(KERN_DEBUG, &dev->dev, "irq %d aka 0x%08x for MSI/MSI-X\n", irq, irq);
return 0;
}
@@ -3199,6 +3401,7 @@ static unsigned int build_irq_for_pci_de
{
unsigned int irq;
+ /* use 8bits (bus) + 8bits (devfn) + 12 bits */
irq = dev->bus->number;
irq <<= 8;
irq |= dev->devfn;
@@ -3207,13 +3410,13 @@ static unsigned int build_irq_for_pci_de
return irq;
}
-int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
+int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc)
{
unsigned int irq;
int ret;
unsigned int irq_want;
- irq_want = build_irq_for_pci_dev(dev) + 0x100;
+ irq_want = build_irq_for_pci_dev(dev) + 0xfff;
irq = create_irq_nr(irq_want);
if (irq == 0)
@@ -3228,7 +3431,7 @@ int arch_setup_msi_irq(struct pci_dev *d
goto error;
no_ir:
#endif
- ret = setup_msi_irq(dev, desc, irq);
+ ret = setup_msi_irq(dev, msidesc, irq);
if (ret < 0) {
destroy_irq(irq);
return ret;
@@ -3246,7 +3449,7 @@ int arch_setup_msi_irqs(struct pci_dev *
{
unsigned int irq;
int ret, sub_handle;
- struct msi_desc *desc;
+ struct msi_desc *msidesc;
unsigned int irq_want;
#ifdef CONFIG_INTR_REMAP
@@ -3254,9 +3457,10 @@ int arch_setup_msi_irqs(struct pci_dev *
int index = 0;
#endif
- irq_want = build_irq_for_pci_dev(dev) + 0x100;
+ /* count from the top 0xfff in 12 bits range */
+ irq_want = build_irq_for_pci_dev(dev) + 0xfff;
sub_handle = 0;
- list_for_each_entry(desc, &dev->msi_list, list) {
+ list_for_each_entry(msidesc, &dev->msi_list, list) {
irq = create_irq_nr(irq_want--);
if (irq == 0)
return -1;
@@ -3289,7 +3493,7 @@ int arch_setup_msi_irqs(struct pci_dev *
}
no_ir:
#endif
- ret = setup_msi_irq(dev, desc, irq);
+ ret = setup_msi_irq(dev, msidesc, irq);
if (ret < 0)
goto error;
sub_handle++;
@@ -3308,22 +3512,25 @@ void arch_teardown_msi_irq(unsigned int
#ifdef CONFIG_DMAR
#ifdef CONFIG_SMP
-static void dmar_msi_set_affinity(unsigned int irq, cpumask_t mask)
+static void dmar_msi_set_affinity_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ irq = desc->irq;
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3335,9 +3542,20 @@ static void dmar_msi_set_affinity(unsign
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
dmar_msi_write(irq, &msg);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define dmar_msi_set_affinity dmar_msi_set_affinity_desc
+#else
+static void dmar_msi_set_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ dmar_msi_set_affinity_desc(desc, mask);
+}
+#endif
+
#endif /* CONFIG_SMP */
struct irq_chip dmar_msi_type = {
@@ -3369,22 +3587,25 @@ int arch_setup_dmar_msi(unsigned int irq
#ifdef CONFIG_HPET_TIMER
#ifdef CONFIG_SMP
-static void hpet_msi_set_affinity(unsigned int irq, cpumask_t mask)
+static void hpet_msi_set_affinity_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
- struct irq_desc *desc;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ irq = desc->irq;
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3396,9 +3617,19 @@ static void hpet_msi_set_affinity(unsign
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
hpet_msi_write(irq, &msg);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define hpet_msi_set_affinity hpet_msi_set_affinity_desc
+#else
+static void hpet_msi_set_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ hpet_msi_set_affinity_desc(desc, mask);
+}
+#endif
#endif /* CONFIG_SMP */
struct irq_chip hpet_msi_type = {
@@ -3451,28 +3682,40 @@ static void target_ht_irq(unsigned int i
write_ht_irq_msg(irq, &msg);
}
-static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask)
+static void set_ht_irq_affinity_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq = desc->irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
target_ht_irq(irq, dest, cfg->vector);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define set_ht_irq_affinity set_ht_irq_affinity_desc
+#else
+static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ set_ht_irq_affinity_desc(desc, mask);
+}
+#endif
#endif
static struct irq_chip ht_irq_chip = {
@@ -3492,13 +3735,13 @@ int arch_setup_ht_irq(unsigned int irq,
int err;
cpumask_t tmp;
+ cfg = irq_cfg(irq);
tmp = TARGET_CPUS;
- err = assign_irq_vector(irq, tmp);
+ err = assign_irq_vector(irq, cfg, tmp);
if (!err) {
struct ht_irq_msg msg;
unsigned dest;
- cfg = irq_cfg(irq);
cpus_and(tmp, cfg->domain, tmp);
dest = cpu_mask_to_apicid(tmp);
@@ -3522,7 +3765,8 @@ int arch_setup_ht_irq(unsigned int irq,
set_irq_chip_and_handler_name(irq, &ht_irq_chip,
handle_edge_irq, "edge");
- dev_printk(KERN_DEBUG, &dev->dev, "irq %d for HT\n", irq);
+ dev_printk(KERN_DEBUG, &dev->dev, "irq %d aka 0x%08x for HT\n",
+ irq, irq);
}
return err;
}
@@ -3544,7 +3788,9 @@ int arch_enable_uv_irq(char *irq_name, u
unsigned long flags;
int err;
- err = assign_irq_vector(irq, *eligible_cpu);
+ cfg = irq_cfg(irq);
+
+ err = assign_irq_vector(irq, cfg, *eligible_cpu);
if (err != 0)
return err;
@@ -3553,8 +3799,6 @@ int arch_enable_uv_irq(char *irq_name, u
irq_name);
spin_unlock_irqrestore(&vector_lock, flags);
- cfg = irq_cfg(irq);
-
mmr_value = 0;
entry = (struct uv_IO_APIC_route_entry *)&mmr_value;
BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
@@ -3608,7 +3852,21 @@ int __init io_apic_get_redir_entries (in
int __init probe_nr_irqs(void)
{
+#if defined(CONFIG_SPARSE_IRQ) && !defined(CONFIG_XEN)
+ int idx;
+ int nr = 0;
+ int nr_min = NR_IRQS_LEGACY;
+
+ for (idx = 0; idx < nr_ioapics; idx++)
+ nr += io_apic_get_redir_entries(idx) + 1;
+
+ if (nr < nr_min)
+ nr = nr_min;
+
+ return nr;
+#else
return NR_IRQS;
+#endif
}
/* --------------------------------------------------------------------------
@@ -3707,19 +3965,27 @@ int __init io_apic_get_version(int ioapi
int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int polarity)
{
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+ int cpu = boot_cpu_id;
+
if (!IO_APIC_IRQ(irq)) {
apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
ioapic);
return -EINVAL;
}
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+
/*
* IRQs < 16 are already in the irq_2_pin[] map
*/
- if (irq >= 16)
- add_pin_to_irq(irq, ioapic, pin);
+ if (irq >= NR_IRQS_LEGACY) {
+ cfg = desc->chip_data;
+ add_pin_to_irq_cpu(cfg, cpu, ioapic, pin);
+ }
- setup_IO_APIC_irq(ioapic, pin, irq, triggering, polarity);
+ setup_IO_APIC_irq(ioapic, pin, irq, desc, triggering, polarity);
return 0;
}
@@ -3773,9 +4039,10 @@ void __init setup_ioapic_dest(void)
* when you have too many devices, because at that time only boot
* cpu is online.
*/
- cfg = irq_cfg(irq);
+ desc = irq_to_desc(irq);
+ cfg = desc->chip_data;
if (!cfg->vector) {
- setup_IO_APIC_irq(ioapic, pin, irq,
+ setup_IO_APIC_irq(ioapic, pin, irq, desc,
irq_trigger(irq_entry),
irq_polarity(irq_entry));
continue;
@@ -3785,7 +4052,6 @@ void __init setup_ioapic_dest(void)
/*
* Honour affinities which have been set in early boot
*/
- desc = irq_to_desc(irq);
if (desc->status &
(IRQ_NO_BALANCING | IRQ_AFFINITY_SET))
mask = desc->affinity;
@@ -3794,10 +4060,10 @@ void __init setup_ioapic_dest(void)
#ifdef CONFIG_INTR_REMAP
if (intr_remapping_enabled)
- set_ir_ioapic_affinity_irq(irq, mask);
+ set_ir_ioapic_affinity_irq_desc(desc, mask);
else
#endif
- set_ioapic_affinity_irq(irq, mask);
+ set_ioapic_affinity_irq_desc(desc, mask);
}
}
@@ -3846,7 +4112,6 @@ void __init ioapic_init_mappings(void)
struct resource *ioapic_res;
int i;
- irq_2_pin_init();
ioapic_res = ioapic_setup_resources();
for (i = 0; i < nr_ioapics; i++) {
if (smp_found_config) {
Index: linux-2.6/arch/x86/kernel/irqinit_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irqinit_32.c
+++ linux-2.6/arch/x86/kernel/irqinit_32.c
@@ -68,8 +68,7 @@ void __init init_ISA_irqs (void)
/*
* 16 old-style INTA-cycle interrupts:
*/
- for (i = 0; i < 16; i++) {
- /* first time call this irq_desc */
+ for (i = 0; i < NR_IRQS_LEGACY; i++) {
struct irq_desc *desc = irq_to_desc(i);
desc->status = IRQ_DISABLED;
Index: linux-2.6/arch/x86/kernel/irqinit_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irqinit_64.c
+++ linux-2.6/arch/x86/kernel/irqinit_64.c
@@ -76,8 +76,7 @@ void __init init_ISA_irqs(void)
init_bsp_APIC();
init_8259A(0);
- for (i = 0; i < 16; i++) {
- /* first time call this irq_desc */
+ for (i = 0; i < NR_IRQS_LEGACY; i++) {
struct irq_desc *desc = irq_to_desc(i);
desc->status = IRQ_DISABLED;
Index: linux-2.6/drivers/char/random.c
===================================================================
--- linux-2.6.orig/drivers/char/random.c
+++ linux-2.6/drivers/char/random.c
@@ -558,6 +558,8 @@ struct timer_rand_state {
unsigned dont_count_entropy:1;
};
+#ifndef CONFIG_SPARSE_IRQ
+
static struct timer_rand_state *irq_timer_state[NR_IRQS];
static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
@@ -576,6 +578,33 @@ static void set_timer_rand_state(unsigne
irq_timer_state[irq] = state;
}
+#else
+
+static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (!desc)
+ return NULL;
+
+ return desc->timer_rand_state;
+}
+
+static void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (!desc)
+ return;
+
+ desc->timer_rand_state = state;
+}
+#endif
+
static struct timer_rand_state input_timer_state;
/*
@@ -933,8 +962,10 @@ void rand_initialize_irq(int irq)
{
struct timer_rand_state *state;
+#ifndef CONFIG_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
state = get_timer_rand_state(irq);
Index: linux-2.6/drivers/pci/htirq.c
===================================================================
--- linux-2.6.orig/drivers/pci/htirq.c
+++ linux-2.6/drivers/pci/htirq.c
@@ -58,30 +58,62 @@ void fetch_ht_irq_msg(unsigned int irq,
*msg = cfg->msg;
}
-void mask_ht_irq(unsigned int irq)
+void mask_ht_irq_desc(struct irq_desc **descp)
{
struct ht_irq_cfg *cfg;
struct ht_irq_msg msg;
+ unsigned int irq = (*descp)->irq;
- cfg = get_irq_data(irq);
+ cfg = get_irq_desc_data(*descp);
msg = cfg->msg;
msg.address_lo |= 1;
write_ht_irq_msg(irq, &msg);
}
-void unmask_ht_irq(unsigned int irq)
+void unmask_ht_irq_desc(struct irq_desc **descp)
{
struct ht_irq_cfg *cfg;
struct ht_irq_msg msg;
+ unsigned int irq = (*descp)->irq;
- cfg = get_irq_data(irq);
+ cfg = get_irq_desc_data(*descp);
msg = cfg->msg;
msg.address_lo &= ~1;
write_ht_irq_msg(irq, &msg);
}
+#ifndef CONFIG_SPARSE_IRQ
+void mask_ht_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_ht_irq_desc(&desc);
+}
+void unmask_ht_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_ht_irq_desc(&desc);
+}
+
+#else
+
+static unsigned int build_irq_for_pci_dev(struct pci_dev *dev)
+{
+ unsigned int irq;
+
+ /* use 8bits (bus) + 8bits (devfn) + 12 bits */
+ irq = dev->bus->number;
+ irq <<= 8;
+ irq |= dev->devfn;
+ irq <<= 12;
+
+ return irq;
+}
+#endif
+
/**
* __ht_create_irq - create an irq and attach it to a device.
* @dev: The hypertransport device to find the irq capability on.
@@ -125,7 +157,11 @@ int __ht_create_irq(struct pci_dev *dev,
cfg->msg.address_lo = 0xffffffff;
cfg->msg.address_hi = 0xffffffff;
+#ifdef CONFIG_SPARSE_IRQ
+ irq = create_irq_nr(idx + build_irq_for_pci_dev(dev));
+#else
irq = create_irq();
+#endif
if (irq <= 0) {
kfree(cfg);
Index: linux-2.6/drivers/pci/intr_remapping.c
===================================================================
--- linux-2.6.orig/drivers/pci/intr_remapping.c
+++ linux-2.6/drivers/pci/intr_remapping.c
@@ -19,17 +19,71 @@ struct irq_2_iommu {
u8 irte_mask;
};
-static struct irq_2_iommu irq_2_iommuX[NR_IRQS];
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_2_iommu *get_one_free_irq_2_iommu(int cpu)
+{
+ struct irq_2_iommu *iommu;
+ int node;
+
+ node = cpu_to_node(cpu);
+
+ iommu = kzalloc_node(sizeof(*iommu), GFP_ATOMIC, node);
+ printk(KERN_DEBUG "alloc irq_2_iommu on cpu %d node %d\n", cpu, node);
+
+ return iommu;
+}
static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
{
- return (irq < nr_irqs) ? irq_2_iommuX + irq : NULL;
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (WARN_ON_ONCE(!desc))
+ return NULL;
+
+ return desc->irq_2_iommu;
+}
+
+static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc;
+ struct irq_2_iommu *irq_iommu;
+
+ /*
+ * alloc irq desc if not allocated already.
+ */
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+
+ irq_iommu = desc->irq_2_iommu;
+
+ if (!irq_iommu)
+ desc->irq_2_iommu = get_one_free_irq_2_iommu(cpu);
+
+ return desc->irq_2_iommu;
+}
+
+static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
+{
+ return irq_2_iommu_alloc_cpu(irq, boot_cpu_id);
}
+#else /* !CONFIG_SPARSE_IRQ */
+
+static struct irq_2_iommu irq_2_iommuX[NR_IRQS];
+
+static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
+{
+ if (irq < nr_irqs)
+ return &irq_2_iommuX[irq];
+
+ return NULL;
+}
static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
{
return irq_2_iommu(irq);
}
+#endif
static DEFINE_SPINLOCK(irq_2_ir_lock);
@@ -86,9 +140,11 @@ int alloc_irte(struct intel_iommu *iommu
if (!count)
return -1;
+#ifndef CONFIG_SPARSE_IRQ
/* protect irq_2_iommu_alloc later */
if (irq >= nr_irqs)
return -1;
+#endif
/*
* start the IRTE search from index 0.
@@ -130,6 +186,12 @@ int alloc_irte(struct intel_iommu *iommu
table->base[i].present = 1;
irq_iommu = irq_2_iommu_alloc(irq);
+ if (!irq_iommu) {
+ spin_unlock(&irq_2_ir_lock);
+ printk(KERN_ERR "can't allocate irq_2_iommu\n");
+ return -1;
+ }
+
irq_iommu->iommu = iommu;
irq_iommu->irte_index = index;
irq_iommu->sub_handle = 0;
@@ -177,6 +239,12 @@ int set_irte_irq(int irq, struct intel_i
irq_iommu = irq_2_iommu_alloc(irq);
+ if (!irq_iommu) {
+ spin_unlock(&irq_2_ir_lock);
+ printk(KERN_ERR "can't allocate irq_2_iommu\n");
+ return -1;
+ }
+
irq_iommu->iommu = iommu;
irq_iommu->irte_index = index;
irq_iommu->sub_handle = subhandle;
Index: linux-2.6/drivers/xen/events.c
===================================================================
--- linux-2.6.orig/drivers/xen/events.c
+++ linux-2.6/drivers/xen/events.c
@@ -141,8 +141,9 @@ static void init_evtchn_cpu_bindings(voi
int i;
/* By default all event channels notify CPU#0. */
- for_each_irq_desc(i, desc)
+ for_each_irq_desc(i, desc) {
desc->affinity = cpumask_of_cpu(0);
+ } end_for_each_irq_desc();
#endif
memset(cpu_evtchn, 0, sizeof(cpu_evtchn));
@@ -231,7 +232,7 @@ static int find_unbound_irq(void)
int irq;
/* Only allocate from dynirq range */
- for_each_irq_nr(irq)
+ for (irq = 0; irq < nr_irqs; irq++)
if (irq_bindcount[irq] == 0)
break;
@@ -792,7 +793,7 @@ void xen_irq_resume(void)
mask_evtchn(evtchn);
/* No IRQ <-> event-channel mappings. */
- for_each_irq_nr(irq)
+ for (irq = 0; irq < nr_irqs; irq++)
irq_info[irq].evtchn = 0; /* zap event-channel binding */
for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
@@ -824,7 +825,7 @@ void __init xen_init_IRQ(void)
mask_evtchn(i);
/* Dynamic IRQ space is currently unbound. Zero the refcnts. */
- for_each_irq_nr(i)
+ for (i = 0; i < nr_irqs; i++)
irq_bindcount[i] = 0;
irq_ctx_init(smp_processor_id());
Index: linux-2.6/fs/proc/stat.c
===================================================================
--- linux-2.6.orig/fs/proc/stat.c
+++ linux-2.6/fs/proc/stat.c
@@ -27,6 +27,9 @@ static int show_stat(struct seq_file *p,
u64 sum = 0;
struct timespec boottime;
unsigned int per_irq_sum;
+#ifdef CONFIG_GENERIC_HARDIRQS
+ struct irq_desc *desc;
+#endif
user = nice = system = idle = iowait =
irq = softirq = steal = cputime64_zero;
@@ -44,10 +47,9 @@ static int show_stat(struct seq_file *p,
softirq = cputime64_add(softirq, kstat_cpu(i).cpustat.softirq);
steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal);
guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest);
-
- for_each_irq_nr(j)
+ for_each_irq_desc(j, desc) {
sum += kstat_irqs_cpu(j, i);
-
+ } end_for_each_irq_desc();
sum += arch_irq_stat_cpu(i);
}
sum += arch_irq_stat();
@@ -90,14 +92,17 @@ static int show_stat(struct seq_file *p,
seq_printf(p, "intr %llu", (unsigned long long)sum);
/* sum again ? it could be updated? */
- for_each_irq_nr(j) {
+ for_each_irq_desc(j, desc) {
per_irq_sum = 0;
-
for_each_possible_cpu(i)
per_irq_sum += kstat_irqs_cpu(j, i);
+#ifdef CONFIG_SPARSE_IRQ
+ seq_printf(p, " %#x:%u", j, per_irq_sum);
+#else
seq_printf(p, " %u", per_irq_sum);
- }
+#endif
+ } end_for_each_irq_desc();
seq_printf(p,
"\nctxt %llu\n"
Index: linux-2.6/fs/proc/interrupts.c
===================================================================
--- linux-2.6.orig/fs/proc/interrupts.c
+++ linux-2.6/fs/proc/interrupts.c
@@ -8,6 +8,23 @@
/*
* /proc/interrupts
*/
+#ifdef CONFIG_SPARSE_IRQ
+static void *int_seq_start(struct seq_file *f, loff_t *pos)
+{
+ rcu_read_lock();
+ return seq_list_start(&sparse_irqs_head, *pos);
+}
+
+static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos)
+{
+ return seq_list_next(v, &sparse_irqs_head, pos);
+}
+
+static void int_seq_stop(struct seq_file *f, void *v)
+{
+ rcu_read_unlock();
+}
+#else
static void *int_seq_start(struct seq_file *f, loff_t *pos)
{
return (*pos <= nr_irqs) ? pos : NULL;
@@ -25,6 +42,7 @@ static void int_seq_stop(struct seq_file
{
/* Nothing to do */
}
+#endif
static const struct seq_operations int_seq_ops = {
.start = int_seq_start,
Index: linux-2.6/include/linux/interrupt.h
===================================================================
--- linux-2.6.orig/include/linux/interrupt.h
+++ linux-2.6/include/linux/interrupt.h
@@ -18,6 +18,8 @@
#include <asm/ptrace.h>
#include <asm/system.h>
+extern int nr_irqs;
+
/*
* These correspond to the IORESOURCE_IRQ_* defines in
* linux/ioport.h to select the interrupt line behaviour. When
Index: linux-2.6/include/linux/irq.h
===================================================================
--- linux-2.6.orig/include/linux/irq.h
+++ linux-2.6/include/linux/irq.h
@@ -106,14 +106,23 @@ struct irq_chip {
void (*enable)(unsigned int irq);
void (*disable)(unsigned int irq);
+#ifdef CONFIG_SPARSE_IRQ
+ void (*ack)(struct irq_desc **descp);
+ void (*mask)(struct irq_desc **descp);
+ void (*mask_ack)(struct irq_desc **descp);
+ void (*unmask)(struct irq_desc **descp);
+ void (*eoi)(struct irq_desc **descp);
+ void (*set_affinity)(struct irq_desc *desc, cpumask_t dest);
+#else
void (*ack)(unsigned int irq);
void (*mask)(unsigned int irq);
void (*mask_ack)(unsigned int irq);
void (*unmask)(unsigned int irq);
void (*eoi)(unsigned int irq);
+ void (*set_affinity)(unsigned int irq, cpumask_t dest);
+#endif
void (*end)(unsigned int irq);
- void (*set_affinity)(unsigned int irq, cpumask_t dest);
int (*retrigger)(unsigned int irq);
int (*set_type)(unsigned int irq, unsigned int flow_type);
int (*set_wake)(unsigned int irq, unsigned int on);
@@ -129,6 +138,8 @@ struct irq_chip {
const char *typename;
};
+struct timer_rand_state;
+struct irq_2_iommu;
/**
* struct irq_desc - interrupt descriptor
* @irq: interrupt number for this descriptor
@@ -154,6 +165,15 @@ struct irq_chip {
*/
struct irq_desc {
unsigned int irq;
+#ifdef CONFIG_SPARSE_IRQ
+ struct list_head list;
+ struct list_head hash_entry;
+ struct timer_rand_state *timer_rand_state;
+ unsigned int *kstat_irqs;
+# ifdef CONFIG_INTR_REMAP
+ struct irq_2_iommu *irq_2_iommu;
+# endif
+#endif
irq_flow_handler_t handle_irq;
struct irq_chip *chip;
struct msi_desc *msi_desc;
@@ -181,14 +201,78 @@ struct irq_desc {
const char *name;
} ____cacheline_internodealigned_in_smp;
+extern void early_irq_init(void);
+extern void arch_early_irq_init(void);
+extern void arch_init_chip_data(struct irq_desc *desc, int cpu);
+extern void arch_init_copy_chip_data(struct irq_desc *old_desc,
+ struct irq_desc *desc, int cpu);
+extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc);
+
+#ifndef CONFIG_SPARSE_IRQ
extern struct irq_desc irq_desc[NR_IRQS];
static inline struct irq_desc *irq_to_desc(unsigned int irq)
{
- return (irq < nr_irqs) ? irq_desc + irq : NULL;
+ return (irq < NR_IRQS) ? irq_desc + irq : NULL;
+}
+static inline struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+{
+ return irq_to_desc(irq);
}
+#ifdef CONFIG_GENERIC_HARDIRQS
+# define for_each_irq_desc(irq, desc) \
+ for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
+# define for_each_irq_desc_reverse(irq, desc) \
+ for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \
+ irq >= 0; irq--, desc--)
+
+#define end_for_each_irq_desc()
+#endif
+
+#define desc_chip_ack(irq, descp) desc->chip->ack(irq)
+#define desc_chip_mask(irq, descp) desc->chip->mask(irq)
+#define desc_chip_mask_ack(irq, descp) desc->chip->mask_ack(irq)
+#define desc_chip_unmask(irq, descp) desc->chip->unmask(irq)
+#define desc_chip_eoi(irq, descp) desc->chip->eoi(irq)
+#define desc_chip_set_affinity(irq, descx, mask) desc->chip->set_affinity(irq, mask)
+
+#else
+
+extern struct irq_desc *irq_to_desc(unsigned int irq);
+extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu);
+extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu);
+
+extern struct list_head sparse_irqs_head;
+#define for_each_irq_desc(irqX, desc) \
+ rcu_read_lock(); \
+ for (desc = list_entry(rcu_dereference(sparse_irqs_head.next), typeof(*desc), list), irqX = desc->irq; \
+ prefetch(desc->list.next), &desc->list != &sparse_irqs_head; \
+ desc = list_entry(rcu_dereference(desc->list.next), typeof(*desc), list), irqX = desc ? desc->irq : -1U)
+
+#define for_each_irq_desc_reverse(irqX, desc) \
+ rcu_read_lock(); \
+ for (desc = list_entry(rcu_dereference(sparse_irqs_head.prev), typeof(*desc), list), irqX = desc->irq; \
+ prefetch(desc->list.prev), &desc->list != &sparse_irqs_head; \
+ desc = list_entry(rcu_dereference(desc->list.prev), typeof(*desc), list), irqX = desc ? desc->irq : -1U)
+
+#define end_for_each_irq_desc() rcu_read_unlock()
+
+#define kstat_irqs_this_cpu(DESC) \
+ ((DESC)->kstat_irqs[smp_processor_id()])
+#define kstat_incr_irqs_this_cpu(irqno, DESC) \
+ ((DESC)->kstat_irqs[smp_processor_id()]++)
+
+#define desc_chip_ack(irq, descp) desc->chip->ack(descp)
+#define desc_chip_mask(irq, descp) desc->chip->mask(descp)
+#define desc_chip_mask_ack(irq, descp) desc->chip->mask_ack(descp)
+#define desc_chip_unmask(irq, descp) desc->chip->unmask(descp)
+#define desc_chip_eoi(irq, descp) desc->chip->eoi(descp)
+#define desc_chip_set_affinity(irq, descx, mask) desc->chip->set_affinity(descx, mask)
+
+#endif
+
/*
* Migration helpers for obsolete names, they will go away:
*/
@@ -210,8 +294,12 @@ extern int setup_irq(unsigned int irq, s
#ifdef CONFIG_GENERIC_PENDING_IRQ
+void move_native_irq_desc(struct irq_desc **descp);
+void move_masked_irq_desc(struct irq_desc **descp);
+#ifndef CONFIG_SPARSE_IRQ
void move_native_irq(int irq);
void move_masked_irq(int irq);
+#endif
#else /* CONFIG_GENERIC_PENDING_IRQ */
@@ -380,6 +468,11 @@ extern int set_irq_msi(unsigned int irq,
#define get_irq_data(irq) (irq_to_desc(irq)->handler_data)
#define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc)
+#define get_irq_desc_chip(desc) ((desc)->chip)
+#define get_irq_desc_chip_data(desc) ((desc)->chip_data)
+#define get_irq_desc_data(desc) ((desc)->handler_data)
+#define get_irq_desc_msi(desc) ((desc)->msi_desc)
+
#endif /* CONFIG_GENERIC_HARDIRQS */
#endif /* !CONFIG_S390 */
Index: linux-2.6/include/linux/kernel_stat.h
===================================================================
--- linux-2.6.orig/include/linux/kernel_stat.h
+++ linux-2.6/include/linux/kernel_stat.h
@@ -28,7 +28,9 @@ struct cpu_usage_stat {
struct kernel_stat {
struct cpu_usage_stat cpustat;
- unsigned int irqs[NR_IRQS];
+#ifndef CONFIG_SPARSE_IRQ
+ unsigned int irqs[NR_IRQS];
+#endif
};
DECLARE_PER_CPU(struct kernel_stat, kstat);
@@ -39,6 +41,10 @@ DECLARE_PER_CPU(struct kernel_stat, ksta
extern unsigned long long nr_context_switches(void);
+#ifndef CONFIG_SPARSE_IRQ
+#define kstat_irqs_this_cpu(irq) \
+ (kstat_this_cpu.irqs[irq])
+
struct irq_desc;
static inline void kstat_incr_irqs_this_cpu(unsigned int irq,
@@ -46,11 +52,17 @@ static inline void kstat_incr_irqs_this_
{
kstat_this_cpu.irqs[irq]++;
}
+#endif
+
+#ifndef CONFIG_SPARSE_IRQ
static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
{
return kstat_cpu(cpu).irqs[irq];
}
+#else
+extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu);
+#endif
/*
* Number of interrupts per specific IRQ source, since bootup
Index: linux-2.6/kernel/irq/autoprobe.c
===================================================================
--- linux-2.6.orig/kernel/irq/autoprobe.c
+++ linux-2.6/kernel/irq/autoprobe.c
@@ -57,7 +57,7 @@ unsigned long probe_irq_on(void)
desc->chip->startup(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
/* Wait for longstanding interrupts to trigger. */
msleep(20);
@@ -75,7 +75,7 @@ unsigned long probe_irq_on(void)
desc->status |= IRQ_PENDING;
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
/*
* Wait for spurious interrupts to trigger
@@ -99,7 +99,7 @@ unsigned long probe_irq_on(void)
mask |= 1 << i;
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
return mask;
}
@@ -135,7 +135,7 @@ unsigned int probe_irq_mask(unsigned lon
desc->chip->shutdown(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
mutex_unlock(&probing_active);
return mask & val;
@@ -179,7 +179,7 @@ int probe_irq_off(unsigned long val)
desc->chip->shutdown(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
mutex_unlock(&probing_active);
if (nr_of_irqs > 1)
Index: linux-2.6/kernel/irq/chip.c
===================================================================
--- linux-2.6.orig/kernel/irq/chip.c
+++ linux-2.6/kernel/irq/chip.c
@@ -24,9 +24,10 @@
*/
void dynamic_irq_init(unsigned int irq)
{
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_desc *desc;
unsigned long flags;
+ desc = irq_to_desc(irq);
if (!desc) {
WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
return;
@@ -223,7 +224,7 @@ static void default_enable(unsigned int
{
struct irq_desc *desc = irq_to_desc(irq);
- desc->chip->unmask(irq);
+ desc_chip_unmask(irq, &desc);
desc->status &= ~IRQ_MASKED;
}
@@ -252,7 +253,7 @@ static void default_shutdown(unsigned in
{
struct irq_desc *desc = irq_to_desc(irq);
- desc->chip->mask(irq);
+ desc_chip_mask(irq, &desc);
desc->status |= IRQ_MASKED;
}
@@ -282,13 +283,15 @@ void irq_chip_set_defaults(struct irq_ch
chip->end = dummy_irq_chip.end;
}
-static inline void mask_ack_irq(struct irq_desc *desc, int irq)
+static inline void mask_ack_irq(struct irq_desc **descp, int irq)
{
+ struct irq_desc *desc = *descp;
+
if (desc->chip->mask_ack)
- desc->chip->mask_ack(irq);
+ desc_chip_mask_ack(irq, descp);
else {
- desc->chip->mask(irq);
- desc->chip->ack(irq);
+ desc_chip_mask(irq, descp);
+ desc_chip_ack(irq, descp);
}
}
@@ -351,7 +354,7 @@ handle_level_irq(unsigned int irq, struc
irqreturn_t action_ret;
spin_lock(&desc->lock);
- mask_ack_irq(desc, irq);
+ mask_ack_irq(&desc, irq);
if (unlikely(desc->status & IRQ_INPROGRESS))
goto out_unlock;
@@ -376,7 +379,7 @@ handle_level_irq(unsigned int irq, struc
spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
- desc->chip->unmask(irq);
+ desc_chip_unmask(irq, &desc);
out_unlock:
spin_unlock(&desc->lock);
}
@@ -413,7 +416,7 @@ handle_fasteoi_irq(unsigned int irq, str
if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
desc->status |= IRQ_PENDING;
if (desc->chip->mask)
- desc->chip->mask(irq);
+ desc_chip_mask(irq, &desc);
goto out;
}
@@ -428,7 +431,7 @@ handle_fasteoi_irq(unsigned int irq, str
spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
out:
- desc->chip->eoi(irq);
+ desc_chip_eoi(irq, &desc);
spin_unlock(&desc->lock);
}
@@ -464,13 +467,13 @@ handle_edge_irq(unsigned int irq, struct
if (unlikely((desc->status & (IRQ_INPROGRESS | IRQ_DISABLED)) ||
!desc->action)) {
desc->status |= (IRQ_PENDING | IRQ_MASKED);
- mask_ack_irq(desc, irq);
+ mask_ack_irq(&desc, irq);
goto out_unlock;
}
kstat_incr_irqs_this_cpu(irq, desc);
/* Start handling the irq */
- desc->chip->ack(irq);
+ desc_chip_ack(irq, &desc);
/* Mark the IRQ currently in progress.*/
desc->status |= IRQ_INPROGRESS;
@@ -480,7 +483,7 @@ handle_edge_irq(unsigned int irq, struct
irqreturn_t action_ret;
if (unlikely(!action)) {
- desc->chip->mask(irq);
+ desc_chip_mask(irq, &desc);
goto out_unlock;
}
@@ -492,7 +495,7 @@ handle_edge_irq(unsigned int irq, struct
if (unlikely((desc->status &
(IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) ==
(IRQ_PENDING | IRQ_MASKED))) {
- desc->chip->unmask(irq);
+ desc_chip_unmask(irq, &desc);
desc->status &= ~IRQ_MASKED;
}
@@ -525,14 +528,14 @@ handle_percpu_irq(unsigned int irq, stru
kstat_incr_irqs_this_cpu(irq, desc);
if (desc->chip->ack)
- desc->chip->ack(irq);
+ desc_chip_ack(irq, &desc);
action_ret = handle_IRQ_event(irq, desc->action);
if (!noirqdebug)
note_interrupt(irq, desc, action_ret);
if (desc->chip->eoi)
- desc->chip->eoi(irq);
+ desc_chip_eoi(irq, &desc);
}
void
@@ -568,7 +571,7 @@ __set_irq_handler(unsigned int irq, irq_
/* Uninstall? */
if (handle == handle_bad_irq) {
if (desc->chip != &no_irq_chip)
- mask_ack_irq(desc, irq);
+ mask_ack_irq(&desc, irq);
desc->status |= IRQ_DISABLED;
desc->depth = 1;
}
Index: linux-2.6/kernel/irq/handle.c
===================================================================
--- linux-2.6.orig/kernel/irq/handle.c
+++ linux-2.6/kernel/irq/handle.c
@@ -15,9 +15,16 @@
#include <linux/random.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
+#include <linux/rculist.h>
+#include <linux/hash.h>
#include "internals.h"
+/*
+ * lockdep: we want to handle all irq_desc locks as a single lock-class:
+ */
+static struct lock_class_key irq_desc_lock_class;
+
/**
* handle_bad_irq - handle spurious and unhandled irqs
* @irq: the interrupt number
@@ -49,6 +56,190 @@ void handle_bad_irq(unsigned int irq, st
int nr_irqs = NR_IRQS;
EXPORT_SYMBOL_GPL(nr_irqs);
+void __init __attribute__((weak)) arch_early_irq_init(void)
+{
+}
+
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_desc irq_desc_init = {
+ .irq = -1,
+ .status = IRQ_DISABLED,
+ .chip = &no_irq_chip,
+ .handle_irq = handle_bad_irq,
+ .depth = 1,
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
+#ifdef CONFIG_SMP
+ .affinity = CPU_MASK_ALL
+#endif
+};
+
+static void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr)
+{
+ unsigned long bytes;
+ char *ptr;
+ int node;
+
+ /* Compute how many bytes we need per irq and allocate them */
+ bytes = nr * sizeof(unsigned int);
+
+ node = cpu_to_node(cpu);
+ ptr = kzalloc_node(bytes, GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc kstat_irqs on cpu %d node %d\n", cpu, node);
+
+ if (ptr)
+ desc->kstat_irqs = (unsigned int *)ptr;
+}
+
+void __attribute__((weak)) arch_init_chip_data(struct irq_desc *desc, int cpu)
+{
+}
+
+static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu)
+{
+ memcpy(desc, &irq_desc_init, sizeof(struct irq_desc));
+ desc->irq = irq;
+#ifdef CONFIG_SMP
+ desc->cpu = cpu;
+#endif
+ lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ init_kstat_irqs(desc, cpu, nr_cpu_ids);
+ if (!desc->kstat_irqs) {
+ printk(KERN_ERR "can not alloc kstat_irqs\n");
+ BUG_ON(1);
+ }
+ arch_init_chip_data(desc, cpu);
+}
+
+/*
+ * Protect the sparse_irqs_free freelist:
+ */
+static DEFINE_SPINLOCK(sparse_irq_lock);
+LIST_HEAD(sparse_irqs_head);
+
+/*
+ * The sparse irqs are in a hash-table as well, for fast lookup:
+ */
+#define SPARSEIRQHASH_BITS (13 - 1)
+#define SPARSEIRQHASH_SIZE (1UL << SPARSEIRQHASH_BITS)
+#define __sparseirqhashfn(key) hash_long((unsigned long)key, SPARSEIRQHASH_BITS)
+#define sparseirqhashentry(key) (sparseirqhash_table + __sparseirqhashfn((key)))
+
+static struct list_head sparseirqhash_table[SPARSEIRQHASH_SIZE];
+
+static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = {
+ [0 ... NR_IRQS_LEGACY-1] = {
+ .irq = -1,
+ .status = IRQ_DISABLED,
+ .chip = &no_irq_chip,
+ .handle_irq = handle_bad_irq,
+ .depth = 1,
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
+#ifdef CONFIG_SMP
+ .affinity = CPU_MASK_ALL
+#endif
+ }
+};
+
+/* FIXME: use bootmem alloc ...*/
+static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS];
+
+void __init early_irq_init(void)
+{
+ struct irq_desc *desc;
+ int legacy_count;
+ int i;
+
+ /* init list for sparseirq */
+ for (i = 0; i < SPARSEIRQHASH_SIZE; i++)
+ INIT_LIST_HEAD(sparseirqhash_table + i);
+
+ desc = irq_desc_legacy;
+ legacy_count = ARRAY_SIZE(irq_desc_legacy);
+
+ for (i = 0; i < legacy_count; i++) {
+ struct list_head *hash_head;
+
+ hash_head = sparseirqhashentry(i);
+ desc[i].irq = i;
+ desc[i].kstat_irqs = kstat_irqs_legacy[i];
+ list_add_tail(&desc[i].hash_entry, hash_head);
+ list_add_tail(&desc[i].list, &sparse_irqs_head);
+ }
+
+ arch_early_irq_init();
+}
+
+struct irq_desc *irq_to_desc(unsigned int irq)
+{
+ struct irq_desc *desc;
+ struct list_head *hash_head;
+
+ hash_head = sparseirqhashentry(irq);
+
+ /*
+ * We can walk the hash lockfree, because the hash only
+ * grows, and we are careful when adding entries to the end:
+ */
+ list_for_each_entry(desc, hash_head, hash_entry) {
+ if (desc->irq == irq)
+ return desc;
+ }
+
+ return NULL;
+}
+
+struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc;
+ struct list_head *hash_head;
+ unsigned long flags;
+ int node;
+
+ desc = irq_to_desc(irq);
+ if (desc)
+ return desc;
+
+ hash_head = sparseirqhashentry(irq);
+
+ spin_lock_irqsave(&sparse_irq_lock, flags);
+
+ /*
+ * We have to do the hash-walk again, to avoid races
+ * with another CPU:
+ */
+ list_for_each_entry(desc, hash_head, hash_entry) {
+ if (desc->irq == irq)
+ goto out_unlock;
+ }
+
+ node = cpu_to_node(cpu);
+ desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_desc for %d aka %#x on cpu %d node %d\n",
+ irq, irq, cpu, node);
+ if (!desc) {
+ printk(KERN_ERR "can not alloc irq_desc\n");
+ BUG_ON(1);
+ }
+ init_one_irq_desc(irq, desc, cpu);
+
+ /*
+ * We use RCU's safe list-add method to make
+ * parallel walking of the hash-list safe:
+ */
+ list_add_tail_rcu(&desc->hash_entry, hash_head);
+ /*
+ * Add it to the global list:
+ */
+ list_add_tail_rcu(&desc->list, &sparse_irqs_head);
+
+out_unlock:
+ spin_unlock_irqrestore(&sparse_irq_lock, flags);
+
+ return desc;
+}
+
+#else
+
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
[0 ... NR_IRQS-1] = {
.status = IRQ_DISABLED,
@@ -62,17 +253,30 @@ struct irq_desc irq_desc[NR_IRQS] __cach
}
};
+#endif
+
/*
* What should we do if we get a hw irq event on an illegal vector?
* Each architecture has to answer this themself.
*/
+static void ack_bad_desc(struct irq_desc **descp)
+{
+ unsigned int irq = (*descp)->irq;
+
+ print_irq_desc(irq, *descp);
+ ack_bad_irq(irq);
+}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define ack_bad ack_bad_desc
+#else
static void ack_bad(unsigned int irq)
{
struct irq_desc *desc = irq_to_desc(irq);
- print_irq_desc(irq, desc);
- ack_bad_irq(irq);
+ ack_bad_desc(&desc);
}
+#endif
/*
* NOP functions
@@ -81,6 +285,14 @@ static void noop(unsigned int irq)
{
}
+#ifdef CONFIG_SPARSE_IRQ
+static void noop_desc(struct irq_desc **descp)
+{
+}
+#else
+#define noop_desc noop
+#endif
+
static unsigned int noop_ret(unsigned int irq)
{
return 0;
@@ -109,9 +321,9 @@ struct irq_chip dummy_irq_chip = {
.shutdown = noop,
.enable = noop,
.disable = noop,
- .ack = noop,
- .mask = noop,
- .unmask = noop,
+ .ack = noop_desc,
+ .mask = noop_desc,
+ .unmask = noop_desc,
.end = noop,
};
@@ -180,7 +392,7 @@ unsigned int __do_IRQ(unsigned int irq)
* No locking required for CPU-local interrupts:
*/
if (desc->chip->ack)
- desc->chip->ack(irq);
+ desc_chip_ack(irq, &desc);
if (likely(!(desc->status & IRQ_DISABLED))) {
action_ret = handle_IRQ_event(irq, desc->action);
if (!noirqdebug)
@@ -192,7 +404,7 @@ unsigned int __do_IRQ(unsigned int irq)
spin_lock(&desc->lock);
if (desc->chip->ack)
- desc->chip->ack(irq);
+ desc_chip_ack(irq, &desc);
/*
* REPLAY is when Linux resends an IRQ that was dropped earlier
* WAITING is used by probe to mark irqs that are being tested
@@ -261,17 +473,25 @@ out:
#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_SPARSE_IRQ
struct irq_desc *desc;
int i;
- for_each_irq_desc(i, desc)
+ for_each_irq_desc(i, desc) {
lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ } end_for_each_irq_desc();
+#endif
}
#endif
+
+#ifdef CONFIG_SPARSE_IRQ
+unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ return desc->kstat_irqs[cpu];
+}
+#endif
+EXPORT_SYMBOL(kstat_irqs_cpu);
+
Index: linux-2.6/arch/x86/kernel/irq.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq.c
+++ linux-2.6/arch/x86/kernel/irq.c
@@ -99,25 +99,37 @@ static int show_other_interrupts(struct
int show_interrupts(struct seq_file *p, void *v)
{
unsigned long flags, any_count = 0;
- int i = *(loff_t *) v, j;
+ int i, j;
struct irqaction *action;
struct irq_desc *desc;
+ int head = 0;
+#ifdef CONFIG_SPARSE_IRQ
+ desc = list_entry(v, struct irq_desc, list);
+ i = desc->irq;
+ if (&desc->list == sparse_irqs_head.next)
+ head = 1;
+#else
+ i = *(loff_t *) v;
if (i > nr_irqs)
return 0;
if (i == nr_irqs)
return show_other_interrupts(p);
+ if (i == 0)
+ head = 1;
+
+ desc = irq_to_desc(i);
+#endif
/* print header */
- if (i == 0) {
+ if (head) {
seq_printf(p, " ");
for_each_online_cpu(j)
seq_printf(p, "CPU%-8d", j);
seq_putc(p, '\n');
}
- desc = irq_to_desc(i);
spin_lock_irqsave(&desc->lock, flags);
#ifndef CONFIG_SMP
any_count = kstat_irqs(i);
@@ -148,6 +160,12 @@ int show_interrupts(struct seq_file *p,
seq_putc(p, '\n');
out:
spin_unlock_irqrestore(&desc->lock, flags);
+
+#ifdef CONFIG_SPARSE_IRQ
+ if (&desc->list == sparse_irqs_head.prev)
+ show_other_interrupts(p);
+#endif
+
return 0;
}
Index: linux-2.6/include/linux/irqnr.h
===================================================================
--- linux-2.6.orig/include/linux/irqnr.h
+++ linux-2.6/include/linux/irqnr.h
@@ -7,18 +7,11 @@
# define for_each_irq_desc(irq, desc) \
for (irq = 0; irq < nr_irqs; irq++)
-#else
-extern int nr_irqs;
+# define end_for_each_irq_desc()
-# define for_each_irq_desc(irq, desc) \
- for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
-
-# define for_each_irq_desc_reverse(irq, desc) \
- for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \
- irq >= 0; irq--, desc--)
+static inline early_sparse_irq_init(void)
+{
+}
#endif
-#define for_each_irq_nr(irq) \
- for (irq = 0; irq < nr_irqs; irq++)
-
#endif
Index: linux-2.6/arch/x86/kernel/irq_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_32.c
+++ linux-2.6/arch/x86/kernel/irq_32.c
@@ -251,10 +251,10 @@ void fixup_irqs(cpumask_t map)
mask = map;
}
if (desc->chip->set_affinity)
- desc->chip->set_affinity(irq, mask);
+ desc_chip_set_affinity(irq, desc, mask);
else if (desc->action && !(warned++))
printk("Cannot set affinity for irq %i\n", irq);
- }
+ } end_for_each_irq_desc();
#if 0
barrier();
Index: linux-2.6/arch/x86/kernel/irq_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_64.c
+++ linux-2.6/arch/x86/kernel/irq_64.c
@@ -109,15 +109,15 @@ void fixup_irqs(cpumask_t map)
}
if (desc->chip->mask)
- desc->chip->mask(irq);
+ desc_chip_mask(irq, &desc);
if (desc->chip->set_affinity)
- desc->chip->set_affinity(irq, mask);
+ desc_chip_set_affinity(irq, desc, mask);
else if (!(warned++))
set_affinity = 0;
if (desc->chip->unmask)
- desc->chip->unmask(irq);
+ desc_chip_unmask(irq, &desc);
spin_unlock(&desc->lock);
@@ -125,7 +125,7 @@ void fixup_irqs(cpumask_t map)
printk("Broke affinity for irq %i\n", irq);
else if (!set_affinity)
printk("Cannot set affinity for irq %i\n", irq);
- }
+ } end_for_each_irq_desc();
/* That doesn't seem sufficient. Give it 1ms. */
local_irq_enable();
Index: linux-2.6/kernel/irq/proc.c
===================================================================
--- linux-2.6.orig/kernel/irq/proc.c
+++ linux-2.6/kernel/irq/proc.c
@@ -243,7 +243,8 @@ void init_irq_proc(void)
/*
* Create entries for all existing IRQs.
*/
- for_each_irq_desc(irq, desc)
+ for_each_irq_desc(irq, desc) {
register_irq_proc(irq, desc);
+ } end_for_each_irq_desc();
}
Index: linux-2.6/kernel/irq/spurious.c
===================================================================
--- linux-2.6.orig/kernel/irq/spurious.c
+++ linux-2.6/kernel/irq/spurious.c
@@ -99,7 +99,7 @@ static int misrouted_irq(int irq)
if (try_one_irq(i, desc))
ok = 1;
- }
+ } end_for_each_irq_desc();
/* So the caller can adjust the irq error counts */
return ok;
}
@@ -122,7 +122,7 @@ static void poll_spurious_irqs(unsigned
continue;
try_one_irq(i, desc);
- }
+ } end_for_each_irq_desc();
mod_timer(&poll_spurious_irq_timer,
jiffies + POLL_SPURIOUS_IRQ_INTERVAL);
Index: linux-2.6/init/main.c
===================================================================
--- linux-2.6.orig/init/main.c
+++ linux-2.6/init/main.c
@@ -542,6 +542,15 @@ void __init __weak thread_info_cache_ini
{
}
+void __init __weak arch_early_irq_init(void)
+{
+}
+
+void __init __weak early_irq_init(void)
+{
+ arch_early_irq_init();
+}
+
asmlinkage void __init start_kernel(void)
{
char * command_line;
@@ -612,6 +621,8 @@ asmlinkage void __init start_kernel(void
sort_main_extable();
trap_init();
rcu_init();
+ /* init some links before init_ISA_irqs() */
+ early_irq_init();
init_IRQ();
pidhash_init();
init_timers();
Index: linux-2.6/arch/x86/include/asm/irq_vectors.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/irq_vectors.h
+++ linux-2.6/arch/x86/include/asm/irq_vectors.h
@@ -101,6 +101,8 @@
#define LAST_VM86_IRQ 15
#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
+#define NR_IRQS_LEGACY 16
+
#if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER)
# if NR_CPUS < MAX_IO_APICS
# define NR_IRQS (NR_VECTORS + (32 * NR_CPUS))
Index: linux-2.6/arch/x86/kernel/i8259.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/i8259.c
+++ linux-2.6/arch/x86/kernel/i8259.c
@@ -36,12 +36,31 @@ static int i8259A_auto_eoi;
DEFINE_SPINLOCK(i8259A_lock);
static void mask_and_ack_8259A(unsigned int);
+#ifdef CONFIG_SPARSE_IRQ
+static void mask_and_ack_8259A_desc(struct irq_desc **descp)
+{
+ mask_and_ack_8259A((*descp)->irq);
+}
+static void disable_8259A_irq_desc(struct irq_desc **descp)
+{
+ disable_8259A_irq((*descp)->irq);
+}
+static void enable_8259A_irq_desc(struct irq_desc **descp)
+{
+ enable_8259A_irq((*descp)->irq);
+}
+#else
+#define mask_and_ack_8259A_desc mask_and_ack_8259A
+#define disable_8259A_irq_desc disable_8259A_irq
+#define enable_8259A_irq_desc enable_8259A_irq
+#endif
+
struct irq_chip i8259A_chip = {
.name = "XT-PIC",
- .mask = disable_8259A_irq,
+ .mask = disable_8259A_irq_desc,
.disable = disable_8259A_irq,
- .unmask = enable_8259A_irq,
- .mask_ack = mask_and_ack_8259A,
+ .unmask = enable_8259A_irq_desc,
+ .mask_ack = mask_and_ack_8259A_desc,
};
/*
@@ -348,9 +367,9 @@ void init_8259A(int auto_eoi)
* In AEOI mode we just have to mask the interrupt
* when acking.
*/
- i8259A_chip.mask_ack = disable_8259A_irq;
+ i8259A_chip.mask_ack = disable_8259A_irq_desc;
else
- i8259A_chip.mask_ack = mask_and_ack_8259A;
+ i8259A_chip.mask_ack = mask_and_ack_8259A_desc;
udelay(100); /* wait for 8259A to initialize */
Index: linux-2.6/arch/x86/kernel/uv_irq.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/uv_irq.c
+++ linux-2.6/arch/x86/kernel/uv_irq.c
@@ -18,26 +18,45 @@ static void uv_noop(unsigned int irq)
{
}
+#ifdef CONFIG_SPARSE_IRQ
+static void uv_noop_desc(struct irq_desc **descp)
+{
+}
+
+#else
+#define uv_noop_desc uv_noop
+#endif
+
static unsigned int uv_noop_ret(unsigned int irq)
{
return 0;
}
+#ifdef CONFIG_SPARSE_IRQ
+static void uv_ack_apic_desc(struct irq_desc **descp)
+{
+ ack_APIC_irq();
+}
+
+#else
static void uv_ack_apic(unsigned int irq)
{
ack_APIC_irq();
}
+#define uv_ack_apic_desc uv_ack_apic
+#endif
+
struct irq_chip uv_irq_chip = {
.name = "UV-CORE",
.startup = uv_noop_ret,
.shutdown = uv_noop,
.enable = uv_noop,
.disable = uv_noop,
- .ack = uv_noop,
- .mask = uv_noop,
- .unmask = uv_noop,
- .eoi = uv_ack_apic,
+ .ack = uv_noop_desc,
+ .mask = uv_noop_desc,
+ .unmask = uv_noop_desc,
+ .eoi = uv_ack_apic_desc,
.end = uv_noop,
};
Index: linux-2.6/drivers/pci/msi.c
===================================================================
--- linux-2.6.orig/drivers/pci/msi.c
+++ linux-2.6/drivers/pci/msi.c
@@ -103,11 +103,11 @@ static void msix_set_enable(struct pci_d
}
}
-static void msix_flush_writes(unsigned int irq)
+static void msix_flush_writes(struct irq_desc *desc)
{
struct msi_desc *entry;
- entry = get_irq_msi(irq);
+ entry = get_irq_desc_msi(desc);
BUG_ON(!entry || !entry->dev);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
@@ -135,11 +135,11 @@ static void msix_flush_writes(unsigned i
* Returns 1 if it succeeded in masking the interrupt and 0 if the device
* doesn't support MSI masking.
*/
-static int msi_set_mask_bits(unsigned int irq, u32 mask, u32 flag)
+static int msi_set_mask_bits(struct irq_desc *desc, u32 mask, u32 flag)
{
struct msi_desc *entry;
- entry = get_irq_msi(irq);
+ entry = get_irq_desc_msi(desc);
BUG_ON(!entry || !entry->dev);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
@@ -172,9 +172,9 @@ static int msi_set_mask_bits(unsigned in
return 1;
}
-void read_msi_msg(unsigned int irq, struct msi_msg *msg)
+void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
{
- struct msi_desc *entry = get_irq_msi(irq);
+ struct msi_desc *entry = get_irq_desc_msi(desc);
switch(entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
{
@@ -211,9 +211,16 @@ void read_msi_msg(unsigned int irq, stru
}
}
-void write_msi_msg(unsigned int irq, struct msi_msg *msg)
+void read_msi_msg(unsigned int irq, struct msi_msg *msg)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ read_msi_msg_desc(desc, msg);
+}
+
+void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
{
- struct msi_desc *entry = get_irq_msi(irq);
+ struct msi_desc *entry = get_irq_desc_msi(desc);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
{
@@ -252,17 +259,43 @@ void write_msi_msg(unsigned int irq, str
entry->msg = *msg;
}
-void mask_msi_irq(unsigned int irq)
+void write_msi_msg(unsigned int irq, struct msi_msg *msg)
{
- msi_set_mask_bits(irq, 1, 1);
- msix_flush_writes(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ write_msi_msg_desc(desc, msg);
}
+void mask_msi_irq_desc(struct irq_desc **descp)
+{
+ struct irq_desc *desc = *descp;
+
+ msi_set_mask_bits(desc, 1, 1);
+ msix_flush_writes(desc);
+}
+
+void unmask_msi_irq_desc(struct irq_desc **descp)
+{
+ struct irq_desc *desc = *descp;
+
+ msi_set_mask_bits(desc, 1, 0);
+ msix_flush_writes(desc);
+}
+
+#ifndef CONFIG_SPARSE_IRQ
+void mask_msi_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_msi_irq_desc(&desc);
+}
void unmask_msi_irq(unsigned int irq)
{
- msi_set_mask_bits(irq, 1, 0);
- msix_flush_writes(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_msi_irq_desc(&desc);
}
+#endif
static int msi_free_irqs(struct pci_dev* dev);
@@ -303,9 +336,11 @@ static void __pci_restore_msi_state(stru
pci_intx_for_msi(dev, 0);
msi_set_enable(dev, 0);
write_msi_msg(dev->irq, &entry->msg);
- if (entry->msi_attrib.maskbit)
- msi_set_mask_bits(dev->irq, entry->msi_attrib.maskbits_mask,
+ if (entry->msi_attrib.maskbit) {
+ struct irq_desc *desc = irq_to_desc(dev->irq);
+ msi_set_mask_bits(desc, entry->msi_attrib.maskbits_mask,
entry->msi_attrib.masked);
+ }
pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
control &= ~PCI_MSI_FLAGS_QSIZE;
@@ -327,8 +362,9 @@ static void __pci_restore_msix_state(str
msix_set_enable(dev, 0);
list_for_each_entry(entry, &dev->msi_list, list) {
+ struct irq_desc *desc = irq_to_desc(entry->irq);
write_msi_msg(entry->irq, &entry->msg);
- msi_set_mask_bits(entry->irq, 1, entry->msi_attrib.masked);
+ msi_set_mask_bits(desc, 1, entry->msi_attrib.masked);
}
BUG_ON(list_empty(&dev->msi_list));
@@ -596,7 +632,8 @@ void pci_msi_shutdown(struct pci_dev* de
/* Return the the pci reset with msi irqs unmasked */
if (entry->msi_attrib.maskbit) {
u32 mask = entry->msi_attrib.maskbits_mask;
- msi_set_mask_bits(dev->irq, mask, ~mask);
+ struct irq_desc *desc = irq_to_desc(dev->irq);
+ msi_set_mask_bits(desc, mask, ~mask);
}
if (!entry->dev || entry->msi_attrib.type != PCI_CAP_ID_MSI)
return;
Index: linux-2.6/include/linux/msi.h
===================================================================
--- linux-2.6.orig/include/linux/msi.h
+++ linux-2.6/include/linux/msi.h
@@ -10,8 +10,18 @@ struct msi_msg {
};
/* Helper functions */
+struct irq_desc;
+#ifdef CONFIG_SPARSE_IRQ
+extern void mask_msi_irq_desc(struct irq_desc **descp);
+extern void unmask_msi_irq_desc(struct irq_desc **descp);
+#define mask_msi_irq mask_msi_irq_desc
+#define unmask_msi_irq unmask_msi_irq_desc
+#else
extern void mask_msi_irq(unsigned int irq);
extern void unmask_msi_irq(unsigned int irq);
+#endif
+extern void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg);
+extern void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg);
extern void read_msi_msg(unsigned int irq, struct msi_msg *msg);
extern void write_msi_msg(unsigned int irq, struct msi_msg *msg);
Index: linux-2.6/arch/x86/include/asm/hpet.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/hpet.h
+++ linux-2.6/arch/x86/include/asm/hpet.h
@@ -72,8 +72,15 @@ extern void hpet_disable(void);
extern unsigned long hpet_readl(unsigned long a);
extern void force_hpet_resume(void);
+#ifdef CONFIG_SPARSE_IRQ
+extern void hpet_msi_unmask_desc(struct irq_desc **descp);
+extern void hpet_msi_mask_desc(struct irq_desc **descp);
+#define hpet_msi_unmask hpet_msi_unmask_desc
+#define hpet_msi_mask hpet_msi_mask_desc
+#else
extern void hpet_msi_unmask(unsigned int irq);
extern void hpet_msi_mask(unsigned int irq);
+#endif
extern void hpet_msi_write(unsigned int irq, struct msi_msg *msg);
extern void hpet_msi_read(unsigned int irq, struct msi_msg *msg);
Index: linux-2.6/arch/x86/kernel/hpet.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/hpet.c
+++ linux-2.6/arch/x86/kernel/hpet.c
@@ -347,9 +347,9 @@ static int hpet_legacy_next_event(unsign
static DEFINE_PER_CPU(struct hpet_dev *, cpu_hpet_dev);
static struct hpet_dev *hpet_devs;
-void hpet_msi_unmask(unsigned int irq)
+void hpet_msi_unmask_desc(struct irq_desc **descp)
{
- struct hpet_dev *hdev = get_irq_data(irq);
+ struct hpet_dev *hdev = get_irq_desc_data(*descp);
unsigned long cfg;
/* unmask it */
@@ -358,10 +358,10 @@ void hpet_msi_unmask(unsigned int irq)
hpet_writel(cfg, HPET_Tn_CFG(hdev->num));
}
-void hpet_msi_mask(unsigned int irq)
+void hpet_msi_mask_desc(struct irq_desc **descp)
{
unsigned long cfg;
- struct hpet_dev *hdev = get_irq_data(irq);
+ struct hpet_dev *hdev = get_irq_desc_data(*descp);
/* mask it */
cfg = hpet_readl(HPET_Tn_CFG(hdev->num));
@@ -369,6 +369,21 @@ void hpet_msi_mask(unsigned int irq)
hpet_writel(cfg, HPET_Tn_CFG(hdev->num));
}
+#ifndef CONFIG_SPARSE_IRQ
+void hpet_msi_unmask(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ hpet_msi_unmask_desc(&desc);
+}
+void hpet_msi_mask(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ hpet_msi_mask_desc(&desc);
+}
+#endif
+
void hpet_msi_write(unsigned int irq, struct msi_msg *msg)
{
struct hpet_dev *hdev = get_irq_data(irq);
Index: linux-2.6/include/linux/htirq.h
===================================================================
--- linux-2.6.orig/include/linux/htirq.h
+++ linux-2.6/include/linux/htirq.h
@@ -9,8 +9,16 @@ struct ht_irq_msg {
/* Helper functions.. */
void fetch_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg);
void write_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg);
+#ifdef CONFIG_SPARSE_IRQ
+struct irq_desc;
+void mask_ht_irq_desc(struct irq_desc **descp);
+void unmask_ht_irq_desc(struct irq_desc **descp);
+#define mask_ht_irq mask_ht_irq_desc
+#define unmask_ht_irq unmask_ht_irq_desc
+#else
void mask_ht_irq(unsigned int irq);
void unmask_ht_irq(unsigned int irq);
+#endif
/* The arch hook for getting things started */
int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev);
Index: linux-2.6/kernel/irq/migration.c
===================================================================
--- linux-2.6.orig/kernel/irq/migration.c
+++ linux-2.6/kernel/irq/migration.c
@@ -1,9 +1,9 @@
#include <linux/irq.h>
-void move_masked_irq(int irq)
+void move_masked_irq_desc(struct irq_desc **descp)
{
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_desc *desc = *descp;
cpumask_t tmp;
if (likely(!(desc->status & IRQ_MOVE_PENDING)))
@@ -42,14 +42,17 @@ void move_masked_irq(int irq)
* masking the irqs.
*/
if (likely(!cpus_empty(tmp))) {
- desc->chip->set_affinity(irq,tmp);
+ desc_chip_set_affinity(desc->irq, desc, tmp);
}
cpus_clear(desc->pending_mask);
}
-void move_native_irq(int irq)
+void move_native_irq_desc(struct irq_desc **descp)
{
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_desc *desc = *descp;
+#ifndef CONFIG_SPARSE_IRQ
+ unsigned int irq = desc->irq;
+#endif
if (likely(!(desc->status & IRQ_MOVE_PENDING)))
return;
@@ -57,8 +60,23 @@ void move_native_irq(int irq)
if (unlikely(desc->status & IRQ_DISABLED))
return;
- desc->chip->mask(irq);
- move_masked_irq(irq);
- desc->chip->unmask(irq);
+ desc_chip_mask(irq, descp);
+ move_masked_irq_desc(descp);
+ desc_chip_unmask(irq, descp);
}
+#ifndef CONFIG_SPARSE_IRQ
+void move_masked_irq(int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ move_masked_irq_desc(&desc);
+}
+
+void move_native_irq(int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ move_native_irq_desc(&desc);
+}
+#endif
Index: linux-2.6/drivers/pci/intel-iommu.c
===================================================================
--- linux-2.6.orig/drivers/pci/intel-iommu.c
+++ linux-2.6/drivers/pci/intel-iommu.c
@@ -751,9 +751,9 @@ const char *dmar_get_fault_reason(u8 fau
return fault_reason_strings[fault_reason];
}
-void dmar_msi_unmask(unsigned int irq)
+void dmar_msi_unmask_desc(struct irq_desc **descp)
{
- struct intel_iommu *iommu = get_irq_data(irq);
+ struct intel_iommu *iommu = get_irq_desc_data(*descp);
unsigned long flag;
/* unmask it */
@@ -764,10 +764,10 @@ void dmar_msi_unmask(unsigned int irq)
spin_unlock_irqrestore(&iommu->register_lock, flag);
}
-void dmar_msi_mask(unsigned int irq)
+void dmar_msi_mask_desc(struct irq_desc **descp)
{
unsigned long flag;
- struct intel_iommu *iommu = get_irq_data(irq);
+ struct intel_iommu *iommu = get_irq_desc_data(*descp);
/* mask it */
spin_lock_irqsave(&iommu->register_lock, flag);
@@ -777,6 +777,21 @@ void dmar_msi_mask(unsigned int irq)
spin_unlock_irqrestore(&iommu->register_lock, flag);
}
+#ifndef CONFIG_SPARSE_IRQ
+void dmar_msi_unmask(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ dmar_msi_unmask_desc(&desc);
+}
+void dmar_msi_mask(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ dmar_msi_mask_desc(&desc);
+}
+#endif
+
void dmar_msi_write(int irq, struct msi_msg *msg)
{
struct intel_iommu *iommu = get_irq_data(irq);
Index: linux-2.6/include/linux/dmar.h
===================================================================
--- linux-2.6.orig/include/linux/dmar.h
+++ linux-2.6/include/linux/dmar.h
@@ -122,8 +122,15 @@ extern const char *dmar_get_fault_reason
/* Can't use the common MSI interrupt functions
* since DMAR is not a pci device
*/
+#ifdef CONFIG_SPARSE_IRQ
+extern void dmar_msi_unmask_desc(struct irq_desc **descp);
+extern void dmar_msi_mask_desc(struct irq_desc **descp);
+#define dmar_msi_unmask dmar_msi_unmask_desc
+#define dmar_msi_mask dmar_msi_mask_desc
+#else
extern void dmar_msi_unmask(unsigned int irq);
extern void dmar_msi_mask(unsigned int irq);
+#endif
extern void dmar_msi_read(int irq, struct msi_msg *msg);
extern void dmar_msi_write(int irq, struct msi_msg *msg);
extern int dmar_set_interrupt(struct intel_iommu *iommu);
Index: linux-2.6/kernel/irq/manage.c
===================================================================
--- linux-2.6.orig/kernel/irq/manage.c
+++ linux-2.6/kernel/irq/manage.c
@@ -92,14 +92,14 @@ int irq_set_affinity(unsigned int irq, c
#ifdef CONFIG_GENERIC_PENDING_IRQ
if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) {
desc->affinity = cpumask;
- desc->chip->set_affinity(irq, cpumask);
+ desc_chip_set_affinity(irq, desc, cpumask);
} else {
desc->status |= IRQ_MOVE_PENDING;
desc->pending_mask = cpumask;
}
#else
desc->affinity = cpumask;
- desc->chip->set_affinity(irq, cpumask);
+ desc_chip_set_affinity(irq, desc, cpumask);
#endif
desc->status |= IRQ_AFFINITY_SET;
spin_unlock_irqrestore(&desc->lock, flags);
@@ -131,7 +131,7 @@ int do_irq_select_affinity(unsigned int
}
desc->affinity = mask;
- desc->chip->set_affinity(irq, mask);
+ desc_chip_set_affinity(irq, desc, mask);
return 0;
}
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] irq: sparseirq enabling
2008-11-24 2:59 [PATCH 1/2] irq: sparseirq enabling Yinghai Lu
@ 2008-11-24 14:40 ` Ingo Molnar
2008-11-24 19:22 ` Yinghai Lu
2008-11-25 3:57 ` [PATCH 1/2] irq: sparseirq enabling v2 Yinghai Lu
0 siblings, 2 replies; 20+ messages in thread
From: Ingo Molnar @ 2008-11-24 14:40 UTC (permalink / raw)
To: Yinghai Lu
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
* Yinghai Lu <yinghai@kernel.org> wrote:
> +/*
> + * Protect the sparse_irqs_free freelist:
> + */
> +static DEFINE_SPINLOCK(sparse_irq_lock);
> +LIST_HEAD(sparse_irqs_head);
> +
> +/*
> + * The sparse irqs are in a hash-table as well, for fast lookup:
> + */
> +#define SPARSEIRQHASH_BITS (13 - 1)
> +#define SPARSEIRQHASH_SIZE (1UL << SPARSEIRQHASH_BITS)
> +#define __sparseirqhashfn(key) hash_long((unsigned long)key, SPARSEIRQHASH_BITS)
> +#define sparseirqhashentry(key) (sparseirqhash_table + __sparseirqhashfn((key)))
> +
> +static struct list_head sparseirqhash_table[SPARSEIRQHASH_SIZE];
> +
> +struct irq_desc *irq_to_desc(unsigned int irq)
> +{
> + struct irq_desc *desc;
> + struct list_head *hash_head;
> +
> + hash_head = sparseirqhashentry(irq);
> +
> + /*
> + * We can walk the hash lockfree, because the hash only
> + * grows, and we are careful when adding entries to the end:
> + */
> + list_for_each_entry(desc, hash_head, hash_entry) {
> + if (desc->irq == irq)
> + return desc;
> + }
> +
> + return NULL;
> +}
I have talked to Thomas about the current design of sparseirq, and the
current code looks pretty good already, but we'd like to suggest one
more refinement to the hashing scheme:
Please simplify it by using a sparse pointers static array instead of
a full hash. I.e. do it as a:
struct irq_desc *irq_desc_ptrs[NR_IRQS] __read_mostly;
This can scale up just fine to 4096 CPUs without measurable impact to
the kernel image size on x86 distro kernels.
Data structure rules:
1) allocation: an entry would be allocated at IRQ number creation time
- never at any other time. Pure access to the desc returns NULL -
it's atomic and lockless.
2) freeing: we never free them. If a system allocates an irq_desc[],
it signals that it uses it. This makes all access lockless.
3) lookup: irq_to_desc() just does a simple irq_desc_ptrs[irq]
dereference (inlined) - no locking or hash lookup needed. Since
irq_desc_ptrs[] is accessed __read_mostly, this will scale really
well even on NUMA.
4) iterators: we still keep NR_IRQS as a limit for the
irq_desc_ptrs[] array - but it would never be used directly by any
iteration loop, in generic code.
5) bootup, pre-kmalloc irq_desc access: on x86 we should preallocate a
pool of ~32 irq_desc entries for allocation use. This can be a
simple static array of struct irq_desc that is fed into the
first 32 legacy irq_desc[] slots or so. No bootmem-alloc and
no after_bootmem flaggery needed. All SMP init and secondary CPU
irq desc allocation happens after kmalloc is active already -
cleaning up the allocation path.
6) limits on x86: please scale NR_IRQS to this rule:
max(32*MAX_IO_APICS, 8*NR_CPUS)
That gives a minimum of 4096 IRQs on 64-bit systems. On even larger
systems, we scale linearly up to 32K IRQs on 4K CPUs. That should
be more than enough (and it can be increased if really needed).
Please keep all the irq_desc[] abstraction APIs and cleanups you did
so far - they are great. In the far future we can still make irq_desc
a full hash if needed - but right now we'll be just fine with such a
simpler scheme as well, and scale fine up to 16K CPUs or so.
This should simplify quite a few things in the sparseirq code.
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] irq: sparseirq enabling
2008-11-24 14:40 ` Ingo Molnar
@ 2008-11-24 19:22 ` Yinghai Lu
2008-11-24 22:26 ` Thomas Gleixner
2008-11-25 3:57 ` [PATCH 1/2] irq: sparseirq enabling v2 Yinghai Lu
1 sibling, 1 reply; 20+ messages in thread
From: Yinghai Lu @ 2008-11-24 19:22 UTC (permalink / raw)
To: Ingo Molnar
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
Ingo Molnar wrote:
> * Yinghai Lu <yinghai@kernel.org> wrote:
>
>> +/*
>> + * Protect the sparse_irqs_free freelist:
>> + */
>> +static DEFINE_SPINLOCK(sparse_irq_lock);
>> +LIST_HEAD(sparse_irqs_head);
>> +
>> +/*
>> + * The sparse irqs are in a hash-table as well, for fast lookup:
>> + */
>> +#define SPARSEIRQHASH_BITS (13 - 1)
>> +#define SPARSEIRQHASH_SIZE (1UL << SPARSEIRQHASH_BITS)
>> +#define __sparseirqhashfn(key) hash_long((unsigned long)key, SPARSEIRQHASH_BITS)
>> +#define sparseirqhashentry(key) (sparseirqhash_table + __sparseirqhashfn((key)))
>> +
>> +static struct list_head sparseirqhash_table[SPARSEIRQHASH_SIZE];
>> +
>
>> +struct irq_desc *irq_to_desc(unsigned int irq)
>> +{
>> + struct irq_desc *desc;
>> + struct list_head *hash_head;
>> +
>> + hash_head = sparseirqhashentry(irq);
>> +
>> + /*
>> + * We can walk the hash lockfree, because the hash only
>> + * grows, and we are careful when adding entries to the end:
>> + */
>> + list_for_each_entry(desc, hash_head, hash_entry) {
>> + if (desc->irq == irq)
>> + return desc;
>> + }
>> +
>> + return NULL;
>> +}
>
> I have talked to Thomas about the current design of sparseirq, and the
> current code looks pretty good already, but we'd like to suggest one
> more refinement to the hashing scheme:
>
> Please simplify it by using a sparse pointers static array instead of
> a full hash. I.e. do it as a:
>
> struct irq_desc *irq_desc_ptrs[NR_IRQS] __read_mostly;
>
> This can scale up just fine to 4096 CPUs without measurable impact to
> the kernel image size on x86 distro kernels.
>
> Data structure rules:
>
> 1) allocation: an entry would be allocated at IRQ number creation time
> - never at any other time. Pure access to the desc returns NULL -
> it's atomic and lockless.
>
> 2) freeing: we never free them. If a system allocates an irq_desc[],
> it signals that it uses it. This makes all access lockless.
>
> 3) lookup: irq_to_desc() just does a simple irq_desc_ptrs[irq]
> dereference (inlined) - no locking or hash lookup needed. Since
> irq_desc_ptrs[] is accessed __read_mostly, this will scale really
> well even on NUMA.
>
> 4) iterators: we still keep NR_IRQS as a limit for the
> irq_desc_ptrs[] array - but it would never be used directly by any
> iteration loop, in generic code.
>
> 5) bootup, pre-kmalloc irq_desc access: on x86 we should preallocate a
> pool of ~32 irq_desc entries for allocation use. This can be a
> simple static array of struct irq_desc that is fed into the
> first 32 legacy irq_desc[] slots or so. No bootmem-alloc and
> no after_bootmem flaggery needed. All SMP init and secondary CPU
> irq desc allocation happens after kmalloc is active already -
> cleaning up the allocation path.
>
> 6) limits on x86: please scale NR_IRQS to this rule:
> max(32*MAX_IO_APICS, 8*NR_CPUS)
>
> That gives a minimum of 4096 IRQs on 64-bit systems. On even larger
> systems, we scale linearly up to 32K IRQs on 4K CPUs. That should
> be more than enough (and it can be increased if really needed).
>
> Please keep all the irq_desc[] abstraction APIs and cleanups you did
> so far - they are great. In the far future we can still make irq_desc
> a full hash if needed - but right now we'll be just fine with such a
> simpler scheme as well, and scale fine up to 16K CPUs or so.
>
> This should simplify quite a few things in the sparseirq code.
ok, will change to that.
1. nr_irqs will be legacy number or GSI numbers. MSI will start to use irq nr from nr_irqs
2. or MSI still to use irq from NR_IRQS - 1, and ... go smaller?
YH
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] irq: sparseirq enabling
2008-11-24 19:22 ` Yinghai Lu
@ 2008-11-24 22:26 ` Thomas Gleixner
0 siblings, 0 replies; 20+ messages in thread
From: Thomas Gleixner @ 2008-11-24 22:26 UTC (permalink / raw)
To: Yinghai Lu
Cc: Ingo Molnar, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
On Mon, 24 Nov 2008, Yinghai Lu wrote:
> Ingo Molnar wrote:
> > This should simplify quite a few things in the sparseirq code.
>
> ok, will change to that.
>
> 1. nr_irqs will be legacy number or GSI numbers. MSI will start to use irq nr from nr_irqs
> 2. or MSI still to use irq from NR_IRQS - 1, and ... go smaller?
We should go up from legacy/GSI. We can decode the max. number of
possible "wired" irqs from the number of IO_APICs. Everything above
that is "virtual MSI" space.
Going down just makes it harder to read (numbers have more
digits for no value).
Thanks,
tglx
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 1/2] irq: sparseirq enabling v2
2008-11-24 14:40 ` Ingo Molnar
2008-11-24 19:22 ` Yinghai Lu
@ 2008-11-25 3:57 ` Yinghai Lu
2008-11-25 3:58 ` [PATCH 2/2] irq: move irq_desc according to smp_affinity v2 Yinghai Lu
2008-11-26 7:48 ` [PATCH 1/2] irq: sparseirq enabling v2 Ingo Molnar
1 sibling, 2 replies; 20+ messages in thread
From: Yinghai Lu @ 2008-11-25 3:57 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel@vger.kernel.org
impact: new feature sparseirq
add some kind of hash table as Ingo suggesting.
remove dyna_array
when sparse_irq is used (CONFIG_SPARSE_IRQ), use kzalloc_node to get irq_desc, irq_cfg
use desc->chip_data for x86 to store irq_cfg
also prepare
need to add struct (irq_desc **descp) to ack_edge/level to make sure desc get updated
try to pass desc cfg as more as possible to avoid list looking up.
seperate move_irq_desc to another patch
v2: use pointer array instead of hash
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/Kconfig | 10
arch/x86/include/asm/hpet.h | 7
arch/x86/include/asm/irq_vectors.h | 11
arch/x86/kernel/hpet.c | 23 -
arch/x86/kernel/i8259.c | 29 +
arch/x86/kernel/io_apic.c | 799 +++++++++++++++++++++++++------------
arch/x86/kernel/irq.c | 24 -
arch/x86/kernel/irq_32.c | 4
arch/x86/kernel/irq_64.c | 8
arch/x86/kernel/irqinit_32.c | 3
arch/x86/kernel/irqinit_64.c | 3
arch/x86/kernel/uv_irq.c | 27 +
drivers/char/random.c | 31 +
drivers/pci/htirq.c | 25 -
drivers/pci/intel-iommu.c | 23 -
drivers/pci/intr_remapping.c | 76 +++
drivers/pci/msi.c | 71 ++-
drivers/xen/events.c | 9
fs/proc/interrupts.c | 18
fs/proc/stat.c | 17
include/linux/dmar.h | 7
include/linux/htirq.h | 8
include/linux/interrupt.h | 2
include/linux/irq.h | 96 ++++
include/linux/irqnr.h | 15
include/linux/kernel_stat.h | 14
include/linux/msi.h | 10
init/main.c | 11
kernel/irq/autoprobe.c | 10
kernel/irq/chip.c | 39 -
kernel/irq/handle.c | 220 +++++++++-
kernel/irq/manage.c | 6
kernel/irq/migration.c | 34 +
kernel/irq/proc.c | 3
kernel/irq/spurious.c | 4
35 files changed, 1312 insertions(+), 385 deletions(-)
Index: linux-2.6/arch/x86/Kconfig
===================================================================
--- linux-2.6.orig/arch/x86/Kconfig
+++ linux-2.6/arch/x86/Kconfig
@@ -241,6 +241,16 @@ config X86_HAS_BOOT_CPU_ID
def_bool y
depends on X86_VOYAGER
+config SPARSE_IRQ
+ bool "Support sparse irq numbering"
+ depends on PCI_MSI || HT_IRQ
+ default y
+ help
+ This enables support for sparse irq, esp for msi/msi-x. You may need
+ if you have lots of cards supports msi-x installed.
+
+ If you don't know what to do here, say Y.
+
config X86_FIND_SMP_CONFIG
def_bool y
depends on X86_MPPARSE || X86_VOYAGER
Index: linux-2.6/arch/x86/kernel/io_apic.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/io_apic.c
+++ linux-2.6/arch/x86/kernel/io_apic.c
@@ -108,8 +108,33 @@ static int __init parse_noapic(char *str
early_param("noapic", parse_noapic);
struct irq_pin_list;
+
+/*
+ * This is performance-critical, we want to do it O(1)
+ *
+ * the indexing order of this array favors 1:1 mappings
+ * between pins and IRQs.
+ */
+
+struct irq_pin_list {
+ int apic, pin;
+ struct irq_pin_list *next;
+};
+
+static struct irq_pin_list *get_one_free_irq_2_pin(int cpu)
+{
+ struct irq_pin_list *pin;
+ int node;
+
+ node = cpu_to_node(cpu);
+
+ pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_2_pin on cpu %d node %d\n", cpu, node);
+
+ return pin;
+}
+
struct irq_cfg {
- unsigned int irq;
struct irq_pin_list *irq_2_pin;
cpumask_t domain;
cpumask_t old_domain;
@@ -119,81 +144,102 @@ struct irq_cfg {
};
/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_cfg irq_cfgx[] = {
+#else
static struct irq_cfg irq_cfgx[NR_IRQS] = {
- [0] = { .irq = 0, .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
- [1] = { .irq = 1, .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
- [2] = { .irq = 2, .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
- [3] = { .irq = 3, .domain = CPU_MASK_ALL, .vector = IRQ3_VECTOR, },
- [4] = { .irq = 4, .domain = CPU_MASK_ALL, .vector = IRQ4_VECTOR, },
- [5] = { .irq = 5, .domain = CPU_MASK_ALL, .vector = IRQ5_VECTOR, },
- [6] = { .irq = 6, .domain = CPU_MASK_ALL, .vector = IRQ6_VECTOR, },
- [7] = { .irq = 7, .domain = CPU_MASK_ALL, .vector = IRQ7_VECTOR, },
- [8] = { .irq = 8, .domain = CPU_MASK_ALL, .vector = IRQ8_VECTOR, },
- [9] = { .irq = 9, .domain = CPU_MASK_ALL, .vector = IRQ9_VECTOR, },
- [10] = { .irq = 10, .domain = CPU_MASK_ALL, .vector = IRQ10_VECTOR, },
- [11] = { .irq = 11, .domain = CPU_MASK_ALL, .vector = IRQ11_VECTOR, },
- [12] = { .irq = 12, .domain = CPU_MASK_ALL, .vector = IRQ12_VECTOR, },
- [13] = { .irq = 13, .domain = CPU_MASK_ALL, .vector = IRQ13_VECTOR, },
- [14] = { .irq = 14, .domain = CPU_MASK_ALL, .vector = IRQ14_VECTOR, },
- [15] = { .irq = 15, .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
+#endif
+ [0] = { .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
+ [1] = { .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
+ [2] = { .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
+ [3] = { .domain = CPU_MASK_ALL, .vector = IRQ3_VECTOR, },
+ [4] = { .domain = CPU_MASK_ALL, .vector = IRQ4_VECTOR, },
+ [5] = { .domain = CPU_MASK_ALL, .vector = IRQ5_VECTOR, },
+ [6] = { .domain = CPU_MASK_ALL, .vector = IRQ6_VECTOR, },
+ [7] = { .domain = CPU_MASK_ALL, .vector = IRQ7_VECTOR, },
+ [8] = { .domain = CPU_MASK_ALL, .vector = IRQ8_VECTOR, },
+ [9] = { .domain = CPU_MASK_ALL, .vector = IRQ9_VECTOR, },
+ [10] = { .domain = CPU_MASK_ALL, .vector = IRQ10_VECTOR, },
+ [11] = { .domain = CPU_MASK_ALL, .vector = IRQ11_VECTOR, },
+ [12] = { .domain = CPU_MASK_ALL, .vector = IRQ12_VECTOR, },
+ [13] = { .domain = CPU_MASK_ALL, .vector = IRQ13_VECTOR, },
+ [14] = { .domain = CPU_MASK_ALL, .vector = IRQ14_VECTOR, },
+ [15] = { .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
};
-#define for_each_irq_cfg(irq, cfg) \
- for (irq = 0, cfg = irq_cfgx; irq < nr_irqs; irq++, cfg++)
-
-static struct irq_cfg *irq_cfg(unsigned int irq)
+void __init arch_early_irq_init(void)
{
- return irq < nr_irqs ? irq_cfgx + irq : NULL;
+ struct irq_cfg *cfg;
+ struct irq_desc *desc;
+ int count;
+ int i;
+#ifdef CONFIG_SPARSE_IRQ
+ int count_desc = NR_IRQS_LEGACY;
+#else
+ int count_desc = NR_IRQS;
+#endif
+
+ cfg = irq_cfgx;
+ count = ARRAY_SIZE(irq_cfgx);
+
+ BUG_ON(count > count_desc);
+
+ for (i = 0; i < count; i++) {
+ desc = irq_to_desc(i);
+ desc->chip_data = &cfg[i];
+ }
}
-static struct irq_cfg *irq_cfg_alloc(unsigned int irq)
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_cfg *irq_cfg(unsigned int irq)
{
- return irq_cfg(irq);
+ struct irq_cfg *cfg = NULL;
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+ if (desc)
+ cfg = desc->chip_data;
+
+ return cfg;
}
-/*
- * Rough estimation of how many shared IRQs there are, can be changed
- * anytime.
- */
-#define MAX_PLUS_SHARED_IRQS NR_IRQS
-#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
+static struct irq_cfg *get_one_free_irq_cfg(int cpu)
+{
+ struct irq_cfg *cfg;
+ int node;
-/*
- * This is performance-critical, we want to do it O(1)
- *
- * the indexing order of this array favors 1:1 mappings
- * between pins and IRQs.
- */
+ node = cpu_to_node(cpu);
-struct irq_pin_list {
- int apic, pin;
- struct irq_pin_list *next;
-};
+ cfg = kzalloc_node(sizeof(*cfg), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_cfg on cpu %d node %d\n", cpu, node);
-static struct irq_pin_list irq_2_pin_head[PIN_MAP_SIZE];
-static struct irq_pin_list *irq_2_pin_ptr;
+ return cfg;
+}
-static void __init irq_2_pin_init(void)
+void arch_init_chip_data(struct irq_desc *desc, int cpu)
{
- struct irq_pin_list *pin = irq_2_pin_head;
- int i;
-
- for (i = 1; i < PIN_MAP_SIZE; i++)
- pin[i-1].next = &pin[i];
+ struct irq_cfg *cfg;
- irq_2_pin_ptr = &pin[0];
+ cfg = desc->chip_data;
+ if (!cfg) {
+ desc->chip_data = get_one_free_irq_cfg(cpu);
+ if (!desc->chip_data) {
+ printk(KERN_ERR "can not alloc irq_cfg\n");
+ BUG_ON(1);
+ }
+ }
}
-static struct irq_pin_list *get_one_free_irq_2_pin(void)
+#else
+static struct irq_cfg *irq_cfg(unsigned int irq)
{
- struct irq_pin_list *pin = irq_2_pin_ptr;
+ return irq < nr_irqs ? irq_cfgx + irq : NULL;
+}
- if (!pin)
- panic("can not get more irq_2_pin\n");
+#endif
- irq_2_pin_ptr = pin->next;
- pin->next = NULL;
- return pin;
+static inline void set_extra_move_desc(struct irq_desc *desc, cpumask_t mask)
+{
}
struct io_apic {
@@ -237,11 +283,10 @@ static inline void io_apic_modify(unsign
writel(value, &io_apic->data);
}
-static bool io_apic_level_ack_pending(unsigned int irq)
+static bool io_apic_level_ack_pending(struct irq_cfg *cfg)
{
struct irq_pin_list *entry;
unsigned long flags;
- struct irq_cfg *cfg = irq_cfg(irq);
spin_lock_irqsave(&ioapic_lock, flags);
entry = cfg->irq_2_pin;
@@ -323,13 +368,12 @@ static void ioapic_mask_entry(int apic,
}
#ifdef CONFIG_SMP
-static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, u8 vector)
+static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg)
{
int apic, pin;
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
+ u8 vector = cfg->vector;
- cfg = irq_cfg(irq);
entry = cfg->irq_2_pin;
for (;;) {
unsigned int reg;
@@ -359,24 +403,27 @@ static void __target_IO_APIC_irq(unsigne
}
}
-static int assign_irq_vector(int irq, cpumask_t mask);
+static int assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask);
-static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+static void set_ioapic_affinity_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
unsigned long flags;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- cfg = irq_cfg(irq);
- if (assign_irq_vector(irq, mask))
+ irq = desc->irq;
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
/*
@@ -384,12 +431,24 @@ static void set_ioapic_affinity_irq(unsi
*/
dest = SET_APIC_LOGICAL_ID(dest);
- desc = irq_to_desc(irq);
spin_lock_irqsave(&ioapic_lock, flags);
- __target_IO_APIC_irq(irq, dest, cfg->vector);
+ __target_IO_APIC_irq(irq, dest, cfg);
desc->affinity = mask;
spin_unlock_irqrestore(&ioapic_lock, flags);
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define set_ioapic_affinity_irq set_ioapic_affinity_irq_desc
+#else
+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ set_ioapic_affinity_irq_desc(desc, mask);
+}
+#endif
#endif /* CONFIG_SMP */
/*
@@ -397,16 +456,18 @@ static void set_ioapic_affinity_irq(unsi
* shared ISA-space IRQs, so we have to support them. We are super
* fast in the common case, and fast for shared ISA-space IRQs.
*/
-static void add_pin_to_irq(unsigned int irq, int apic, int pin)
+static void add_pin_to_irq_cpu(struct irq_cfg *cfg, int cpu, int apic, int pin)
{
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
- /* first time to refer irq_cfg, so with new */
- cfg = irq_cfg_alloc(irq);
entry = cfg->irq_2_pin;
if (!entry) {
- entry = get_one_free_irq_2_pin();
+ entry = get_one_free_irq_2_pin(cpu);
+ if (!entry) {
+ printk(KERN_ERR "can not alloc irq_2_pin to add %d - %d\n",
+ apic, pin);
+ return;
+ }
cfg->irq_2_pin = entry;
entry->apic = apic;
entry->pin = pin;
@@ -421,7 +482,7 @@ static void add_pin_to_irq(unsigned int
entry = entry->next;
}
- entry->next = get_one_free_irq_2_pin();
+ entry->next = get_one_free_irq_2_pin(cpu);
entry = entry->next;
entry->apic = apic;
entry->pin = pin;
@@ -430,11 +491,10 @@ static void add_pin_to_irq(unsigned int
/*
* Reroute an IRQ to a different pin.
*/
-static void __init replace_pin_at_irq(unsigned int irq,
+static void __init replace_pin_at_irq_cpu(struct irq_cfg *cfg, int cpu,
int oldapic, int oldpin,
int newapic, int newpin)
{
- struct irq_cfg *cfg = irq_cfg(irq);
struct irq_pin_list *entry = cfg->irq_2_pin;
int replaced = 0;
@@ -451,18 +511,16 @@ static void __init replace_pin_at_irq(un
/* why? call replace before add? */
if (!replaced)
- add_pin_to_irq(irq, newapic, newpin);
+ add_pin_to_irq_cpu(cfg, cpu, newapic, newpin);
}
-static inline void io_apic_modify_irq(unsigned int irq,
+static inline void io_apic_modify_irq(struct irq_cfg *cfg,
int mask_and, int mask_or,
void (*final)(struct irq_pin_list *entry))
{
int pin;
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
- cfg = irq_cfg(irq);
for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) {
unsigned int reg;
pin = entry->pin;
@@ -475,9 +533,9 @@ static inline void io_apic_modify_irq(un
}
}
-static void __unmask_IO_APIC_irq(unsigned int irq)
+static void __unmask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED, 0, NULL);
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED, 0, NULL);
}
#ifdef CONFIG_X86_64
@@ -492,47 +550,69 @@ void io_apic_sync(struct irq_pin_list *e
readl(&io_apic->data);
}
-static void __mask_IO_APIC_irq(unsigned int irq)
+static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
+ io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
}
#else /* CONFIG_X86_32 */
-static void __mask_IO_APIC_irq(unsigned int irq)
+static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, NULL);
+ io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, NULL);
}
-static void __mask_and_edge_IO_APIC_irq(unsigned int irq)
+static void __mask_and_edge_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_LEVEL_TRIGGER,
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_LEVEL_TRIGGER,
IO_APIC_REDIR_MASKED, NULL);
}
-static void __unmask_and_level_IO_APIC_irq(unsigned int irq)
+static void __unmask_and_level_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED,
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED,
IO_APIC_REDIR_LEVEL_TRIGGER, NULL);
}
#endif /* CONFIG_X86_32 */
-static void mask_IO_APIC_irq (unsigned int irq)
+static void mask_IO_APIC_irq_desc(struct irq_desc **descp)
{
+ struct irq_cfg *cfg = (*descp)->chip_data;
unsigned long flags;
+ BUG_ON(!cfg);
+
spin_lock_irqsave(&ioapic_lock, flags);
- __mask_IO_APIC_irq(irq);
+ __mask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
-static void unmask_IO_APIC_irq (unsigned int irq)
+static void unmask_IO_APIC_irq_desc(struct irq_desc **descp)
{
+ struct irq_cfg *cfg = (*descp)->chip_data;
unsigned long flags;
spin_lock_irqsave(&ioapic_lock, flags);
- __unmask_IO_APIC_irq(irq);
+ __unmask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
+#ifdef CONFIG_SPARSE_IRQ
+#define mask_IO_APIC_irq mask_IO_APIC_irq_desc
+#define unmask_IO_APIC_irq unmask_IO_APIC_irq_desc
+#else
+static void mask_IO_APIC_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_IO_APIC_irq_desc(&desc);
+}
+static void unmask_IO_APIC_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_IO_APIC_irq_desc(&desc);
+}
+#endif
+
static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
{
struct IO_APIC_route_entry entry;
@@ -809,7 +889,7 @@ EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector
*/
static int EISA_ELCR(unsigned int irq)
{
- if (irq < 16) {
+ if (irq < NR_IRQS_LEGACY) {
unsigned int port = 0x4d0 + (irq >> 3);
return (inb(port) >> (irq & 7)) & 1;
}
@@ -1034,7 +1114,7 @@ void unlock_vector_lock(void)
spin_unlock(&vector_lock);
}
-static int __assign_irq_vector(int irq, cpumask_t mask)
+static int __assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
{
/*
* NOTE! The local APIC isn't very good at handling
@@ -1050,16 +1130,13 @@ static int __assign_irq_vector(int irq,
static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
unsigned int old_vector;
int cpu;
- struct irq_cfg *cfg;
- cfg = irq_cfg(irq);
+ if ((cfg->move_in_progress) || cfg->move_cleanup_count)
+ return -EBUSY;
/* Only try and allocate irqs on cpus that are present */
cpus_and(mask, mask, cpu_online_map);
- if ((cfg->move_in_progress) || cfg->move_cleanup_count)
- return -EBUSY;
-
old_vector = cfg->vector;
if (old_vector) {
cpumask_t tmp;
@@ -1113,24 +1190,22 @@ next:
return -ENOSPC;
}
-static int assign_irq_vector(int irq, cpumask_t mask)
+static int assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
{
int err;
unsigned long flags;
spin_lock_irqsave(&vector_lock, flags);
- err = __assign_irq_vector(irq, mask);
+ err = __assign_irq_vector(irq, cfg, mask);
spin_unlock_irqrestore(&vector_lock, flags);
return err;
}
-static void __clear_irq_vector(int irq)
+static void __clear_irq_vector(int irq, struct irq_cfg *cfg)
{
- struct irq_cfg *cfg;
cpumask_t mask;
int cpu, vector;
- cfg = irq_cfg(irq);
BUG_ON(!cfg->vector);
vector = cfg->vector;
@@ -1162,14 +1237,16 @@ void __setup_vector_irq(int cpu)
/* This function must be called with vector_lock held */
int irq, vector;
struct irq_cfg *cfg;
+ struct irq_desc *desc;
/* Mark the inuse vectors */
- for_each_irq_cfg(irq, cfg) {
+ for_each_irq_desc(irq, desc) {
+ cfg = desc->chip_data;
if (!cpu_isset(cpu, cfg->domain))
continue;
vector = cfg->vector;
per_cpu(vector_irq, cpu)[vector] = irq;
- }
+ } end_for_each_irq_desc();
/* Mark the free vectors */
for (vector = 0; vector < NR_VECTORS; ++vector) {
irq = per_cpu(vector_irq, cpu)[vector];
@@ -1215,11 +1292,8 @@ static inline int IO_APIC_irq_trigger(in
}
#endif
-static void ioapic_register_intr(int irq, unsigned long trigger)
+static void ioapic_register_intr(int irq, struct irq_desc *desc, unsigned long trigger)
{
- struct irq_desc *desc;
-
- desc = irq_to_desc(irq);
if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
trigger == IOAPIC_LEVEL)
@@ -1311,7 +1385,7 @@ static int setup_ioapic_entry(int apic,
return 0;
}
-static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,
+static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_desc *desc,
int trigger, int polarity)
{
struct irq_cfg *cfg;
@@ -1321,10 +1395,10 @@ static void setup_IO_APIC_irq(int apic,
if (!IO_APIC_IRQ(irq))
return;
- cfg = irq_cfg(irq);
+ cfg = desc->chip_data;
mask = TARGET_CPUS;
- if (assign_irq_vector(irq, mask))
+ if (assign_irq_vector(irq, cfg, mask))
return;
cpus_and(mask, cfg->domain, mask);
@@ -1341,12 +1415,12 @@ static void setup_IO_APIC_irq(int apic,
cfg->vector)) {
printk("Failed to setup ioapic entry for ioapic %d, pin %d\n",
mp_ioapics[apic].mp_apicid, pin);
- __clear_irq_vector(irq);
+ __clear_irq_vector(irq, cfg);
return;
}
- ioapic_register_intr(irq, trigger);
- if (irq < 16)
+ ioapic_register_intr(irq, desc, trigger);
+ if (irq < NR_IRQS_LEGACY)
disable_8259A_irq(irq);
ioapic_write_entry(apic, pin, entry);
@@ -1356,6 +1430,9 @@ static void __init setup_IO_APIC_irqs(vo
{
int apic, pin, idx, irq;
int notcon = 0;
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+ int cpu = boot_cpu_id;
apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
@@ -1387,9 +1464,15 @@ static void __init setup_IO_APIC_irqs(vo
if (multi_timer_check(apic, irq))
continue;
#endif
- add_pin_to_irq(irq, apic, pin);
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", irq);
+ continue;
+ }
+ cfg = desc->chip_data;
+ add_pin_to_irq_cpu(cfg, cpu, apic, pin);
- setup_IO_APIC_irq(apic, pin, irq,
+ setup_IO_APIC_irq(apic, pin, irq, desc,
irq_trigger(idx), irq_polarity(idx));
}
}
@@ -1448,6 +1531,7 @@ __apicdebuginit(void) print_IO_APIC(void
union IO_APIC_reg_03 reg_03;
unsigned long flags;
struct irq_cfg *cfg;
+ struct irq_desc *desc;
unsigned int irq;
if (apic_verbosity == APIC_QUIET)
@@ -1537,8 +1621,10 @@ __apicdebuginit(void) print_IO_APIC(void
}
}
printk(KERN_DEBUG "IRQ to pin mappings:\n");
- for_each_irq_cfg(irq, cfg) {
- struct irq_pin_list *entry = cfg->irq_2_pin;
+ for_each_irq_desc(irq, desc) {
+ struct irq_pin_list *entry;
+ cfg = desc->chip_data;
+ entry = cfg->irq_2_pin;
if (!entry)
continue;
printk(KERN_DEBUG "IRQ%d ", irq);
@@ -1549,7 +1635,7 @@ __apicdebuginit(void) print_IO_APIC(void
entry = entry->next;
}
printk("\n");
- }
+ } end_for_each_irq_desc();
printk(KERN_INFO ".................................... done.\n");
@@ -2022,14 +2108,16 @@ static unsigned int startup_ioapic_irq(u
{
int was_pending = 0;
unsigned long flags;
+ struct irq_cfg *cfg;
spin_lock_irqsave(&ioapic_lock, flags);
- if (irq < 16) {
+ if (irq < NR_IRQS_LEGACY) {
disable_8259A_irq(irq);
if (i8259A_irq_pending(irq))
was_pending = 1;
}
- __unmask_IO_APIC_irq(irq);
+ cfg = irq_cfg(irq);
+ __unmask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
return was_pending;
@@ -2092,35 +2180,37 @@ static DECLARE_DELAYED_WORK(ir_migration
* as simple as edge triggered migration and we can do the irq migration
* with a simple atomic update to IO-APIC RTE.
*/
-static void migrate_ioapic_irq(int irq, cpumask_t mask)
+static void migrate_ioapic_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
- struct irq_desc *desc;
cpumask_t tmp, cleanup_mask;
struct irte irte;
int modify_ioapic_rte;
unsigned int dest;
unsigned long flags;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
+ irq = desc->irq;
if (get_irte(irq, &irte))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
- desc = irq_to_desc(irq);
modify_ioapic_rte = desc->status & IRQ_LEVEL;
if (modify_ioapic_rte) {
spin_lock_irqsave(&ioapic_lock, flags);
- __target_IO_APIC_irq(irq, dest, cfg->vector);
+ __target_IO_APIC_irq(irq, dest, cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
@@ -2142,14 +2232,14 @@ static void migrate_ioapic_irq(int irq,
desc->affinity = mask;
}
-static int migrate_irq_remapped_level(int irq)
+static int migrate_irq_remapped_level_desc(struct irq_desc *desc)
{
int ret = -1;
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_cfg *cfg = desc->chip_data;
- mask_IO_APIC_irq(irq);
+ mask_IO_APIC_irq_desc(&desc);
- if (io_apic_level_ack_pending(irq)) {
+ if (io_apic_level_ack_pending(cfg)) {
/*
* Interrupt in progress. Migrating irq now will change the
* vector information in the IO-APIC RTE and that will confuse
@@ -2161,14 +2251,15 @@ static int migrate_irq_remapped_level(in
}
/* everthing is clear. we have right of way */
- migrate_ioapic_irq(irq, desc->pending_mask);
+ migrate_ioapic_irq_desc(desc, desc->pending_mask);
ret = 0;
desc->status &= ~IRQ_MOVE_PENDING;
cpus_clear(desc->pending_mask);
unmask:
- unmask_IO_APIC_irq(irq);
+ unmask_IO_APIC_irq_desc(&desc);
+
return ret;
}
@@ -2189,28 +2280,36 @@ static void ir_irq_migration(struct work
continue;
}
- desc->chip->set_affinity(irq, desc->pending_mask);
+ desc_chip_set_affinity(irq, desc, desc->pending_mask);
spin_unlock_irqrestore(&desc->lock, flags);
}
- }
+ } end_for_each_irq_desc();
}
/*
* Migrates the IRQ destination in the process context.
*/
-static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+static void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
- struct irq_desc *desc = irq_to_desc(irq);
-
if (desc->status & IRQ_LEVEL) {
desc->status |= IRQ_MOVE_PENDING;
desc->pending_mask = mask;
- migrate_irq_remapped_level(irq);
+ migrate_irq_remapped_level_desc(desc);
return;
}
- migrate_ioapic_irq(irq, mask);
+ migrate_ioapic_irq_desc(desc, mask);
}
+#ifdef CONFIG_SPARSE_IRQ
+#define set_ir_ioapic_affinity_irq set_ir_ioapic_affinity_irq_desc
+#else
+static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ set_ir_ioapic_affinity_irq_desc(desc, mask);
+}
+#endif
#endif
asmlinkage void smp_irq_move_cleanup_interrupt(void)
@@ -2229,6 +2328,9 @@ asmlinkage void smp_irq_move_cleanup_int
struct irq_cfg *cfg;
irq = __get_cpu_var(vector_irq)[vector];
+ if (irq == -1)
+ continue;
+
desc = irq_to_desc(irq);
if (!desc)
continue;
@@ -2250,9 +2352,10 @@ unlock:
irq_exit();
}
-static void irq_complete_move(unsigned int irq)
+static void irq_complete_move(struct irq_desc **descp)
{
- struct irq_cfg *cfg = irq_cfg(irq);
+ struct irq_desc *desc = *descp;
+ struct irq_cfg *cfg = desc->chip_data;
unsigned vector, me;
if (likely(!cfg->move_in_progress))
@@ -2270,9 +2373,24 @@ static void irq_complete_move(unsigned i
}
}
#else
-static inline void irq_complete_move(unsigned int irq) {}
+static inline void irq_complete_move(struct irq_desc **descp) {}
#endif
+
#ifdef CONFIG_INTR_REMAP
+#ifdef CONFIG_SPARSE_IRQ
+static void ack_x2apic_level_desc(struct irq_desc **descp)
+{
+ ack_x2APIC_irq();
+}
+
+static void ack_x2apic_edge_desc(struct irq_desc **descp)
+{
+ ack_x2APIC_irq();
+}
+
+#define ack_x2apic_level ack_x2apic_level_desc
+#define ack_x2apic_edge ack_x2apic_edge_desc
+#else
static void ack_x2apic_level(unsigned int irq)
{
ack_x2APIC_irq();
@@ -2284,29 +2402,34 @@ static void ack_x2apic_edge(unsigned int
}
#endif
-static void ack_apic_edge(unsigned int irq)
+#endif
+
+static void ack_apic_edge_desc(struct irq_desc **descp)
{
- irq_complete_move(irq);
- move_native_irq(irq);
+ irq_complete_move(descp);
+#ifdef CONFIG_SMP
+ move_native_irq_desc(descp);
+#endif
ack_APIC_irq();
}
atomic_t irq_mis_count;
-static void ack_apic_level(unsigned int irq)
+static void ack_apic_level_desc(struct irq_desc **descp)
{
#ifdef CONFIG_X86_32
unsigned long v;
int i;
#endif
+ struct irq_cfg *cfg;
int do_unmask_irq = 0;
- irq_complete_move(irq);
+ irq_complete_move(descp);
#ifdef CONFIG_GENERIC_PENDING_IRQ
/* If we are moving the irq we need to mask it */
- if (unlikely(irq_to_desc(irq)->status & IRQ_MOVE_PENDING)) {
+ if (unlikely((*descp)->status & IRQ_MOVE_PENDING)) {
do_unmask_irq = 1;
- mask_IO_APIC_irq(irq);
+ mask_IO_APIC_irq_desc(descp);
}
#endif
@@ -2330,7 +2453,8 @@ static void ack_apic_level(unsigned int
* operation to prevent an edge-triggered interrupt escaping meanwhile.
* The idea is from Manfred Spraul. --macro
*/
- i = irq_cfg(irq)->vector;
+ cfg = (*descp)->chip_data;
+ i = cfg->vector;
v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
#endif
@@ -2369,22 +2493,44 @@ static void ack_apic_level(unsigned int
* accurate and is causing problems then it is a hardware bug
* and you can go talk to the chipset vendor about it.
*/
- if (!io_apic_level_ack_pending(irq))
- move_masked_irq(irq);
- unmask_IO_APIC_irq(irq);
+ cfg = (*descp)->chip_data;
+ if (!io_apic_level_ack_pending(cfg)) {
+# ifdef CONFIG_SMP
+ move_masked_irq_desc(descp);
+# endif
+ }
+ unmask_IO_APIC_irq_desc(descp);
}
#ifdef CONFIG_X86_32
if (!(v & (1 << (i & 0x1f)))) {
atomic_inc(&irq_mis_count);
spin_lock(&ioapic_lock);
- __mask_and_edge_IO_APIC_irq(irq);
- __unmask_and_level_IO_APIC_irq(irq);
+ __mask_and_edge_IO_APIC_irq(cfg);
+ __unmask_and_level_IO_APIC_irq(cfg);
spin_unlock(&ioapic_lock);
}
#endif
}
+#ifdef CONFIG_SPARSE_IRQ
+#define ack_apic_edge ack_apic_edge_desc
+#define ack_apic_level ack_apic_level_desc
+#else
+static void ack_apic_edge(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ ack_apic_edge_desc(&desc);
+}
+static void ack_apic_level(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ ack_apic_level_desc(&desc);
+}
+#endif
+
static struct irq_chip ioapic_chip __read_mostly = {
.name = "IO-APIC",
.startup = startup_ioapic_irq,
@@ -2430,29 +2576,28 @@ static inline void init_IO_APIC_traps(vo
* Also, we've got to be careful not to trash gate
* 0x80, because int 0x80 is hm, kind of importantish. ;)
*/
- for_each_irq_cfg(irq, cfg) {
- if (IO_APIC_IRQ(irq) && !cfg->vector) {
+ for_each_irq_desc(irq, desc) {
+ cfg = desc->chip_data;
+ if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) {
/*
* Hmm.. We don't have an entry for this,
* so default to an old-fashioned 8259
* interrupt if we can..
*/
- if (irq < 16)
+ if (irq < NR_IRQS_LEGACY)
make_8259A_irq(irq);
- else {
- desc = irq_to_desc(irq);
+ else
/* Strange. Oh, well.. */
desc->chip = &no_irq_chip;
- }
}
- }
+ } end_for_each_irq_desc();
}
/*
* The local APIC irq-chip implementation:
*/
-static void mask_lapic_irq(unsigned int irq)
+static void mask_lapic_irq_desc(struct irq_desc **descp)
{
unsigned long v;
@@ -2460,7 +2605,7 @@ static void mask_lapic_irq(unsigned int
apic_write(APIC_LVT0, v | APIC_LVT_MASKED);
}
-static void unmask_lapic_irq(unsigned int irq)
+static void unmask_lapic_irq_desc(struct irq_desc **descp)
{
unsigned long v;
@@ -2468,11 +2613,36 @@ static void unmask_lapic_irq(unsigned in
apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED);
}
-static void ack_lapic_irq (unsigned int irq)
+static void ack_lapic_irq_desc(struct irq_desc **descp)
{
ack_APIC_irq();
}
+#ifdef CONFIG_SPARSE_IRQ
+#define mask_lapic_irq mask_lapic_irq_desc
+#define unmask_lapic_irq unmask_lapic_irq_desc
+#define ack_lapic_irq ack_lapic_irq_desc
+#else
+static void mask_lapic_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_lapic_irq_desc(&desc);
+}
+static void unmask_lapic_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_lapic_irq_desc(&desc);
+}
+static void ack_lapic_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ ack_lapic_irq_desc(&desc);
+}
+#endif
+
static struct irq_chip lapic_chip __read_mostly = {
.name = "local-APIC",
.mask = mask_lapic_irq,
@@ -2480,11 +2650,8 @@ static struct irq_chip lapic_chip __read
.ack = ack_lapic_irq,
};
-static void lapic_register_intr(int irq)
+static void lapic_register_intr(int irq, struct irq_desc *desc)
{
- struct irq_desc *desc;
-
- desc = irq_to_desc(irq);
desc->status &= ~IRQ_LEVEL;
set_irq_chip_and_handler_name(irq, &lapic_chip, handle_edge_irq,
"edge");
@@ -2588,7 +2755,9 @@ int timer_through_8259 __initdata;
*/
static inline void __init check_timer(void)
{
- struct irq_cfg *cfg = irq_cfg(0);
+ struct irq_desc *desc = irq_to_desc(0);
+ struct irq_cfg *cfg = desc->chip_data;
+ int cpu = boot_cpu_id;
int apic1, pin1, apic2, pin2;
unsigned long flags;
unsigned int ver;
@@ -2603,7 +2772,7 @@ static inline void __init check_timer(vo
* get/set the timer IRQ vector:
*/
disable_8259A_irq(0);
- assign_irq_vector(0, TARGET_CPUS);
+ assign_irq_vector(0, cfg, TARGET_CPUS);
/*
* As IRQ0 is to be enabled in the 8259A, the virtual
@@ -2654,10 +2823,10 @@ static inline void __init check_timer(vo
* Ok, does IRQ0 through the IOAPIC work?
*/
if (no_pin1) {
- add_pin_to_irq(0, apic1, pin1);
+ add_pin_to_irq_cpu(cfg, cpu, apic1, pin1);
setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
}
- unmask_IO_APIC_irq(0);
+ unmask_IO_APIC_irq_desc(&desc);
if (timer_irq_works()) {
if (nmi_watchdog == NMI_IO_APIC) {
setup_nmi();
@@ -2683,9 +2852,9 @@ static inline void __init check_timer(vo
/*
* legacy devices should be connected to IO APIC #0
*/
- replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
+ replace_pin_at_irq_cpu(cfg, cpu, apic1, pin1, apic2, pin2);
setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
- unmask_IO_APIC_irq(0);
+ unmask_IO_APIC_irq_desc(&desc);
enable_8259A_irq(0);
if (timer_irq_works()) {
apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
@@ -2717,7 +2886,7 @@ static inline void __init check_timer(vo
apic_printk(APIC_QUIET, KERN_INFO
"...trying to set up timer as Virtual Wire IRQ...\n");
- lapic_register_intr(0);
+ lapic_register_intr(0, desc);
apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */
enable_8259A_irq(0);
@@ -2902,22 +3071,31 @@ unsigned int create_irq_nr(unsigned int
unsigned int irq;
unsigned int new;
unsigned long flags;
- struct irq_cfg *cfg_new;
-
- irq_want = nr_irqs - 1;
+ struct irq_cfg *cfg_new = NULL;
+ int cpu = boot_cpu_id;
+ struct irq_desc *desc_new = NULL;
irq = 0;
spin_lock_irqsave(&vector_lock, flags);
- for (new = irq_want; new > 0; new--) {
+#ifdef CONFIG_SPARSE_IRQ
+ for (new = irq_want; new < NR_IRQS; new++)
+#else
+ for (new = irq_want; new > 0; new--)
+#endif
+ {
if (platform_legacy_irq(new))
continue;
- cfg_new = irq_cfg(new);
- if (cfg_new && cfg_new->vector != 0)
+
+ desc_new = irq_to_desc_alloc_cpu(new, cpu);
+ if (!desc_new) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", new);
continue;
- /* check if need to create one */
- if (!cfg_new)
- cfg_new = irq_cfg_alloc(new);
- if (__assign_irq_vector(new, TARGET_CPUS) == 0)
+ }
+ cfg_new = desc_new->chip_data;
+
+ if (cfg_new->vector != 0)
+ continue;
+ if (__assign_irq_vector(new, cfg_new, TARGET_CPUS) == 0)
irq = new;
break;
}
@@ -2925,15 +3103,25 @@ unsigned int create_irq_nr(unsigned int
if (irq > 0) {
dynamic_irq_init(irq);
+ /* restore it, in case dynamic_irq_init clear it */
+ if (desc_new)
+ desc_new->chip_data = cfg_new;
}
return irq;
}
int create_irq(void)
{
+ unsigned int irq_want;
int irq;
- irq = create_irq_nr(nr_irqs - 1);
+#ifdef CONFIG_SPARSE_IRQ
+ irq_want = nr_irqs;
+#else
+ irq_want = NR_IRQS - 1;
+#endif
+
+ irq = create_irq_nr(irq_want);
if (irq == 0)
irq = -1;
@@ -2944,14 +3132,22 @@ int create_irq(void)
void destroy_irq(unsigned int irq)
{
unsigned long flags;
+ struct irq_cfg *cfg;
+ struct irq_desc *desc;
+ /* store it, in case dynamic_irq_cleanup clear it */
+ desc = irq_to_desc(irq);
+ cfg = desc->chip_data;
dynamic_irq_cleanup(irq);
+ /* connect back irq_cfg */
+ if (desc)
+ desc->chip_data = cfg;
#ifdef CONFIG_INTR_REMAP
free_irte(irq);
#endif
spin_lock_irqsave(&vector_lock, flags);
- __clear_irq_vector(irq);
+ __clear_irq_vector(irq, cfg);
spin_unlock_irqrestore(&vector_lock, flags);
}
@@ -2966,12 +3162,12 @@ static int msi_compose_msg(struct pci_de
unsigned dest;
cpumask_t tmp;
+ cfg = irq_cfg(irq);
tmp = TARGET_CPUS;
- err = assign_irq_vector(irq, tmp);
+ err = assign_irq_vector(irq, cfg, tmp);
if (err)
return err;
- cfg = irq_cfg(irq);
cpus_and(tmp, cfg->domain, tmp);
dest = cpu_mask_to_apicid(tmp);
@@ -3027,61 +3223,75 @@ static int msi_compose_msg(struct pci_de
}
#ifdef CONFIG_SMP
-static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
+static void set_msi_irq_affinity_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq = desc->irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
- read_msi_msg(irq, &msg);
+ read_msi_msg_desc(desc, &msg);
msg.data &= ~MSI_DATA_VECTOR_MASK;
msg.data |= MSI_DATA_VECTOR(cfg->vector);
msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
- write_msi_msg(irq, &msg);
- desc = irq_to_desc(irq);
+ write_msi_msg_desc(desc, &msg);
desc->affinity = mask;
}
+#ifdef CONFIG_SPARSE_IRQ
+#define set_msi_irq_affinity set_msi_irq_affinity_desc
+#else
+static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ set_msi_irq_affinity_desc(desc, mask);
+}
+#endif
#ifdef CONFIG_INTR_REMAP
/*
* Migrate the MSI irq to another cpumask. This migration is
* done in the process context using interrupt-remapping hardware.
*/
-static void ir_set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
+static void ir_set_msi_irq_affinity_desc(struct irq_desc *desc,
+ cpumask_t mask)
{
struct irq_cfg *cfg;
unsigned int dest;
cpumask_t tmp, cleanup_mask;
struct irte irte;
- struct irq_desc *desc;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
+ irq = desc->irq;
if (get_irte(irq, &irte))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3105,9 +3315,20 @@ static void ir_set_msi_irq_affinity(unsi
cfg->move_in_progress = 0;
}
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define ir_set_msi_irq_affinity ir_set_msi_irq_affinity_desc
+#else
+static void ir_set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ ir_set_msi_irq_affinity_desc(desc, mask);
+}
+#endif
+
#endif
#endif /* CONFIG_SMP */
@@ -3166,7 +3387,7 @@ static int msi_alloc_irte(struct pci_dev
}
#endif
-static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc, int irq)
+static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
{
int ret;
struct msi_msg msg;
@@ -3175,7 +3396,7 @@ static int setup_msi_irq(struct pci_dev
if (ret < 0)
return ret;
- set_irq_msi(irq, desc);
+ set_irq_msi(irq, msidesc);
write_msi_msg(irq, &msg);
#ifdef CONFIG_INTR_REMAP
@@ -3195,25 +3416,17 @@ static int setup_msi_irq(struct pci_dev
return 0;
}
-static unsigned int build_irq_for_pci_dev(struct pci_dev *dev)
-{
- unsigned int irq;
-
- irq = dev->bus->number;
- irq <<= 8;
- irq |= dev->devfn;
- irq <<= 12;
-
- return irq;
-}
-
-int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
+int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc)
{
unsigned int irq;
int ret;
unsigned int irq_want;
- irq_want = build_irq_for_pci_dev(dev) + 0x100;
+#ifdef CONFIG_SPARSE_IRQ
+ irq_want = nr_irqs;
+#else
+ irq_want = NR_IRQS - 1;
+#endif
irq = create_irq_nr(irq_want);
if (irq == 0)
@@ -3228,7 +3441,7 @@ int arch_setup_msi_irq(struct pci_dev *d
goto error;
no_ir:
#endif
- ret = setup_msi_irq(dev, desc, irq);
+ ret = setup_msi_irq(dev, msidesc, irq);
if (ret < 0) {
destroy_irq(irq);
return ret;
@@ -3246,7 +3459,7 @@ int arch_setup_msi_irqs(struct pci_dev *
{
unsigned int irq;
int ret, sub_handle;
- struct msi_desc *desc;
+ struct msi_desc *msidesc;
unsigned int irq_want;
#ifdef CONFIG_INTR_REMAP
@@ -3254,10 +3467,19 @@ int arch_setup_msi_irqs(struct pci_dev *
int index = 0;
#endif
- irq_want = build_irq_for_pci_dev(dev) + 0x100;
+#ifdef CONFIG_SPARSE_IRQ
+ irq_want = nr_irqs;
+#else
+ irq_want = NR_IRQS - 1;
+#endif
sub_handle = 0;
- list_for_each_entry(desc, &dev->msi_list, list) {
- irq = create_irq_nr(irq_want--);
+ list_for_each_entry(msidesc, &dev->msi_list, list) {
+ irq = create_irq_nr(irq_want);
+#ifdef CONFIG_SPARSE_IRQ
+ irq_want++;
+#else
+ irq_want--;
+#endif
if (irq == 0)
return -1;
#ifdef CONFIG_INTR_REMAP
@@ -3289,7 +3511,7 @@ int arch_setup_msi_irqs(struct pci_dev *
}
no_ir:
#endif
- ret = setup_msi_irq(dev, desc, irq);
+ ret = setup_msi_irq(dev, msidesc, irq);
if (ret < 0)
goto error;
sub_handle++;
@@ -3308,22 +3530,25 @@ void arch_teardown_msi_irq(unsigned int
#ifdef CONFIG_DMAR
#ifdef CONFIG_SMP
-static void dmar_msi_set_affinity(unsigned int irq, cpumask_t mask)
+static void dmar_msi_set_affinity_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ irq = desc->irq;
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3335,9 +3560,20 @@ static void dmar_msi_set_affinity(unsign
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
dmar_msi_write(irq, &msg);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define dmar_msi_set_affinity dmar_msi_set_affinity_desc
+#else
+static void dmar_msi_set_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ dmar_msi_set_affinity_desc(desc, mask);
+}
+#endif
+
#endif /* CONFIG_SMP */
struct irq_chip dmar_msi_type = {
@@ -3369,22 +3605,25 @@ int arch_setup_dmar_msi(unsigned int irq
#ifdef CONFIG_HPET_TIMER
#ifdef CONFIG_SMP
-static void hpet_msi_set_affinity(unsigned int irq, cpumask_t mask)
+static void hpet_msi_set_affinity_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
- struct irq_desc *desc;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ irq = desc->irq;
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3396,9 +3635,19 @@ static void hpet_msi_set_affinity(unsign
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
hpet_msi_write(irq, &msg);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define hpet_msi_set_affinity hpet_msi_set_affinity_desc
+#else
+static void hpet_msi_set_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ hpet_msi_set_affinity_desc(desc, mask);
+}
+#endif
#endif /* CONFIG_SMP */
struct irq_chip hpet_msi_type = {
@@ -3451,28 +3700,40 @@ static void target_ht_irq(unsigned int i
write_ht_irq_msg(irq, &msg);
}
-static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask)
+static void set_ht_irq_affinity_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq = desc->irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
target_ht_irq(irq, dest, cfg->vector);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define set_ht_irq_affinity set_ht_irq_affinity_desc
+#else
+static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ set_ht_irq_affinity_desc(desc, mask);
+}
+#endif
#endif
static struct irq_chip ht_irq_chip = {
@@ -3492,13 +3753,13 @@ int arch_setup_ht_irq(unsigned int irq,
int err;
cpumask_t tmp;
+ cfg = irq_cfg(irq);
tmp = TARGET_CPUS;
- err = assign_irq_vector(irq, tmp);
+ err = assign_irq_vector(irq, cfg, tmp);
if (!err) {
struct ht_irq_msg msg;
unsigned dest;
- cfg = irq_cfg(irq);
cpus_and(tmp, cfg->domain, tmp);
dest = cpu_mask_to_apicid(tmp);
@@ -3544,7 +3805,9 @@ int arch_enable_uv_irq(char *irq_name, u
unsigned long flags;
int err;
- err = assign_irq_vector(irq, *eligible_cpu);
+ cfg = irq_cfg(irq);
+
+ err = assign_irq_vector(irq, cfg, *eligible_cpu);
if (err != 0)
return err;
@@ -3553,8 +3816,6 @@ int arch_enable_uv_irq(char *irq_name, u
irq_name);
spin_unlock_irqrestore(&vector_lock, flags);
- cfg = irq_cfg(irq);
-
mmr_value = 0;
entry = (struct uv_IO_APIC_route_entry *)&mmr_value;
BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
@@ -3608,7 +3869,21 @@ int __init io_apic_get_redir_entries (in
int __init probe_nr_irqs(void)
{
+#if defined(CONFIG_SPARSE_IRQ)
+ int idx;
+ int nr = 0;
+ int nr_min = NR_IRQS_LEGACY;
+
+ for (idx = 0; idx < nr_ioapics; idx++)
+ nr += io_apic_get_redir_entries(idx) + 1;
+
+ if (nr < nr_min)
+ nr = nr_min;
+
+ return nr;
+#else
return NR_IRQS;
+#endif
}
/* --------------------------------------------------------------------------
@@ -3707,19 +3982,31 @@ int __init io_apic_get_version(int ioapi
int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int polarity)
{
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+ int cpu = boot_cpu_id;
+
if (!IO_APIC_IRQ(irq)) {
apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
ioapic);
return -EINVAL;
}
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc %d\n", irq);
+ return 0;
+ }
+
/*
* IRQs < 16 are already in the irq_2_pin[] map
*/
- if (irq >= 16)
- add_pin_to_irq(irq, ioapic, pin);
+ if (irq >= NR_IRQS_LEGACY) {
+ cfg = desc->chip_data;
+ add_pin_to_irq_cpu(cfg, cpu, ioapic, pin);
+ }
- setup_IO_APIC_irq(ioapic, pin, irq, triggering, polarity);
+ setup_IO_APIC_irq(ioapic, pin, irq, desc, triggering, polarity);
return 0;
}
@@ -3773,9 +4060,10 @@ void __init setup_ioapic_dest(void)
* when you have too many devices, because at that time only boot
* cpu is online.
*/
- cfg = irq_cfg(irq);
+ desc = irq_to_desc(irq);
+ cfg = desc->chip_data;
if (!cfg->vector) {
- setup_IO_APIC_irq(ioapic, pin, irq,
+ setup_IO_APIC_irq(ioapic, pin, irq, desc,
irq_trigger(irq_entry),
irq_polarity(irq_entry));
continue;
@@ -3785,7 +4073,6 @@ void __init setup_ioapic_dest(void)
/*
* Honour affinities which have been set in early boot
*/
- desc = irq_to_desc(irq);
if (desc->status &
(IRQ_NO_BALANCING | IRQ_AFFINITY_SET))
mask = desc->affinity;
@@ -3794,10 +4081,10 @@ void __init setup_ioapic_dest(void)
#ifdef CONFIG_INTR_REMAP
if (intr_remapping_enabled)
- set_ir_ioapic_affinity_irq(irq, mask);
+ set_ir_ioapic_affinity_irq_desc(desc, mask);
else
#endif
- set_ioapic_affinity_irq(irq, mask);
+ set_ioapic_affinity_irq_desc(desc, mask);
}
}
@@ -3846,7 +4133,6 @@ void __init ioapic_init_mappings(void)
struct resource *ioapic_res;
int i;
- irq_2_pin_init();
ioapic_res = ioapic_setup_resources();
for (i = 0; i < nr_ioapics; i++) {
if (smp_found_config) {
Index: linux-2.6/arch/x86/kernel/irqinit_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irqinit_32.c
+++ linux-2.6/arch/x86/kernel/irqinit_32.c
@@ -68,8 +68,7 @@ void __init init_ISA_irqs (void)
/*
* 16 old-style INTA-cycle interrupts:
*/
- for (i = 0; i < 16; i++) {
- /* first time call this irq_desc */
+ for (i = 0; i < NR_IRQS_LEGACY; i++) {
struct irq_desc *desc = irq_to_desc(i);
desc->status = IRQ_DISABLED;
Index: linux-2.6/arch/x86/kernel/irqinit_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irqinit_64.c
+++ linux-2.6/arch/x86/kernel/irqinit_64.c
@@ -76,8 +76,7 @@ void __init init_ISA_irqs(void)
init_bsp_APIC();
init_8259A(0);
- for (i = 0; i < 16; i++) {
- /* first time call this irq_desc */
+ for (i = 0; i < NR_IRQS_LEGACY; i++) {
struct irq_desc *desc = irq_to_desc(i);
desc->status = IRQ_DISABLED;
Index: linux-2.6/drivers/char/random.c
===================================================================
--- linux-2.6.orig/drivers/char/random.c
+++ linux-2.6/drivers/char/random.c
@@ -558,6 +558,8 @@ struct timer_rand_state {
unsigned dont_count_entropy:1;
};
+#ifndef CONFIG_SPARSE_IRQ
+
static struct timer_rand_state *irq_timer_state[NR_IRQS];
static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
@@ -576,6 +578,33 @@ static void set_timer_rand_state(unsigne
irq_timer_state[irq] = state;
}
+#else
+
+static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (!desc)
+ return NULL;
+
+ return desc->timer_rand_state;
+}
+
+static void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (!desc)
+ return;
+
+ desc->timer_rand_state = state;
+}
+#endif
+
static struct timer_rand_state input_timer_state;
/*
@@ -933,8 +962,10 @@ void rand_initialize_irq(int irq)
{
struct timer_rand_state *state;
+#ifndef CONFIG_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
state = get_timer_rand_state(irq);
Index: linux-2.6/drivers/pci/htirq.c
===================================================================
--- linux-2.6.orig/drivers/pci/htirq.c
+++ linux-2.6/drivers/pci/htirq.c
@@ -58,30 +58,47 @@ void fetch_ht_irq_msg(unsigned int irq,
*msg = cfg->msg;
}
-void mask_ht_irq(unsigned int irq)
+void mask_ht_irq_desc(struct irq_desc **descp)
{
struct ht_irq_cfg *cfg;
struct ht_irq_msg msg;
+ unsigned int irq = (*descp)->irq;
- cfg = get_irq_data(irq);
+ cfg = get_irq_desc_data(*descp);
msg = cfg->msg;
msg.address_lo |= 1;
write_ht_irq_msg(irq, &msg);
}
-void unmask_ht_irq(unsigned int irq)
+void unmask_ht_irq_desc(struct irq_desc **descp)
{
struct ht_irq_cfg *cfg;
struct ht_irq_msg msg;
+ unsigned int irq = (*descp)->irq;
- cfg = get_irq_data(irq);
+ cfg = get_irq_desc_data(*descp);
msg = cfg->msg;
msg.address_lo &= ~1;
write_ht_irq_msg(irq, &msg);
}
+#ifndef CONFIG_SPARSE_IRQ
+void mask_ht_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_ht_irq_desc(&desc);
+}
+void unmask_ht_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_ht_irq_desc(&desc);
+}
+#endif
+
/**
* __ht_create_irq - create an irq and attach it to a device.
* @dev: The hypertransport device to find the irq capability on.
Index: linux-2.6/drivers/pci/intr_remapping.c
===================================================================
--- linux-2.6.orig/drivers/pci/intr_remapping.c
+++ linux-2.6/drivers/pci/intr_remapping.c
@@ -19,17 +19,75 @@ struct irq_2_iommu {
u8 irte_mask;
};
-static struct irq_2_iommu irq_2_iommuX[NR_IRQS];
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_2_iommu *get_one_free_irq_2_iommu(int cpu)
+{
+ struct irq_2_iommu *iommu;
+ int node;
+
+ node = cpu_to_node(cpu);
+
+ iommu = kzalloc_node(sizeof(*iommu), GFP_ATOMIC, node);
+ printk(KERN_DEBUG "alloc irq_2_iommu on cpu %d node %d\n", cpu, node);
+
+ return iommu;
+}
static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
{
- return (irq < nr_irqs) ? irq_2_iommuX + irq : NULL;
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (WARN_ON_ONCE(!desc))
+ return NULL;
+
+ return desc->irq_2_iommu;
+}
+
+static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc;
+ struct irq_2_iommu *irq_iommu;
+
+ /*
+ * alloc irq desc if not allocated already.
+ */
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", irq);
+ return NULL;
+ }
+
+ irq_iommu = desc->irq_2_iommu;
+
+ if (!irq_iommu)
+ desc->irq_2_iommu = get_one_free_irq_2_iommu(cpu);
+
+ return desc->irq_2_iommu;
+}
+
+static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
+{
+ return irq_2_iommu_alloc_cpu(irq, boot_cpu_id);
}
+#else /* !CONFIG_SPARSE_IRQ */
+
+static struct irq_2_iommu irq_2_iommuX[NR_IRQS];
+
+static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
+{
+ if (irq < nr_irqs)
+ return &irq_2_iommuX[irq];
+
+ return NULL;
+}
static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
{
return irq_2_iommu(irq);
}
+#endif
static DEFINE_SPINLOCK(irq_2_ir_lock);
@@ -86,9 +144,11 @@ int alloc_irte(struct intel_iommu *iommu
if (!count)
return -1;
+#ifndef CONFIG_SPARSE_IRQ
/* protect irq_2_iommu_alloc later */
if (irq >= nr_irqs)
return -1;
+#endif
/*
* start the IRTE search from index 0.
@@ -130,6 +190,12 @@ int alloc_irte(struct intel_iommu *iommu
table->base[i].present = 1;
irq_iommu = irq_2_iommu_alloc(irq);
+ if (!irq_iommu) {
+ spin_unlock(&irq_2_ir_lock);
+ printk(KERN_ERR "can't allocate irq_2_iommu\n");
+ return -1;
+ }
+
irq_iommu->iommu = iommu;
irq_iommu->irte_index = index;
irq_iommu->sub_handle = 0;
@@ -177,6 +243,12 @@ int set_irte_irq(int irq, struct intel_i
irq_iommu = irq_2_iommu_alloc(irq);
+ if (!irq_iommu) {
+ spin_unlock(&irq_2_ir_lock);
+ printk(KERN_ERR "can't allocate irq_2_iommu\n");
+ return -1;
+ }
+
irq_iommu->iommu = iommu;
irq_iommu->irte_index = index;
irq_iommu->sub_handle = subhandle;
Index: linux-2.6/drivers/xen/events.c
===================================================================
--- linux-2.6.orig/drivers/xen/events.c
+++ linux-2.6/drivers/xen/events.c
@@ -141,8 +141,9 @@ static void init_evtchn_cpu_bindings(voi
int i;
/* By default all event channels notify CPU#0. */
- for_each_irq_desc(i, desc)
+ for_each_irq_desc(i, desc) {
desc->affinity = cpumask_of_cpu(0);
+ } end_for_each_irq_desc();
#endif
memset(cpu_evtchn, 0, sizeof(cpu_evtchn));
@@ -231,7 +232,7 @@ static int find_unbound_irq(void)
int irq;
/* Only allocate from dynirq range */
- for_each_irq_nr(irq)
+ for (irq = 0; irq < nr_irqs; irq++)
if (irq_bindcount[irq] == 0)
break;
@@ -792,7 +793,7 @@ void xen_irq_resume(void)
mask_evtchn(evtchn);
/* No IRQ <-> event-channel mappings. */
- for_each_irq_nr(irq)
+ for (irq = 0; irq < nr_irqs; irq++)
irq_info[irq].evtchn = 0; /* zap event-channel binding */
for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
@@ -824,7 +825,7 @@ void __init xen_init_IRQ(void)
mask_evtchn(i);
/* Dynamic IRQ space is currently unbound. Zero the refcnts. */
- for_each_irq_nr(i)
+ for (i = 0; i < nr_irqs; i++)
irq_bindcount[i] = 0;
irq_ctx_init(smp_processor_id());
Index: linux-2.6/fs/proc/stat.c
===================================================================
--- linux-2.6.orig/fs/proc/stat.c
+++ linux-2.6/fs/proc/stat.c
@@ -27,6 +27,9 @@ static int show_stat(struct seq_file *p,
u64 sum = 0;
struct timespec boottime;
unsigned int per_irq_sum;
+#ifdef CONFIG_GENERIC_HARDIRQS
+ struct irq_desc *desc;
+#endif
user = nice = system = idle = iowait =
irq = softirq = steal = cputime64_zero;
@@ -44,10 +47,9 @@ static int show_stat(struct seq_file *p,
softirq = cputime64_add(softirq, kstat_cpu(i).cpustat.softirq);
steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal);
guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest);
-
- for_each_irq_nr(j)
+ for_each_irq_desc(j, desc) {
sum += kstat_irqs_cpu(j, i);
-
+ } end_for_each_irq_desc();
sum += arch_irq_stat_cpu(i);
}
sum += arch_irq_stat();
@@ -90,14 +92,17 @@ static int show_stat(struct seq_file *p,
seq_printf(p, "intr %llu", (unsigned long long)sum);
/* sum again ? it could be updated? */
- for_each_irq_nr(j) {
+ for_each_irq_desc(j, desc) {
per_irq_sum = 0;
-
for_each_possible_cpu(i)
per_irq_sum += kstat_irqs_cpu(j, i);
+#ifdef CONFIG_SPARSE_IRQ
+ seq_printf(p, " %d:%u", j, per_irq_sum);
+#else
seq_printf(p, " %u", per_irq_sum);
- }
+#endif
+ } end_for_each_irq_desc();
seq_printf(p,
"\nctxt %llu\n"
Index: linux-2.6/fs/proc/interrupts.c
===================================================================
--- linux-2.6.orig/fs/proc/interrupts.c
+++ linux-2.6/fs/proc/interrupts.c
@@ -8,6 +8,23 @@
/*
* /proc/interrupts
*/
+#ifdef CONFIG_SPARSE_IRQ
+static void *int_seq_start(struct seq_file *f, loff_t *pos)
+{
+ rcu_read_lock();
+ return seq_list_start(&sparse_irqs_head, *pos);
+}
+
+static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos)
+{
+ return seq_list_next(v, &sparse_irqs_head, pos);
+}
+
+static void int_seq_stop(struct seq_file *f, void *v)
+{
+ rcu_read_unlock();
+}
+#else
static void *int_seq_start(struct seq_file *f, loff_t *pos)
{
return (*pos <= nr_irqs) ? pos : NULL;
@@ -25,6 +42,7 @@ static void int_seq_stop(struct seq_file
{
/* Nothing to do */
}
+#endif
static const struct seq_operations int_seq_ops = {
.start = int_seq_start,
Index: linux-2.6/include/linux/interrupt.h
===================================================================
--- linux-2.6.orig/include/linux/interrupt.h
+++ linux-2.6/include/linux/interrupt.h
@@ -18,6 +18,8 @@
#include <asm/ptrace.h>
#include <asm/system.h>
+extern int nr_irqs;
+
/*
* These correspond to the IORESOURCE_IRQ_* defines in
* linux/ioport.h to select the interrupt line behaviour. When
Index: linux-2.6/include/linux/irq.h
===================================================================
--- linux-2.6.orig/include/linux/irq.h
+++ linux-2.6/include/linux/irq.h
@@ -106,14 +106,23 @@ struct irq_chip {
void (*enable)(unsigned int irq);
void (*disable)(unsigned int irq);
+#ifdef CONFIG_SPARSE_IRQ
+ void (*ack)(struct irq_desc **descp);
+ void (*mask)(struct irq_desc **descp);
+ void (*mask_ack)(struct irq_desc **descp);
+ void (*unmask)(struct irq_desc **descp);
+ void (*eoi)(struct irq_desc **descp);
+ void (*set_affinity)(struct irq_desc *desc, cpumask_t dest);
+#else
void (*ack)(unsigned int irq);
void (*mask)(unsigned int irq);
void (*mask_ack)(unsigned int irq);
void (*unmask)(unsigned int irq);
void (*eoi)(unsigned int irq);
+ void (*set_affinity)(unsigned int irq, cpumask_t dest);
+#endif
void (*end)(unsigned int irq);
- void (*set_affinity)(unsigned int irq, cpumask_t dest);
int (*retrigger)(unsigned int irq);
int (*set_type)(unsigned int irq, unsigned int flow_type);
int (*set_wake)(unsigned int irq, unsigned int on);
@@ -129,6 +138,8 @@ struct irq_chip {
const char *typename;
};
+struct timer_rand_state;
+struct irq_2_iommu;
/**
* struct irq_desc - interrupt descriptor
* @irq: interrupt number for this descriptor
@@ -154,6 +165,14 @@ struct irq_chip {
*/
struct irq_desc {
unsigned int irq;
+#ifdef CONFIG_SPARSE_IRQ
+ struct list_head list;
+ struct timer_rand_state *timer_rand_state;
+ unsigned int *kstat_irqs;
+# ifdef CONFIG_INTR_REMAP
+ struct irq_2_iommu *irq_2_iommu;
+# endif
+#endif
irq_flow_handler_t handle_irq;
struct irq_chip *chip;
struct msi_desc *msi_desc;
@@ -181,14 +200,78 @@ struct irq_desc {
const char *name;
} ____cacheline_internodealigned_in_smp;
+extern void early_irq_init(void);
+extern void arch_early_irq_init(void);
+extern void arch_init_chip_data(struct irq_desc *desc, int cpu);
+extern void arch_init_copy_chip_data(struct irq_desc *old_desc,
+ struct irq_desc *desc, int cpu);
+extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc);
+
+#ifndef CONFIG_SPARSE_IRQ
extern struct irq_desc irq_desc[NR_IRQS];
static inline struct irq_desc *irq_to_desc(unsigned int irq)
{
- return (irq < nr_irqs) ? irq_desc + irq : NULL;
+ return (irq < NR_IRQS) ? irq_desc + irq : NULL;
+}
+static inline struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+{
+ return irq_to_desc(irq);
}
+#ifdef CONFIG_GENERIC_HARDIRQS
+# define for_each_irq_desc(irq, desc) \
+ for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
+# define for_each_irq_desc_reverse(irq, desc) \
+ for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \
+ irq >= 0; irq--, desc--)
+
+#define end_for_each_irq_desc()
+#endif
+
+#define desc_chip_ack(irq, descp) desc->chip->ack(irq)
+#define desc_chip_mask(irq, descp) desc->chip->mask(irq)
+#define desc_chip_mask_ack(irq, descp) desc->chip->mask_ack(irq)
+#define desc_chip_unmask(irq, descp) desc->chip->unmask(irq)
+#define desc_chip_eoi(irq, descp) desc->chip->eoi(irq)
+#define desc_chip_set_affinity(irq, descx, mask) desc->chip->set_affinity(irq, mask)
+
+#else
+
+extern struct irq_desc *irq_to_desc(unsigned int irq);
+extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu);
+extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu);
+
+extern struct list_head sparse_irqs_head;
+#define for_each_irq_desc(irqX, desc) \
+ rcu_read_lock(); \
+ for (desc = list_entry(rcu_dereference(sparse_irqs_head.next), typeof(*desc), list), irqX = desc->irq; \
+ prefetch(desc->list.next), &desc->list != &sparse_irqs_head; \
+ desc = list_entry(rcu_dereference(desc->list.next), typeof(*desc), list), irqX = desc ? desc->irq : -1U)
+
+#define for_each_irq_desc_reverse(irqX, desc) \
+ rcu_read_lock(); \
+ for (desc = list_entry(rcu_dereference(sparse_irqs_head.prev), typeof(*desc), list), irqX = desc->irq; \
+ prefetch(desc->list.prev), &desc->list != &sparse_irqs_head; \
+ desc = list_entry(rcu_dereference(desc->list.prev), typeof(*desc), list), irqX = desc ? desc->irq : -1U)
+
+#define end_for_each_irq_desc() rcu_read_unlock()
+
+#define kstat_irqs_this_cpu(DESC) \
+ ((DESC)->kstat_irqs[smp_processor_id()])
+#define kstat_incr_irqs_this_cpu(irqno, DESC) \
+ ((DESC)->kstat_irqs[smp_processor_id()]++)
+
+#define desc_chip_ack(irq, descp) desc->chip->ack(descp)
+#define desc_chip_mask(irq, descp) desc->chip->mask(descp)
+#define desc_chip_mask_ack(irq, descp) desc->chip->mask_ack(descp)
+#define desc_chip_unmask(irq, descp) desc->chip->unmask(descp)
+#define desc_chip_eoi(irq, descp) desc->chip->eoi(descp)
+#define desc_chip_set_affinity(irq, descx, mask) desc->chip->set_affinity(descx, mask)
+
+#endif
+
/*
* Migration helpers for obsolete names, they will go away:
*/
@@ -210,8 +293,12 @@ extern int setup_irq(unsigned int irq, s
#ifdef CONFIG_GENERIC_PENDING_IRQ
+void move_native_irq_desc(struct irq_desc **descp);
+void move_masked_irq_desc(struct irq_desc **descp);
+#ifndef CONFIG_SPARSE_IRQ
void move_native_irq(int irq);
void move_masked_irq(int irq);
+#endif
#else /* CONFIG_GENERIC_PENDING_IRQ */
@@ -380,6 +467,11 @@ extern int set_irq_msi(unsigned int irq,
#define get_irq_data(irq) (irq_to_desc(irq)->handler_data)
#define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc)
+#define get_irq_desc_chip(desc) ((desc)->chip)
+#define get_irq_desc_chip_data(desc) ((desc)->chip_data)
+#define get_irq_desc_data(desc) ((desc)->handler_data)
+#define get_irq_desc_msi(desc) ((desc)->msi_desc)
+
#endif /* CONFIG_GENERIC_HARDIRQS */
#endif /* !CONFIG_S390 */
Index: linux-2.6/include/linux/kernel_stat.h
===================================================================
--- linux-2.6.orig/include/linux/kernel_stat.h
+++ linux-2.6/include/linux/kernel_stat.h
@@ -28,7 +28,9 @@ struct cpu_usage_stat {
struct kernel_stat {
struct cpu_usage_stat cpustat;
- unsigned int irqs[NR_IRQS];
+#ifndef CONFIG_SPARSE_IRQ
+ unsigned int irqs[NR_IRQS];
+#endif
};
DECLARE_PER_CPU(struct kernel_stat, kstat);
@@ -39,6 +41,10 @@ DECLARE_PER_CPU(struct kernel_stat, ksta
extern unsigned long long nr_context_switches(void);
+#ifndef CONFIG_SPARSE_IRQ
+#define kstat_irqs_this_cpu(irq) \
+ (kstat_this_cpu.irqs[irq])
+
struct irq_desc;
static inline void kstat_incr_irqs_this_cpu(unsigned int irq,
@@ -46,11 +52,17 @@ static inline void kstat_incr_irqs_this_
{
kstat_this_cpu.irqs[irq]++;
}
+#endif
+
+#ifndef CONFIG_SPARSE_IRQ
static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
{
return kstat_cpu(cpu).irqs[irq];
}
+#else
+extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu);
+#endif
/*
* Number of interrupts per specific IRQ source, since bootup
Index: linux-2.6/kernel/irq/autoprobe.c
===================================================================
--- linux-2.6.orig/kernel/irq/autoprobe.c
+++ linux-2.6/kernel/irq/autoprobe.c
@@ -57,7 +57,7 @@ unsigned long probe_irq_on(void)
desc->chip->startup(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
/* Wait for longstanding interrupts to trigger. */
msleep(20);
@@ -75,7 +75,7 @@ unsigned long probe_irq_on(void)
desc->status |= IRQ_PENDING;
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
/*
* Wait for spurious interrupts to trigger
@@ -99,7 +99,7 @@ unsigned long probe_irq_on(void)
mask |= 1 << i;
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
return mask;
}
@@ -135,7 +135,7 @@ unsigned int probe_irq_mask(unsigned lon
desc->chip->shutdown(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
mutex_unlock(&probing_active);
return mask & val;
@@ -179,7 +179,7 @@ int probe_irq_off(unsigned long val)
desc->chip->shutdown(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
mutex_unlock(&probing_active);
if (nr_of_irqs > 1)
Index: linux-2.6/kernel/irq/chip.c
===================================================================
--- linux-2.6.orig/kernel/irq/chip.c
+++ linux-2.6/kernel/irq/chip.c
@@ -24,9 +24,10 @@
*/
void dynamic_irq_init(unsigned int irq)
{
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_desc *desc;
unsigned long flags;
+ desc = irq_to_desc(irq);
if (!desc) {
WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
return;
@@ -223,7 +224,7 @@ static void default_enable(unsigned int
{
struct irq_desc *desc = irq_to_desc(irq);
- desc->chip->unmask(irq);
+ desc_chip_unmask(irq, &desc);
desc->status &= ~IRQ_MASKED;
}
@@ -252,7 +253,7 @@ static void default_shutdown(unsigned in
{
struct irq_desc *desc = irq_to_desc(irq);
- desc->chip->mask(irq);
+ desc_chip_mask(irq, &desc);
desc->status |= IRQ_MASKED;
}
@@ -282,13 +283,15 @@ void irq_chip_set_defaults(struct irq_ch
chip->end = dummy_irq_chip.end;
}
-static inline void mask_ack_irq(struct irq_desc *desc, int irq)
+static inline void mask_ack_irq(struct irq_desc **descp, int irq)
{
+ struct irq_desc *desc = *descp;
+
if (desc->chip->mask_ack)
- desc->chip->mask_ack(irq);
+ desc_chip_mask_ack(irq, descp);
else {
- desc->chip->mask(irq);
- desc->chip->ack(irq);
+ desc_chip_mask(irq, descp);
+ desc_chip_ack(irq, descp);
}
}
@@ -351,7 +354,7 @@ handle_level_irq(unsigned int irq, struc
irqreturn_t action_ret;
spin_lock(&desc->lock);
- mask_ack_irq(desc, irq);
+ mask_ack_irq(&desc, irq);
if (unlikely(desc->status & IRQ_INPROGRESS))
goto out_unlock;
@@ -376,7 +379,7 @@ handle_level_irq(unsigned int irq, struc
spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
if (!(desc->status & IRQ_DISABLED) && desc->chip->unmask)
- desc->chip->unmask(irq);
+ desc_chip_unmask(irq, &desc);
out_unlock:
spin_unlock(&desc->lock);
}
@@ -413,7 +416,7 @@ handle_fasteoi_irq(unsigned int irq, str
if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
desc->status |= IRQ_PENDING;
if (desc->chip->mask)
- desc->chip->mask(irq);
+ desc_chip_mask(irq, &desc);
goto out;
}
@@ -428,7 +431,7 @@ handle_fasteoi_irq(unsigned int irq, str
spin_lock(&desc->lock);
desc->status &= ~IRQ_INPROGRESS;
out:
- desc->chip->eoi(irq);
+ desc_chip_eoi(irq, &desc);
spin_unlock(&desc->lock);
}
@@ -464,13 +467,13 @@ handle_edge_irq(unsigned int irq, struct
if (unlikely((desc->status & (IRQ_INPROGRESS | IRQ_DISABLED)) ||
!desc->action)) {
desc->status |= (IRQ_PENDING | IRQ_MASKED);
- mask_ack_irq(desc, irq);
+ mask_ack_irq(&desc, irq);
goto out_unlock;
}
kstat_incr_irqs_this_cpu(irq, desc);
/* Start handling the irq */
- desc->chip->ack(irq);
+ desc_chip_ack(irq, &desc);
/* Mark the IRQ currently in progress.*/
desc->status |= IRQ_INPROGRESS;
@@ -480,7 +483,7 @@ handle_edge_irq(unsigned int irq, struct
irqreturn_t action_ret;
if (unlikely(!action)) {
- desc->chip->mask(irq);
+ desc_chip_mask(irq, &desc);
goto out_unlock;
}
@@ -492,7 +495,7 @@ handle_edge_irq(unsigned int irq, struct
if (unlikely((desc->status &
(IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) ==
(IRQ_PENDING | IRQ_MASKED))) {
- desc->chip->unmask(irq);
+ desc_chip_unmask(irq, &desc);
desc->status &= ~IRQ_MASKED;
}
@@ -525,14 +528,14 @@ handle_percpu_irq(unsigned int irq, stru
kstat_incr_irqs_this_cpu(irq, desc);
if (desc->chip->ack)
- desc->chip->ack(irq);
+ desc_chip_ack(irq, &desc);
action_ret = handle_IRQ_event(irq, desc->action);
if (!noirqdebug)
note_interrupt(irq, desc, action_ret);
if (desc->chip->eoi)
- desc->chip->eoi(irq);
+ desc_chip_eoi(irq, &desc);
}
void
@@ -568,7 +571,7 @@ __set_irq_handler(unsigned int irq, irq_
/* Uninstall? */
if (handle == handle_bad_irq) {
if (desc->chip != &no_irq_chip)
- mask_ack_irq(desc, irq);
+ mask_ack_irq(&desc, irq);
desc->status |= IRQ_DISABLED;
desc->depth = 1;
}
Index: linux-2.6/kernel/irq/handle.c
===================================================================
--- linux-2.6.orig/kernel/irq/handle.c
+++ linux-2.6/kernel/irq/handle.c
@@ -15,9 +15,16 @@
#include <linux/random.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
+#include <linux/rculist.h>
+#include <linux/hash.h>
#include "internals.h"
+/*
+ * lockdep: we want to handle all irq_desc locks as a single lock-class:
+ */
+static struct lock_class_key irq_desc_lock_class;
+
/**
* handle_bad_irq - handle spurious and unhandled irqs
* @irq: the interrupt number
@@ -49,6 +56,164 @@ void handle_bad_irq(unsigned int irq, st
int nr_irqs = NR_IRQS;
EXPORT_SYMBOL_GPL(nr_irqs);
+void __init __attribute__((weak)) arch_early_irq_init(void)
+{
+}
+
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_desc irq_desc_init = {
+ .irq = -1,
+ .status = IRQ_DISABLED,
+ .chip = &no_irq_chip,
+ .handle_irq = handle_bad_irq,
+ .depth = 1,
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
+#ifdef CONFIG_SMP
+ .affinity = CPU_MASK_ALL
+#endif
+};
+
+static void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr)
+{
+ unsigned long bytes;
+ char *ptr;
+ int node;
+
+ /* Compute how many bytes we need per irq and allocate them */
+ bytes = nr * sizeof(unsigned int);
+
+ node = cpu_to_node(cpu);
+ ptr = kzalloc_node(bytes, GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc kstat_irqs on cpu %d node %d\n", cpu, node);
+
+ if (ptr)
+ desc->kstat_irqs = (unsigned int *)ptr;
+}
+
+void __attribute__((weak)) arch_init_chip_data(struct irq_desc *desc, int cpu)
+{
+}
+
+static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu)
+{
+ memcpy(desc, &irq_desc_init, sizeof(struct irq_desc));
+ desc->irq = irq;
+#ifdef CONFIG_SMP
+ desc->cpu = cpu;
+#endif
+ lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ init_kstat_irqs(desc, cpu, nr_cpu_ids);
+ if (!desc->kstat_irqs) {
+ printk(KERN_ERR "can not alloc kstat_irqs\n");
+ BUG_ON(1);
+ }
+ arch_init_chip_data(desc, cpu);
+}
+
+/*
+ * Protect the sparse_irqs:
+ */
+static DEFINE_SPINLOCK(sparse_irq_lock);
+LIST_HEAD(sparse_irqs_head);
+
+struct irq_desc *irq_desc_ptrs[NR_IRQS] __read_mostly;
+
+static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = {
+ [0 ... NR_IRQS_LEGACY-1] = {
+ .irq = -1,
+ .status = IRQ_DISABLED,
+ .chip = &no_irq_chip,
+ .handle_irq = handle_bad_irq,
+ .depth = 1,
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
+#ifdef CONFIG_SMP
+ .affinity = CPU_MASK_ALL
+#endif
+ }
+};
+
+/* FIXME: use bootmem alloc ...*/
+static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS];
+
+void __init early_irq_init(void)
+{
+ struct irq_desc *desc;
+ int legacy_count;
+ int i;
+
+ desc = irq_desc_legacy;
+ legacy_count = ARRAY_SIZE(irq_desc_legacy);
+
+ for (i = 0; i < legacy_count; i++) {
+ desc[i].irq = i;
+ desc[i].kstat_irqs = kstat_irqs_legacy[i];
+
+ irq_desc_ptrs[i] = desc + i;
+ list_add_tail(&desc[i].list, &sparse_irqs_head);
+ }
+
+ for (i = legacy_count; i < NR_IRQS; i++)
+ irq_desc_ptrs[i] = NULL;
+
+ arch_early_irq_init();
+}
+
+struct irq_desc *irq_to_desc(unsigned int irq)
+{
+ if (irq >= NR_IRQS) {
+ printk(KERN_WARNING "irq >= NR_IRQS in irq_to_desc: %d %d\n",
+ irq, NR_IRQS);
+ WARN_ON(1);
+ return NULL;
+ }
+ return irq_desc_ptrs[irq];
+}
+
+struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc;
+ unsigned long flags;
+ int node;
+
+ if (irq >= NR_IRQS) {
+ printk(KERN_WARNING "irq >= NR_IRQS in irq_to_desc_alloc: %d %d\n",
+ irq, NR_IRQS);
+ WARN_ON(1);
+ return NULL;
+ }
+
+ desc = irq_desc_ptrs[irq];
+ if (desc)
+ return desc;
+
+ spin_lock_irqsave(&sparse_irq_lock, flags);
+
+ /* We have to check it to avoid races with another CPU */
+ desc = irq_desc_ptrs[irq];
+ if (desc)
+ goto out_unlock;
+
+ node = cpu_to_node(cpu);
+ desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_desc for %d on cpu %d node %d\n",
+ irq, cpu, node);
+ if (!desc) {
+ printk(KERN_ERR "can not alloc irq_desc\n");
+ BUG_ON(1);
+ }
+ init_one_irq_desc(irq, desc, cpu);
+
+ irq_desc_ptrs[irq] = desc;
+ list_add_tail_rcu(&desc->list, &sparse_irqs_head);
+
+out_unlock:
+ spin_unlock_irqrestore(&sparse_irq_lock, flags);
+
+ return desc;
+}
+
+#else
+
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
[0 ... NR_IRQS-1] = {
.status = IRQ_DISABLED,
@@ -62,17 +227,30 @@ struct irq_desc irq_desc[NR_IRQS] __cach
}
};
+#endif
+
/*
* What should we do if we get a hw irq event on an illegal vector?
* Each architecture has to answer this themself.
*/
+static void ack_bad_desc(struct irq_desc **descp)
+{
+ unsigned int irq = (*descp)->irq;
+
+ print_irq_desc(irq, *descp);
+ ack_bad_irq(irq);
+}
+
+#ifdef CONFIG_SPARSE_IRQ
+#define ack_bad ack_bad_desc
+#else
static void ack_bad(unsigned int irq)
{
struct irq_desc *desc = irq_to_desc(irq);
- print_irq_desc(irq, desc);
- ack_bad_irq(irq);
+ ack_bad_desc(&desc);
}
+#endif
/*
* NOP functions
@@ -81,6 +259,14 @@ static void noop(unsigned int irq)
{
}
+#ifdef CONFIG_SPARSE_IRQ
+static void noop_desc(struct irq_desc **descp)
+{
+}
+#else
+#define noop_desc noop
+#endif
+
static unsigned int noop_ret(unsigned int irq)
{
return 0;
@@ -109,9 +295,9 @@ struct irq_chip dummy_irq_chip = {
.shutdown = noop,
.enable = noop,
.disable = noop,
- .ack = noop,
- .mask = noop,
- .unmask = noop,
+ .ack = noop_desc,
+ .mask = noop_desc,
+ .unmask = noop_desc,
.end = noop,
};
@@ -180,7 +366,7 @@ unsigned int __do_IRQ(unsigned int irq)
* No locking required for CPU-local interrupts:
*/
if (desc->chip->ack)
- desc->chip->ack(irq);
+ desc_chip_ack(irq, &desc);
if (likely(!(desc->status & IRQ_DISABLED))) {
action_ret = handle_IRQ_event(irq, desc->action);
if (!noirqdebug)
@@ -192,7 +378,7 @@ unsigned int __do_IRQ(unsigned int irq)
spin_lock(&desc->lock);
if (desc->chip->ack)
- desc->chip->ack(irq);
+ desc_chip_ack(irq, &desc);
/*
* REPLAY is when Linux resends an IRQ that was dropped earlier
* WAITING is used by probe to mark irqs that are being tested
@@ -261,17 +447,25 @@ out:
#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_SPARSE_IRQ
struct irq_desc *desc;
int i;
- for_each_irq_desc(i, desc)
+ for_each_irq_desc(i, desc) {
lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ } end_for_each_irq_desc();
+#endif
}
#endif
+
+#ifdef CONFIG_SPARSE_IRQ
+unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ return desc->kstat_irqs[cpu];
+}
+#endif
+EXPORT_SYMBOL(kstat_irqs_cpu);
+
Index: linux-2.6/arch/x86/kernel/irq.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq.c
+++ linux-2.6/arch/x86/kernel/irq.c
@@ -99,25 +99,37 @@ static int show_other_interrupts(struct
int show_interrupts(struct seq_file *p, void *v)
{
unsigned long flags, any_count = 0;
- int i = *(loff_t *) v, j;
+ int i, j;
struct irqaction *action;
struct irq_desc *desc;
+ int head = 0;
+#ifdef CONFIG_SPARSE_IRQ
+ desc = list_entry(v, struct irq_desc, list);
+ i = desc->irq;
+ if (&desc->list == sparse_irqs_head.next)
+ head = 1;
+#else
+ i = *(loff_t *) v;
if (i > nr_irqs)
return 0;
if (i == nr_irqs)
return show_other_interrupts(p);
+ if (i == 0)
+ head = 1;
+
+ desc = irq_to_desc(i);
+#endif
/* print header */
- if (i == 0) {
+ if (head) {
seq_printf(p, " ");
for_each_online_cpu(j)
seq_printf(p, "CPU%-8d", j);
seq_putc(p, '\n');
}
- desc = irq_to_desc(i);
spin_lock_irqsave(&desc->lock, flags);
#ifndef CONFIG_SMP
any_count = kstat_irqs(i);
@@ -148,6 +160,12 @@ int show_interrupts(struct seq_file *p,
seq_putc(p, '\n');
out:
spin_unlock_irqrestore(&desc->lock, flags);
+
+#ifdef CONFIG_SPARSE_IRQ
+ if (&desc->list == sparse_irqs_head.prev)
+ show_other_interrupts(p);
+#endif
+
return 0;
}
Index: linux-2.6/include/linux/irqnr.h
===================================================================
--- linux-2.6.orig/include/linux/irqnr.h
+++ linux-2.6/include/linux/irqnr.h
@@ -7,18 +7,11 @@
# define for_each_irq_desc(irq, desc) \
for (irq = 0; irq < nr_irqs; irq++)
-#else
-extern int nr_irqs;
+# define end_for_each_irq_desc()
-# define for_each_irq_desc(irq, desc) \
- for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
-
-# define for_each_irq_desc_reverse(irq, desc) \
- for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \
- irq >= 0; irq--, desc--)
+static inline early_sparse_irq_init(void)
+{
+}
#endif
-#define for_each_irq_nr(irq) \
- for (irq = 0; irq < nr_irqs; irq++)
-
#endif
Index: linux-2.6/arch/x86/kernel/irq_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_32.c
+++ linux-2.6/arch/x86/kernel/irq_32.c
@@ -251,10 +251,10 @@ void fixup_irqs(cpumask_t map)
mask = map;
}
if (desc->chip->set_affinity)
- desc->chip->set_affinity(irq, mask);
+ desc_chip_set_affinity(irq, desc, mask);
else if (desc->action && !(warned++))
printk("Cannot set affinity for irq %i\n", irq);
- }
+ } end_for_each_irq_desc();
#if 0
barrier();
Index: linux-2.6/arch/x86/kernel/irq_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_64.c
+++ linux-2.6/arch/x86/kernel/irq_64.c
@@ -109,15 +109,15 @@ void fixup_irqs(cpumask_t map)
}
if (desc->chip->mask)
- desc->chip->mask(irq);
+ desc_chip_mask(irq, &desc);
if (desc->chip->set_affinity)
- desc->chip->set_affinity(irq, mask);
+ desc_chip_set_affinity(irq, desc, mask);
else if (!(warned++))
set_affinity = 0;
if (desc->chip->unmask)
- desc->chip->unmask(irq);
+ desc_chip_unmask(irq, &desc);
spin_unlock(&desc->lock);
@@ -125,7 +125,7 @@ void fixup_irqs(cpumask_t map)
printk("Broke affinity for irq %i\n", irq);
else if (!set_affinity)
printk("Cannot set affinity for irq %i\n", irq);
- }
+ } end_for_each_irq_desc();
/* That doesn't seem sufficient. Give it 1ms. */
local_irq_enable();
Index: linux-2.6/kernel/irq/proc.c
===================================================================
--- linux-2.6.orig/kernel/irq/proc.c
+++ linux-2.6/kernel/irq/proc.c
@@ -243,7 +243,8 @@ void init_irq_proc(void)
/*
* Create entries for all existing IRQs.
*/
- for_each_irq_desc(irq, desc)
+ for_each_irq_desc(irq, desc) {
register_irq_proc(irq, desc);
+ } end_for_each_irq_desc();
}
Index: linux-2.6/kernel/irq/spurious.c
===================================================================
--- linux-2.6.orig/kernel/irq/spurious.c
+++ linux-2.6/kernel/irq/spurious.c
@@ -99,7 +99,7 @@ static int misrouted_irq(int irq)
if (try_one_irq(i, desc))
ok = 1;
- }
+ } end_for_each_irq_desc();
/* So the caller can adjust the irq error counts */
return ok;
}
@@ -122,7 +122,7 @@ static void poll_spurious_irqs(unsigned
continue;
try_one_irq(i, desc);
- }
+ } end_for_each_irq_desc();
mod_timer(&poll_spurious_irq_timer,
jiffies + POLL_SPURIOUS_IRQ_INTERVAL);
Index: linux-2.6/init/main.c
===================================================================
--- linux-2.6.orig/init/main.c
+++ linux-2.6/init/main.c
@@ -542,6 +542,15 @@ void __init __weak thread_info_cache_ini
{
}
+void __init __weak arch_early_irq_init(void)
+{
+}
+
+void __init __weak early_irq_init(void)
+{
+ arch_early_irq_init();
+}
+
asmlinkage void __init start_kernel(void)
{
char * command_line;
@@ -612,6 +621,8 @@ asmlinkage void __init start_kernel(void
sort_main_extable();
trap_init();
rcu_init();
+ /* init some links before init_ISA_irqs() */
+ early_irq_init();
init_IRQ();
pidhash_init();
init_timers();
Index: linux-2.6/arch/x86/include/asm/irq_vectors.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/irq_vectors.h
+++ linux-2.6/arch/x86/include/asm/irq_vectors.h
@@ -101,12 +101,23 @@
#define LAST_VM86_IRQ 15
#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
+#define NR_IRQS_LEGACY 16
+
#if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER)
+
+#ifndef CONFIG_SPARSE_IRQ
# if NR_CPUS < MAX_IO_APICS
# define NR_IRQS (NR_VECTORS + (32 * NR_CPUS))
# else
# define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS))
# endif
+#else
+# if (8 * NR_CPUS) > (32 * MAX_IO_APICS)
+# define NR_IRQS (NR_VECTORS + (8 * NR_CPUS))
+# else
+# define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS))
+# endif
+#endif
#elif defined(CONFIG_X86_VOYAGER)
Index: linux-2.6/arch/x86/kernel/i8259.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/i8259.c
+++ linux-2.6/arch/x86/kernel/i8259.c
@@ -36,12 +36,31 @@ static int i8259A_auto_eoi;
DEFINE_SPINLOCK(i8259A_lock);
static void mask_and_ack_8259A(unsigned int);
+#ifdef CONFIG_SPARSE_IRQ
+static void mask_and_ack_8259A_desc(struct irq_desc **descp)
+{
+ mask_and_ack_8259A((*descp)->irq);
+}
+static void disable_8259A_irq_desc(struct irq_desc **descp)
+{
+ disable_8259A_irq((*descp)->irq);
+}
+static void enable_8259A_irq_desc(struct irq_desc **descp)
+{
+ enable_8259A_irq((*descp)->irq);
+}
+#else
+#define mask_and_ack_8259A_desc mask_and_ack_8259A
+#define disable_8259A_irq_desc disable_8259A_irq
+#define enable_8259A_irq_desc enable_8259A_irq
+#endif
+
struct irq_chip i8259A_chip = {
.name = "XT-PIC",
- .mask = disable_8259A_irq,
+ .mask = disable_8259A_irq_desc,
.disable = disable_8259A_irq,
- .unmask = enable_8259A_irq,
- .mask_ack = mask_and_ack_8259A,
+ .unmask = enable_8259A_irq_desc,
+ .mask_ack = mask_and_ack_8259A_desc,
};
/*
@@ -348,9 +367,9 @@ void init_8259A(int auto_eoi)
* In AEOI mode we just have to mask the interrupt
* when acking.
*/
- i8259A_chip.mask_ack = disable_8259A_irq;
+ i8259A_chip.mask_ack = disable_8259A_irq_desc;
else
- i8259A_chip.mask_ack = mask_and_ack_8259A;
+ i8259A_chip.mask_ack = mask_and_ack_8259A_desc;
udelay(100); /* wait for 8259A to initialize */
Index: linux-2.6/arch/x86/kernel/uv_irq.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/uv_irq.c
+++ linux-2.6/arch/x86/kernel/uv_irq.c
@@ -18,26 +18,45 @@ static void uv_noop(unsigned int irq)
{
}
+#ifdef CONFIG_SPARSE_IRQ
+static void uv_noop_desc(struct irq_desc **descp)
+{
+}
+
+#else
+#define uv_noop_desc uv_noop
+#endif
+
static unsigned int uv_noop_ret(unsigned int irq)
{
return 0;
}
+#ifdef CONFIG_SPARSE_IRQ
+static void uv_ack_apic_desc(struct irq_desc **descp)
+{
+ ack_APIC_irq();
+}
+
+#else
static void uv_ack_apic(unsigned int irq)
{
ack_APIC_irq();
}
+#define uv_ack_apic_desc uv_ack_apic
+#endif
+
struct irq_chip uv_irq_chip = {
.name = "UV-CORE",
.startup = uv_noop_ret,
.shutdown = uv_noop,
.enable = uv_noop,
.disable = uv_noop,
- .ack = uv_noop,
- .mask = uv_noop,
- .unmask = uv_noop,
- .eoi = uv_ack_apic,
+ .ack = uv_noop_desc,
+ .mask = uv_noop_desc,
+ .unmask = uv_noop_desc,
+ .eoi = uv_ack_apic_desc,
.end = uv_noop,
};
Index: linux-2.6/drivers/pci/msi.c
===================================================================
--- linux-2.6.orig/drivers/pci/msi.c
+++ linux-2.6/drivers/pci/msi.c
@@ -103,11 +103,11 @@ static void msix_set_enable(struct pci_d
}
}
-static void msix_flush_writes(unsigned int irq)
+static void msix_flush_writes(struct irq_desc *desc)
{
struct msi_desc *entry;
- entry = get_irq_msi(irq);
+ entry = get_irq_desc_msi(desc);
BUG_ON(!entry || !entry->dev);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
@@ -135,11 +135,11 @@ static void msix_flush_writes(unsigned i
* Returns 1 if it succeeded in masking the interrupt and 0 if the device
* doesn't support MSI masking.
*/
-static int msi_set_mask_bits(unsigned int irq, u32 mask, u32 flag)
+static int msi_set_mask_bits(struct irq_desc *desc, u32 mask, u32 flag)
{
struct msi_desc *entry;
- entry = get_irq_msi(irq);
+ entry = get_irq_desc_msi(desc);
BUG_ON(!entry || !entry->dev);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
@@ -172,9 +172,9 @@ static int msi_set_mask_bits(unsigned in
return 1;
}
-void read_msi_msg(unsigned int irq, struct msi_msg *msg)
+void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
{
- struct msi_desc *entry = get_irq_msi(irq);
+ struct msi_desc *entry = get_irq_desc_msi(desc);
switch(entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
{
@@ -211,9 +211,16 @@ void read_msi_msg(unsigned int irq, stru
}
}
-void write_msi_msg(unsigned int irq, struct msi_msg *msg)
+void read_msi_msg(unsigned int irq, struct msi_msg *msg)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ read_msi_msg_desc(desc, msg);
+}
+
+void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
{
- struct msi_desc *entry = get_irq_msi(irq);
+ struct msi_desc *entry = get_irq_desc_msi(desc);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
{
@@ -252,17 +259,43 @@ void write_msi_msg(unsigned int irq, str
entry->msg = *msg;
}
-void mask_msi_irq(unsigned int irq)
+void write_msi_msg(unsigned int irq, struct msi_msg *msg)
{
- msi_set_mask_bits(irq, 1, 1);
- msix_flush_writes(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ write_msi_msg_desc(desc, msg);
}
+void mask_msi_irq_desc(struct irq_desc **descp)
+{
+ struct irq_desc *desc = *descp;
+
+ msi_set_mask_bits(desc, 1, 1);
+ msix_flush_writes(desc);
+}
+
+void unmask_msi_irq_desc(struct irq_desc **descp)
+{
+ struct irq_desc *desc = *descp;
+
+ msi_set_mask_bits(desc, 1, 0);
+ msix_flush_writes(desc);
+}
+
+#ifndef CONFIG_SPARSE_IRQ
+void mask_msi_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_msi_irq_desc(&desc);
+}
void unmask_msi_irq(unsigned int irq)
{
- msi_set_mask_bits(irq, 1, 0);
- msix_flush_writes(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_msi_irq_desc(&desc);
}
+#endif
static int msi_free_irqs(struct pci_dev* dev);
@@ -303,9 +336,11 @@ static void __pci_restore_msi_state(stru
pci_intx_for_msi(dev, 0);
msi_set_enable(dev, 0);
write_msi_msg(dev->irq, &entry->msg);
- if (entry->msi_attrib.maskbit)
- msi_set_mask_bits(dev->irq, entry->msi_attrib.maskbits_mask,
+ if (entry->msi_attrib.maskbit) {
+ struct irq_desc *desc = irq_to_desc(dev->irq);
+ msi_set_mask_bits(desc, entry->msi_attrib.maskbits_mask,
entry->msi_attrib.masked);
+ }
pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
control &= ~PCI_MSI_FLAGS_QSIZE;
@@ -327,8 +362,9 @@ static void __pci_restore_msix_state(str
msix_set_enable(dev, 0);
list_for_each_entry(entry, &dev->msi_list, list) {
+ struct irq_desc *desc = irq_to_desc(entry->irq);
write_msi_msg(entry->irq, &entry->msg);
- msi_set_mask_bits(entry->irq, 1, entry->msi_attrib.masked);
+ msi_set_mask_bits(desc, 1, entry->msi_attrib.masked);
}
BUG_ON(list_empty(&dev->msi_list));
@@ -596,7 +632,8 @@ void pci_msi_shutdown(struct pci_dev* de
/* Return the the pci reset with msi irqs unmasked */
if (entry->msi_attrib.maskbit) {
u32 mask = entry->msi_attrib.maskbits_mask;
- msi_set_mask_bits(dev->irq, mask, ~mask);
+ struct irq_desc *desc = irq_to_desc(dev->irq);
+ msi_set_mask_bits(desc, mask, ~mask);
}
if (!entry->dev || entry->msi_attrib.type != PCI_CAP_ID_MSI)
return;
Index: linux-2.6/include/linux/msi.h
===================================================================
--- linux-2.6.orig/include/linux/msi.h
+++ linux-2.6/include/linux/msi.h
@@ -10,8 +10,18 @@ struct msi_msg {
};
/* Helper functions */
+struct irq_desc;
+#ifdef CONFIG_SPARSE_IRQ
+extern void mask_msi_irq_desc(struct irq_desc **descp);
+extern void unmask_msi_irq_desc(struct irq_desc **descp);
+#define mask_msi_irq mask_msi_irq_desc
+#define unmask_msi_irq unmask_msi_irq_desc
+#else
extern void mask_msi_irq(unsigned int irq);
extern void unmask_msi_irq(unsigned int irq);
+#endif
+extern void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg);
+extern void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg);
extern void read_msi_msg(unsigned int irq, struct msi_msg *msg);
extern void write_msi_msg(unsigned int irq, struct msi_msg *msg);
Index: linux-2.6/arch/x86/include/asm/hpet.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/hpet.h
+++ linux-2.6/arch/x86/include/asm/hpet.h
@@ -72,8 +72,15 @@ extern void hpet_disable(void);
extern unsigned long hpet_readl(unsigned long a);
extern void force_hpet_resume(void);
+#ifdef CONFIG_SPARSE_IRQ
+extern void hpet_msi_unmask_desc(struct irq_desc **descp);
+extern void hpet_msi_mask_desc(struct irq_desc **descp);
+#define hpet_msi_unmask hpet_msi_unmask_desc
+#define hpet_msi_mask hpet_msi_mask_desc
+#else
extern void hpet_msi_unmask(unsigned int irq);
extern void hpet_msi_mask(unsigned int irq);
+#endif
extern void hpet_msi_write(unsigned int irq, struct msi_msg *msg);
extern void hpet_msi_read(unsigned int irq, struct msi_msg *msg);
Index: linux-2.6/arch/x86/kernel/hpet.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/hpet.c
+++ linux-2.6/arch/x86/kernel/hpet.c
@@ -347,9 +347,9 @@ static int hpet_legacy_next_event(unsign
static DEFINE_PER_CPU(struct hpet_dev *, cpu_hpet_dev);
static struct hpet_dev *hpet_devs;
-void hpet_msi_unmask(unsigned int irq)
+void hpet_msi_unmask_desc(struct irq_desc **descp)
{
- struct hpet_dev *hdev = get_irq_data(irq);
+ struct hpet_dev *hdev = get_irq_desc_data(*descp);
unsigned long cfg;
/* unmask it */
@@ -358,10 +358,10 @@ void hpet_msi_unmask(unsigned int irq)
hpet_writel(cfg, HPET_Tn_CFG(hdev->num));
}
-void hpet_msi_mask(unsigned int irq)
+void hpet_msi_mask_desc(struct irq_desc **descp)
{
unsigned long cfg;
- struct hpet_dev *hdev = get_irq_data(irq);
+ struct hpet_dev *hdev = get_irq_desc_data(*descp);
/* mask it */
cfg = hpet_readl(HPET_Tn_CFG(hdev->num));
@@ -369,6 +369,21 @@ void hpet_msi_mask(unsigned int irq)
hpet_writel(cfg, HPET_Tn_CFG(hdev->num));
}
+#ifndef CONFIG_SPARSE_IRQ
+void hpet_msi_unmask(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ hpet_msi_unmask_desc(&desc);
+}
+void hpet_msi_mask(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ hpet_msi_mask_desc(&desc);
+}
+#endif
+
void hpet_msi_write(unsigned int irq, struct msi_msg *msg)
{
struct hpet_dev *hdev = get_irq_data(irq);
Index: linux-2.6/include/linux/htirq.h
===================================================================
--- linux-2.6.orig/include/linux/htirq.h
+++ linux-2.6/include/linux/htirq.h
@@ -9,8 +9,16 @@ struct ht_irq_msg {
/* Helper functions.. */
void fetch_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg);
void write_ht_irq_msg(unsigned int irq, struct ht_irq_msg *msg);
+#ifdef CONFIG_SPARSE_IRQ
+struct irq_desc;
+void mask_ht_irq_desc(struct irq_desc **descp);
+void unmask_ht_irq_desc(struct irq_desc **descp);
+#define mask_ht_irq mask_ht_irq_desc
+#define unmask_ht_irq unmask_ht_irq_desc
+#else
void mask_ht_irq(unsigned int irq);
void unmask_ht_irq(unsigned int irq);
+#endif
/* The arch hook for getting things started */
int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev);
Index: linux-2.6/kernel/irq/migration.c
===================================================================
--- linux-2.6.orig/kernel/irq/migration.c
+++ linux-2.6/kernel/irq/migration.c
@@ -1,9 +1,9 @@
#include <linux/irq.h>
-void move_masked_irq(int irq)
+void move_masked_irq_desc(struct irq_desc **descp)
{
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_desc *desc = *descp;
cpumask_t tmp;
if (likely(!(desc->status & IRQ_MOVE_PENDING)))
@@ -42,14 +42,17 @@ void move_masked_irq(int irq)
* masking the irqs.
*/
if (likely(!cpus_empty(tmp))) {
- desc->chip->set_affinity(irq,tmp);
+ desc_chip_set_affinity(desc->irq, desc, tmp);
}
cpus_clear(desc->pending_mask);
}
-void move_native_irq(int irq)
+void move_native_irq_desc(struct irq_desc **descp)
{
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_desc *desc = *descp;
+#ifndef CONFIG_SPARSE_IRQ
+ unsigned int irq = desc->irq;
+#endif
if (likely(!(desc->status & IRQ_MOVE_PENDING)))
return;
@@ -57,8 +60,23 @@ void move_native_irq(int irq)
if (unlikely(desc->status & IRQ_DISABLED))
return;
- desc->chip->mask(irq);
- move_masked_irq(irq);
- desc->chip->unmask(irq);
+ desc_chip_mask(irq, descp);
+ move_masked_irq_desc(descp);
+ desc_chip_unmask(irq, descp);
}
+#ifndef CONFIG_SPARSE_IRQ
+void move_masked_irq(int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ move_masked_irq_desc(&desc);
+}
+
+void move_native_irq(int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ move_native_irq_desc(&desc);
+}
+#endif
Index: linux-2.6/drivers/pci/intel-iommu.c
===================================================================
--- linux-2.6.orig/drivers/pci/intel-iommu.c
+++ linux-2.6/drivers/pci/intel-iommu.c
@@ -751,9 +751,9 @@ const char *dmar_get_fault_reason(u8 fau
return fault_reason_strings[fault_reason];
}
-void dmar_msi_unmask(unsigned int irq)
+void dmar_msi_unmask_desc(struct irq_desc **descp)
{
- struct intel_iommu *iommu = get_irq_data(irq);
+ struct intel_iommu *iommu = get_irq_desc_data(*descp);
unsigned long flag;
/* unmask it */
@@ -764,10 +764,10 @@ void dmar_msi_unmask(unsigned int irq)
spin_unlock_irqrestore(&iommu->register_lock, flag);
}
-void dmar_msi_mask(unsigned int irq)
+void dmar_msi_mask_desc(struct irq_desc **descp)
{
unsigned long flag;
- struct intel_iommu *iommu = get_irq_data(irq);
+ struct intel_iommu *iommu = get_irq_desc_data(*descp);
/* mask it */
spin_lock_irqsave(&iommu->register_lock, flag);
@@ -777,6 +777,21 @@ void dmar_msi_mask(unsigned int irq)
spin_unlock_irqrestore(&iommu->register_lock, flag);
}
+#ifndef CONFIG_SPARSE_IRQ
+void dmar_msi_unmask(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ dmar_msi_unmask_desc(&desc);
+}
+void dmar_msi_mask(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ dmar_msi_mask_desc(&desc);
+}
+#endif
+
void dmar_msi_write(int irq, struct msi_msg *msg)
{
struct intel_iommu *iommu = get_irq_data(irq);
Index: linux-2.6/include/linux/dmar.h
===================================================================
--- linux-2.6.orig/include/linux/dmar.h
+++ linux-2.6/include/linux/dmar.h
@@ -122,8 +122,15 @@ extern const char *dmar_get_fault_reason
/* Can't use the common MSI interrupt functions
* since DMAR is not a pci device
*/
+#ifdef CONFIG_SPARSE_IRQ
+extern void dmar_msi_unmask_desc(struct irq_desc **descp);
+extern void dmar_msi_mask_desc(struct irq_desc **descp);
+#define dmar_msi_unmask dmar_msi_unmask_desc
+#define dmar_msi_mask dmar_msi_mask_desc
+#else
extern void dmar_msi_unmask(unsigned int irq);
extern void dmar_msi_mask(unsigned int irq);
+#endif
extern void dmar_msi_read(int irq, struct msi_msg *msg);
extern void dmar_msi_write(int irq, struct msi_msg *msg);
extern int dmar_set_interrupt(struct intel_iommu *iommu);
Index: linux-2.6/kernel/irq/manage.c
===================================================================
--- linux-2.6.orig/kernel/irq/manage.c
+++ linux-2.6/kernel/irq/manage.c
@@ -92,14 +92,14 @@ int irq_set_affinity(unsigned int irq, c
#ifdef CONFIG_GENERIC_PENDING_IRQ
if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) {
desc->affinity = cpumask;
- desc->chip->set_affinity(irq, cpumask);
+ desc_chip_set_affinity(irq, desc, cpumask);
} else {
desc->status |= IRQ_MOVE_PENDING;
desc->pending_mask = cpumask;
}
#else
desc->affinity = cpumask;
- desc->chip->set_affinity(irq, cpumask);
+ desc_chip_set_affinity(irq, desc, cpumask);
#endif
desc->status |= IRQ_AFFINITY_SET;
spin_unlock_irqrestore(&desc->lock, flags);
@@ -131,7 +131,7 @@ int do_irq_select_affinity(unsigned int
}
desc->affinity = mask;
- desc->chip->set_affinity(irq, mask);
+ desc_chip_set_affinity(irq, desc, mask);
return 0;
}
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 2/2] irq: move irq_desc according to smp_affinity v2
2008-11-25 3:57 ` [PATCH 1/2] irq: sparseirq enabling v2 Yinghai Lu
@ 2008-11-25 3:58 ` Yinghai Lu
2008-11-26 7:48 ` [PATCH 1/2] irq: sparseirq enabling v2 Ingo Molnar
1 sibling, 0 replies; 20+ messages in thread
From: Yinghai Lu @ 2008-11-25 3:58 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel@vger.kernel.org
impact: new feature move irq_desc with sparseirq
if CONFIG_MOVE_IRQ_DESC is set
make irq_desc to go with affinity aka irq_desc moving etc
call move_irq_desc in irq_complete_move()
legacy irq_desc is not moved, because they are allocated via static array
for logical apic mode, need to add move_desc_in_progress_in_same_domain. otherwise it will not get moved. ==> also could need two phase to get irq_desc moved.
for example: 0xff is old affinity, and need to set 0xf, and then set to 0xf0.
[ or we need to change domain definition to cpus on the same node ? ]
LBSuse:~ # cat /proc/irq/22/smp_affinity
00000000,00000000,00000000,000000ff
LBSuse:~ # echo f > /proc/irq/22/smp_affinity
LBSuse:~ # cat /proc/irq/22/smp_affinity
00000000,00000000,00000000,0000000f
LBSuse:~ # tail /var/log/messages
...
Oct 27 12:35:34 LBSuse kernel: klogd 1.4.1, log source = /proc/kmsg started.
Oct 27 12:35:34 LBSuse kernel: eth0: no IPv6 routers present
LBSuse:~ # echo f0 > /proc/irq/22/smp_affinity
LBSuse:~ # tail /var/log/messages
Oct 27 12:35:34 LBSuse kernel: klogd 1.4.1, log source = /proc/kmsg started.
Oct 27 12:35:34 LBSuse kernel: eth0: no IPv6 routers present
Oct 27 12:36:46 LBSuse kernel: move irq_desc for 22 aka 0x16 to cpu 7 node 1
Oct 27 12:36:46 LBSuse kernel: alloc kstat_irqs on cpu 7 node 1
Oct 27 12:36:46 LBSuse kernel: alloc irq_cfg on cpu 7 node 1
Oct 27 12:36:46 LBSuse kernel: alloc irq_2_pin on cpu 7 node 1
so assume the user space program should update /proc/irq/XX/smp_affinity to 03 or 0f at first on boot
or we change irq_default_affinity ?
for physical apic is much simple
on 4 sockets 16 cores system
irq_desc is moving..
when
# echo 10 > /proc/irq/134483967/smp_affinity
# echo 100 > /proc/irq/134483967/smp_affinity
# echo 1000 > /proc/irq/134483967/smp_affinity
got
Nov 9 21:39:51 LBSuse kernel: move irq_desc for 134483967 aka 0x8040fff to cpu 4 node 1
Nov 9 21:39:51 LBSuse kernel: alloc kstat_irqs on cpu 4 node 1
Nov 9 21:39:51 LBSuse kernel: alloc irq_cfg on cpu 4 node 1
Nov 9 21:40:05 LBSuse kernel: move irq_desc for 134483967 aka 0x8040fff to cpu 8 node 2
Nov 9 21:40:05 LBSuse kernel: alloc kstat_irqs on cpu 8 node 2
Nov 9 21:40:05 LBSuse kernel: alloc irq_cfg on cpu 8 node 2
Nov 9 21:40:18 LBSuse kernel: move irq_desc for 134483967 aka 0x8040fff to cpu 12 node 3
Nov 9 21:40:18 LBSuse kernel: alloc kstat_irqs on cpu 12 node 3
Nov 9 21:40:18 LBSuse kernel: alloc irq_cfg on cpu 12 node 3
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/Kconfig | 9 ++
arch/x86/kernel/io_apic.c | 143 +++++++++++++++++++++++++++++++++++++++++++++-
kernel/irq/handle.c | 111 +++++++++++++++++++++++++++++++++++
3 files changed, 262 insertions(+), 1 deletion(-)
Index: linux-2.6/arch/x86/Kconfig
===================================================================
--- linux-2.6.orig/arch/x86/Kconfig
+++ linux-2.6/arch/x86/Kconfig
@@ -251,6 +251,15 @@ config SPARSE_IRQ
If you don't know what to do here, say Y.
+config MOVE_IRQ_DESC
+ bool "Move irq desc when changing irq smp_affinity"
+ depends on SPARSE_IRQ && SMP
+ default y
+ help
+ This enables moving irq_desc to cpu/node that irq will use handled.
+
+ If you don't know what to do here, say Y.
+
config X86_FIND_SMP_CONFIG
def_bool y
depends on X86_MPPARSE || X86_VOYAGER
Index: linux-2.6/arch/x86/kernel/io_apic.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/io_apic.c
+++ linux-2.6/arch/x86/kernel/io_apic.c
@@ -141,6 +141,9 @@ struct irq_cfg {
unsigned move_cleanup_count;
u8 vector;
u8 move_in_progress : 1;
+#ifdef CONFIG_MOVE_IRQ_DESC
+ u8 move_desc_in_progress_in_same_domain : 1;
+#endif
};
/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
@@ -230,6 +233,122 @@ void arch_init_chip_data(struct irq_desc
}
}
+#ifdef CONFIG_MOVE_IRQ_DESC
+
+static void init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg,
+ int cpu)
+{
+ struct irq_pin_list *old_entry, *head, *tail, *entry;
+
+ cfg->irq_2_pin = NULL;
+ old_entry = old_cfg->irq_2_pin;
+ if (!old_entry)
+ return;
+
+ entry = get_one_free_irq_2_pin(cpu);
+ if (!entry)
+ return;
+
+ entry->apic = old_entry->apic;
+ entry->pin = old_entry->pin;
+ head = entry;
+ tail = entry;
+ old_entry = old_entry->next;
+
+ while (old_entry) {
+ entry = get_one_free_irq_2_pin(cpu);
+ if (!entry) {
+ entry = head;
+ while (entry) {
+ head = entry->next;
+ kfree(entry);
+ entry = head;
+ }
+ /* still use the old one */
+ return;
+ }
+ entry->apic = old_entry->apic;
+ entry->pin = old_entry->pin;
+ tail->next = entry;
+ tail = entry;
+ old_entry = old_entry->next;
+ }
+
+ tail->next = NULL;
+ cfg->irq_2_pin = head;
+}
+
+static void free_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg)
+{
+ struct irq_pin_list *entry, *next;
+
+ if (old_cfg->irq_2_pin == cfg->irq_2_pin)
+ return;
+
+ entry = old_cfg->irq_2_pin;
+
+ while (entry) {
+ next = entry->next;
+ kfree(entry);
+ entry = next;
+ }
+ old_cfg->irq_2_pin = NULL;
+}
+
+void arch_init_copy_chip_data(struct irq_desc *old_desc,
+ struct irq_desc *desc, int cpu)
+{
+ struct irq_cfg *cfg;
+ struct irq_cfg *old_cfg;
+
+ cfg = get_one_free_irq_cfg(cpu);
+
+ if (!cfg)
+ return;
+
+ desc->chip_data = cfg;
+
+ old_cfg = old_desc->chip_data;
+
+ memcpy(cfg, old_cfg, sizeof(struct irq_cfg));
+
+ init_copy_irq_2_pin(old_cfg, cfg, cpu);
+}
+
+static void free_irq_cfg(struct irq_cfg *old_cfg)
+{
+ kfree(old_cfg);
+}
+
+void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc)
+{
+ struct irq_cfg *old_cfg, *cfg;
+
+ old_cfg = old_desc->chip_data;
+ cfg = desc->chip_data;
+
+ if (old_cfg == cfg)
+ return;
+
+ if (old_cfg) {
+ free_irq_2_pin(old_cfg, cfg);
+ free_irq_cfg(old_cfg);
+ old_desc->chip_data = NULL;
+ }
+}
+
+static void set_extra_move_desc(struct irq_desc *desc, cpumask_t mask)
+{
+ struct irq_cfg *cfg = desc->chip_data;
+
+ if (!cfg->move_in_progress) {
+ /* it means that domain is not changed */
+ if (!cpus_intersects(desc->affinity, mask))
+ cfg->move_desc_in_progress_in_same_domain = 1;
+ }
+}
+#endif
+
#else
static struct irq_cfg *irq_cfg(unsigned int irq)
{
@@ -238,9 +357,11 @@ static struct irq_cfg *irq_cfg(unsigned
#endif
+#ifndef CONFIG_MOVE_IRQ_DESC
static inline void set_extra_move_desc(struct irq_desc *desc, cpumask_t mask)
{
}
+#endif
struct io_apic {
unsigned int index;
@@ -2358,14 +2479,34 @@ static void irq_complete_move(struct irq
struct irq_cfg *cfg = desc->chip_data;
unsigned vector, me;
- if (likely(!cfg->move_in_progress))
+ if (likely(!cfg->move_in_progress)) {
+#ifdef CONFIG_MOVE_IRQ_DESC
+ if (likely(!cfg->move_desc_in_progress_in_same_domain))
+ return;
+
+ /* domain is not change, but affinity is changed */
+ me = smp_processor_id();
+ if (cpu_isset(me, desc->affinity)) {
+ *descp = desc = move_irq_desc(desc, me);
+ /* get the new one */
+ cfg = desc->chip_data;
+ cfg->move_desc_in_progress_in_same_domain = 0;
+ }
+#endif
return;
+ }
vector = ~get_irq_regs()->orig_ax;
me = smp_processor_id();
if ((vector == cfg->vector) && cpu_isset(me, cfg->domain)) {
cpumask_t cleanup_mask;
+#ifdef CONFIG_MOVE_IRQ_DESC
+ *descp = desc = move_irq_desc(desc, me);
+ /* get the new one */
+ cfg = desc->chip_data;
+#endif
+
cpus_and(cleanup_mask, cfg->old_domain, cpu_online_map);
cfg->move_cleanup_count = cpus_weight(cleanup_mask);
send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
Index: linux-2.6/kernel/irq/handle.c
===================================================================
--- linux-2.6.orig/kernel/irq/handle.c
+++ linux-2.6/kernel/irq/handle.c
@@ -90,6 +90,32 @@ static void init_kstat_irqs(struct irq_d
desc->kstat_irqs = (unsigned int *)ptr;
}
+#ifdef CONFIG_MOVE_IRQ_DESC
+static void init_copy_kstat_irqs(struct irq_desc *old_desc, struct irq_desc *desc,
+ int cpu, int nr)
+{
+ unsigned long bytes;
+
+ init_kstat_irqs(desc, cpu, nr);
+
+ if (desc->kstat_irqs != old_desc->kstat_irqs) {
+ /* Compute how many bytes we need per irq and allocate them */
+ bytes = nr * sizeof(unsigned int);
+
+ memcpy(desc->kstat_irqs, old_desc->kstat_irqs, bytes);
+ }
+}
+
+static void free_kstat_irqs(struct irq_desc *old_desc, struct irq_desc *desc)
+{
+ if (old_desc->kstat_irqs == desc->kstat_irqs)
+ return;
+
+ kfree(old_desc->kstat_irqs);
+ old_desc->kstat_irqs = NULL;
+}
+#endif
+
void __attribute__((weak)) arch_init_chip_data(struct irq_desc *desc, int cpu)
{
}
@@ -110,6 +136,23 @@ static void init_one_irq_desc(int irq, s
arch_init_chip_data(desc, cpu);
}
+#ifdef CONFIG_MOVE_IRQ_DESC
+static void init_copy_one_irq_desc(int irq, struct irq_desc *old_desc,
+ struct irq_desc *desc, int cpu)
+{
+ memcpy(desc, old_desc, sizeof(struct irq_desc));
+ desc->cpu = cpu;
+ lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids);
+ arch_init_copy_chip_data(old_desc, desc, cpu);
+}
+
+static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc)
+{
+ free_kstat_irqs(old_desc, desc);
+ arch_free_chip_data(old_desc, desc);
+}
+#endif
/*
* Protect the sparse_irqs:
*/
@@ -212,6 +255,74 @@ out_unlock:
return desc;
}
+#ifdef CONFIG_MOVE_IRQ_DESC
+static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc,
+ int cpu)
+{
+ struct irq_desc *desc;
+ unsigned int irq;
+ unsigned long flags;
+ int node;
+
+ irq = old_desc->irq;
+
+ spin_lock_irqsave(&sparse_irq_lock, flags);
+
+ /* We have to check it to avoid races with another CPU */
+ desc = irq_desc_ptrs[irq];
+
+ if (desc && old_desc != desc)
+ goto out_unlock;
+
+ node = cpu_to_node(cpu);
+ desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " move irq_desc for %d to cpu %d node %d\n",
+ irq, cpu, node);
+ if (!desc) {
+ printk(KERN_ERR "can not get new irq_desc for moving\n");
+ /* still use old one */
+ desc = old_desc;
+ goto out_unlock;
+ }
+ init_copy_one_irq_desc(irq, old_desc, desc, cpu);
+
+ irq_desc_ptrs[irq] = desc;
+ list_replace_rcu(&old_desc->list, &desc->list);
+
+ /* free the old one */
+ free_one_irq_desc(old_desc, desc);
+ kfree(old_desc);
+
+out_unlock:
+ spin_unlock_irqrestore(&sparse_irq_lock, flags);
+
+ return desc;
+}
+
+struct irq_desc *move_irq_desc(struct irq_desc *desc, int cpu)
+{
+ int old_cpu;
+ int node, old_node;
+
+ /* those all static, do move them */
+ if (desc->irq < NR_IRQS_LEGACY)
+ return desc;
+
+ old_cpu = desc->cpu;
+ printk(KERN_DEBUG "try to move irq_desc from cpu %d to %d\n", old_cpu, cpu);
+ if (old_cpu != cpu) {
+ node = cpu_to_node(cpu);
+ old_node = cpu_to_node(old_cpu);
+ if (old_node != node)
+ desc = __real_move_irq_desc(desc, cpu);
+ else
+ desc->cpu = cpu;
+ }
+
+ return desc;
+}
+#endif
+
#else
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] irq: sparseirq enabling v2
2008-11-25 3:57 ` [PATCH 1/2] irq: sparseirq enabling v2 Yinghai Lu
2008-11-25 3:58 ` [PATCH 2/2] irq: move irq_desc according to smp_affinity v2 Yinghai Lu
@ 2008-11-26 7:48 ` Ingo Molnar
2008-11-26 8:02 ` Yinghai Lu
1 sibling, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2008-11-26 7:48 UTC (permalink / raw)
To: Yinghai Lu
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
* Yinghai Lu <yinghai@kernel.org> wrote:
> impact: new feature sparseirq
> v2: use pointer array instead of hash
ok, this looks pretty good!
A few details:
> +#ifdef CONFIG_SPARSE_IRQ
> +#define set_ioapic_affinity_irq set_ioapic_affinity_irq_desc
> +#else
> +static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
> +{
> + struct irq_desc *desc;
> +
> + desc = irq_to_desc(irq);
> +
> + set_ioapic_affinity_irq_desc(desc, mask);
> +}
> +#endif
i think this distinction can now go away?.
> #ifdef CONFIG_INTR_REMAP
> +#ifdef CONFIG_SPARSE_IRQ
> +static void ack_x2apic_level_desc(struct irq_desc **descp)
> +{
> + ack_x2APIC_irq();
> +}
> +
> +static void ack_x2apic_edge_desc(struct irq_desc **descp)
> +{
> + ack_x2APIC_irq();
> +}
> +
> +#define ack_x2apic_level ack_x2apic_level_desc
> +#define ack_x2apic_edge ack_x2apic_edge_desc
> +#else
is this needed now?
> +#ifdef CONFIG_SMP
> + move_native_irq_desc(descp);
> +#endif
please hide this #ifdef in a header.
> +# ifdef CONFIG_SMP
> + move_masked_irq_desc(descp);
> +# endif
ditto.
> +#ifdef CONFIG_SPARSE_IRQ
> +#define ack_apic_edge ack_apic_edge_desc
> +#define ack_apic_level ack_apic_level_desc
> +#else
> +static void ack_apic_edge(unsigned int irq)
> +{
> + struct irq_desc *desc = irq_to_desc(irq);
> +
> + ack_apic_edge_desc(&desc);
> +}
> +static void ack_apic_level(unsigned int irq)
> +{
> + struct irq_desc *desc = irq_to_desc(irq);
> +
> + ack_apic_level_desc(&desc);
> +}
> +#endif
distinction needed?
>
> +#ifdef CONFIG_SPARSE_IRQ
> +#define mask_lapic_irq mask_lapic_irq_desc
> +#define unmask_lapic_irq unmask_lapic_irq_desc
> +#define ack_lapic_irq ack_lapic_irq_desc
> +#else
> +static void mask_lapic_irq(unsigned int irq)
> +{
> + struct irq_desc *desc = irq_to_desc(irq);
> +
> + mask_lapic_irq_desc(&desc);
> +}
> +static void unmask_lapic_irq(unsigned int irq)
> +{
> + struct irq_desc *desc = irq_to_desc(irq);
> +
> + unmask_lapic_irq_desc(&desc);
> +}
> +static void ack_lapic_irq(unsigned int irq)
> +{
> + struct irq_desc *desc = irq_to_desc(irq);
> +
> + ack_lapic_irq_desc(&desc);
> +}
> +#endif
same.
> +#ifdef CONFIG_SPARSE_IRQ
> + for (new = irq_want; new < NR_IRQS; new++)
> +#else
> + for (new = irq_want; new > 0; new--)
> +#endif
this assymetry seems unnecessary too now i think.
> +#ifdef CONFIG_SPARSE_IRQ
> + irq_want = nr_irqs;
> +#else
> + irq_want = NR_IRQS - 1;
> +#endif
ditto. I think we dont want 'nr_irqs' anymore - just remain with
NR_IRQS, right?
> +#ifdef CONFIG_SPARSE_IRQ
> +#define set_msi_irq_affinity set_msi_irq_affinity_desc
> +#else
> +static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
> +{
> + struct irq_desc *desc = irq_to_desc(irq);
>
> + set_msi_irq_affinity_desc(desc, mask);
> +}
> +#endif
This ifdef seems unnecessary too.
Plus in a few more places.
Please look at _every_ #ifdef or #if in your patch in a .c file and
ask the question: can we somehow in some way eliminate it and convert
it to some nice inline somewhere or eliminate it via some other trick?
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] irq: sparseirq enabling v2
2008-11-26 7:48 ` [PATCH 1/2] irq: sparseirq enabling v2 Ingo Molnar
@ 2008-11-26 8:02 ` Yinghai Lu
2008-11-26 8:17 ` Ingo Molnar
0 siblings, 1 reply; 20+ messages in thread
From: Yinghai Lu @ 2008-11-26 8:02 UTC (permalink / raw)
To: Ingo Molnar
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
Ingo Molnar wrote:
> * Yinghai Lu <yinghai@kernel.org> wrote:
>
>> impact: new feature sparseirq
>
>> v2: use pointer array instead of hash
>
> ok, this looks pretty good!
>
> A few details:
>
>> +#ifdef CONFIG_SPARSE_IRQ
>> +#define set_ioapic_affinity_irq set_ioapic_affinity_irq_desc
>> +#else
>> +static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
>> +{
>> + struct irq_desc *desc;
>> +
>> + desc = irq_to_desc(irq);
>> +
>> + set_ioapic_affinity_irq_desc(desc, mask);
>> +}
>> +#endif
>
> i think this distinction can now go away?.
i may miss sth in your previous mail. you said we may put full hash back later, so need keep those change to avoid lookup costs later.
also if we need move_irq_desc between node?
>
...
>
>> +#ifdef CONFIG_SPARSE_IRQ
>> + for (new = irq_want; new < NR_IRQS; new++)
>> +#else
>> + for (new = irq_want; new > 0; new--)
>> +#endif
>
> this assymetry seems unnecessary too now i think.
>
>> +#ifdef CONFIG_SPARSE_IRQ
>> + irq_want = nr_irqs;
>> +#else
>> + irq_want = NR_IRQS - 1;
>> +#endif
>
> ditto. I think we dont want 'nr_irqs' anymore - just remain with
> NR_IRQS, right?
>
nr_irqs is the total GSI number when sparseirq is used. so MSI irq will start from that.
...
>
> Plus in a few more places.
>
> Please look at _every_ #ifdef or #if in your patch in a .c file and
> ask the question: can we somehow in some way eliminate it and convert
> it to some nice inline somewhere or eliminate it via some other trick?
will
YH
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] irq: sparseirq enabling v2
2008-11-26 8:02 ` Yinghai Lu
@ 2008-11-26 8:17 ` Ingo Molnar
2008-11-26 18:33 ` Yinghai Lu
2008-11-27 2:26 ` [PATCH 1/2] irq: sparseirq enabling v3 Yinghai Lu
0 siblings, 2 replies; 20+ messages in thread
From: Ingo Molnar @ 2008-11-26 8:17 UTC (permalink / raw)
To: Yinghai Lu
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
* Yinghai Lu <yinghai@kernel.org> wrote:
> Ingo Molnar wrote:
> > * Yinghai Lu <yinghai@kernel.org> wrote:
> >
> >> impact: new feature sparseirq
> >
> >> v2: use pointer array instead of hash
> >
> > ok, this looks pretty good!
> >
> > A few details:
> >
> >> +#ifdef CONFIG_SPARSE_IRQ
> >> +#define set_ioapic_affinity_irq set_ioapic_affinity_irq_desc
> >> +#else
> >> +static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
> >> +{
> >> + struct irq_desc *desc;
> >> +
> >> + desc = irq_to_desc(irq);
> >> +
> >> + set_ioapic_affinity_irq_desc(desc, mask);
> >> +}
> >> +#endif
> >
> > i think this distinction can now go away?.
>
> i may miss sth in your previous mail. you said we may put full hash
> back later, so need keep those change to avoid lookup costs later.
full hash as in no NR_IRQS limit?
I dont think that's a good idea even in the far future: we can always
make NR_IRQS large enough, and turn the current array-of-pointers into
array-of-arrays-of-pointers scheme or an outright hash - but without
losing the fundamental abstraction that it's a 0..NR_IRQS array (just
accessed abstractly).
> also if we need move_irq_desc between node?
i'm not sure i understand. Do you mean we should deallocate and
reallocate the irq_desc to another node?
> >> +#ifdef CONFIG_SPARSE_IRQ
> >> + irq_want = nr_irqs;
> >> +#else
> >> + irq_want = NR_IRQS - 1;
> >> +#endif
> >
> > ditto. I think we dont want 'nr_irqs' anymore - just remain with
> > NR_IRQS, right?
> >
>
> nr_irqs is the total GSI number when sparseirq is used. so MSI irq
> will start from that. ...
ah, okay. I think we should renumber MSIs to the scheme Thomas
suggested, independently of CONFIG_SPARSE_IRQ.
CONFIG_SPARSE_IRQ should _only_ impact the irq_desc[] data structure:
it turns from a flat C array of irq_desc into an array of irq_desc
pointers.
No other semantic changes. Possibly all hidden away completely in the
irq-desc-array accessors.
> > Plus in a few more places.
> >
> > Please look at _every_ #ifdef or #if in your patch in a .c file
> > and ask the question: can we somehow in some way eliminate it and
> > convert it to some nice inline somewhere or eliminate it via some
> > other trick?
>
> will
thanks!
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] irq: sparseirq enabling v2
2008-11-26 8:17 ` Ingo Molnar
@ 2008-11-26 18:33 ` Yinghai Lu
2008-11-27 2:26 ` [PATCH 1/2] irq: sparseirq enabling v3 Yinghai Lu
1 sibling, 0 replies; 20+ messages in thread
From: Yinghai Lu @ 2008-11-26 18:33 UTC (permalink / raw)
To: Ingo Molnar
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
Ingo Molnar wrote:
> * Yinghai Lu <yinghai@kernel.org> wrote:
>
>> Ingo Molnar wrote:
>>> * Yinghai Lu <yinghai@kernel.org> wrote:
>>>
>>>> impact: new feature sparseirq
>>>> v2: use pointer array instead of hash
>>> ok, this looks pretty good!
>>>
>>> A few details:
>>>
>>>> +#ifdef CONFIG_SPARSE_IRQ
>>>> +#define set_ioapic_affinity_irq set_ioapic_affinity_irq_desc
>>>> +#else
>>>> +static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
>>>> +{
>>>> + struct irq_desc *desc;
>>>> +
>>>> + desc = irq_to_desc(irq);
>>>> +
>>>> + set_ioapic_affinity_irq_desc(desc, mask);
>>>> +}
>>>> +#endif
>>> i think this distinction can now go away?.
>> i may miss sth in your previous mail. you said we may put full hash
>> back later, so need keep those change to avoid lookup costs later.
>
> full hash as in no NR_IRQS limit?
32 bit irqs.
>
> I dont think that's a good idea even in the far future: we can always
> make NR_IRQS large enough, and turn the current array-of-pointers into
> array-of-arrays-of-pointers scheme or an outright hash - but without
> losing the fundamental abstraction that it's a 0..NR_IRQS array (just
> accessed abstractly).
>
>> also if we need move_irq_desc between node?
>
> i'm not sure i understand. Do you mean we should deallocate and
> reallocate the irq_desc to another node?
yes. the patch 2/2. [PATCH 2/2] irq: move irq_desc according to smp_affinity v2
>
>>>> +#ifdef CONFIG_SPARSE_IRQ
>>>> + irq_want = nr_irqs;
>>>> +#else
>>>> + irq_want = NR_IRQS - 1;
>>>> +#endif
>>> ditto. I think we dont want 'nr_irqs' anymore - just remain with
>>> NR_IRQS, right?
>>>
>> nr_irqs is the total GSI number when sparseirq is used. so MSI irq
>> will start from that. ...
>
> ah, okay. I think we should renumber MSIs to the scheme Thomas
> suggested, independently of CONFIG_SPARSE_IRQ.
good, will add one local nr_irqs_gsi there..., and not touch nr_irqs.
>
> CONFIG_SPARSE_IRQ should _only_ impact the irq_desc[] data structure:
> it turns from a flat C array of irq_desc into an array of irq_desc
> pointers.
>
> No other semantic changes. Possibly all hidden away completely in the
> irq-desc-array accessors.
YH
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 1/2] irq: sparseirq enabling v3
2008-11-26 8:17 ` Ingo Molnar
2008-11-26 18:33 ` Yinghai Lu
@ 2008-11-27 2:26 ` Yinghai Lu
2008-11-27 2:26 ` [PATCH 2/2] irq: move irq_desc according to smp_affinity v3 Yinghai Lu
2008-11-28 16:34 ` [PATCH 1/2] irq: sparseirq enabling v3 Ingo Molnar
1 sibling, 2 replies; 20+ messages in thread
From: Yinghai Lu @ 2008-11-27 2:26 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel@vger.kernel.org
impact: new feature sparseirq
add some kind of hash table as Ingo suggesting.
remove dyna_array
when sparse_irq is used (CONFIG_SPARSE_IRQ), use kzalloc_node to get irq_desc, irq_cfg
use desc->chip_data for x86 to store irq_cfg
also prepare
need to add struct (irq_desc **descp) to ack_edge/level to make sure desc get updated
try to pass desc cfg as more as possible to avoid list looking up.
seperate move_irq_desc to another patch
v2: use pointer array instead of hash
v3: remove code for passing desc
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/Kconfig | 10
arch/x86/include/asm/io_apic.h | 2
arch/x86/include/asm/irq_vectors.h | 11
arch/x86/kernel/io_apic.c | 634 ++++++++++++++++++++++---------------
arch/x86/kernel/irq.c | 24 +
arch/x86/kernel/irq_32.c | 2
arch/x86/kernel/irq_64.c | 2
arch/x86/kernel/irqinit_32.c | 3
arch/x86/kernel/irqinit_64.c | 3
arch/x86/kernel/setup.c | 2
drivers/char/random.c | 31 +
drivers/pci/intr_remapping.c | 76 ++++
drivers/pci/msi.c | 55 ++-
drivers/xen/events.c | 9
fs/proc/interrupts.c | 18 +
fs/proc/stat.c | 17
include/linux/interrupt.h | 2
include/linux/irq.h | 67 +++
include/linux/irqnr.h | 15
include/linux/kernel_stat.h | 14
include/linux/msi.h | 3
init/main.c | 11
kernel/irq/autoprobe.c | 10
kernel/irq/chip.c | 3
kernel/irq/handle.c | 187 ++++++++++
kernel/irq/proc.c | 3
kernel/irq/spurious.c | 4
27 files changed, 900 insertions(+), 318 deletions(-)
Index: linux-2.6/arch/x86/Kconfig
===================================================================
--- linux-2.6.orig/arch/x86/Kconfig
+++ linux-2.6/arch/x86/Kconfig
@@ -241,6 +241,16 @@ config X86_HAS_BOOT_CPU_ID
def_bool y
depends on X86_VOYAGER
+config SPARSE_IRQ
+ bool "Support sparse irq numbering"
+ depends on PCI_MSI || HT_IRQ
+ default y
+ help
+ This enables support for sparse irq, esp for msi/msi-x. You may need
+ if you have lots of cards supports msi-x installed.
+
+ If you don't know what to do here, say Y.
+
config X86_FIND_SMP_CONFIG
def_bool y
depends on X86_MPPARSE || X86_VOYAGER
Index: linux-2.6/arch/x86/kernel/io_apic.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/io_apic.c
+++ linux-2.6/arch/x86/kernel/io_apic.c
@@ -108,8 +108,33 @@ static int __init parse_noapic(char *str
early_param("noapic", parse_noapic);
struct irq_pin_list;
+
+/*
+ * This is performance-critical, we want to do it O(1)
+ *
+ * the indexing order of this array favors 1:1 mappings
+ * between pins and IRQs.
+ */
+
+struct irq_pin_list {
+ int apic, pin;
+ struct irq_pin_list *next;
+};
+
+static struct irq_pin_list *get_one_free_irq_2_pin(int cpu)
+{
+ struct irq_pin_list *pin;
+ int node;
+
+ node = cpu_to_node(cpu);
+
+ pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_2_pin on cpu %d node %d\n", cpu, node);
+
+ return pin;
+}
+
struct irq_cfg {
- unsigned int irq;
struct irq_pin_list *irq_2_pin;
cpumask_t domain;
cpumask_t old_domain;
@@ -119,81 +144,102 @@ struct irq_cfg {
};
/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_cfg irq_cfgx[] = {
+#else
static struct irq_cfg irq_cfgx[NR_IRQS] = {
- [0] = { .irq = 0, .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
- [1] = { .irq = 1, .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
- [2] = { .irq = 2, .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
- [3] = { .irq = 3, .domain = CPU_MASK_ALL, .vector = IRQ3_VECTOR, },
- [4] = { .irq = 4, .domain = CPU_MASK_ALL, .vector = IRQ4_VECTOR, },
- [5] = { .irq = 5, .domain = CPU_MASK_ALL, .vector = IRQ5_VECTOR, },
- [6] = { .irq = 6, .domain = CPU_MASK_ALL, .vector = IRQ6_VECTOR, },
- [7] = { .irq = 7, .domain = CPU_MASK_ALL, .vector = IRQ7_VECTOR, },
- [8] = { .irq = 8, .domain = CPU_MASK_ALL, .vector = IRQ8_VECTOR, },
- [9] = { .irq = 9, .domain = CPU_MASK_ALL, .vector = IRQ9_VECTOR, },
- [10] = { .irq = 10, .domain = CPU_MASK_ALL, .vector = IRQ10_VECTOR, },
- [11] = { .irq = 11, .domain = CPU_MASK_ALL, .vector = IRQ11_VECTOR, },
- [12] = { .irq = 12, .domain = CPU_MASK_ALL, .vector = IRQ12_VECTOR, },
- [13] = { .irq = 13, .domain = CPU_MASK_ALL, .vector = IRQ13_VECTOR, },
- [14] = { .irq = 14, .domain = CPU_MASK_ALL, .vector = IRQ14_VECTOR, },
- [15] = { .irq = 15, .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
+#endif
+ [0] = { .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
+ [1] = { .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
+ [2] = { .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
+ [3] = { .domain = CPU_MASK_ALL, .vector = IRQ3_VECTOR, },
+ [4] = { .domain = CPU_MASK_ALL, .vector = IRQ4_VECTOR, },
+ [5] = { .domain = CPU_MASK_ALL, .vector = IRQ5_VECTOR, },
+ [6] = { .domain = CPU_MASK_ALL, .vector = IRQ6_VECTOR, },
+ [7] = { .domain = CPU_MASK_ALL, .vector = IRQ7_VECTOR, },
+ [8] = { .domain = CPU_MASK_ALL, .vector = IRQ8_VECTOR, },
+ [9] = { .domain = CPU_MASK_ALL, .vector = IRQ9_VECTOR, },
+ [10] = { .domain = CPU_MASK_ALL, .vector = IRQ10_VECTOR, },
+ [11] = { .domain = CPU_MASK_ALL, .vector = IRQ11_VECTOR, },
+ [12] = { .domain = CPU_MASK_ALL, .vector = IRQ12_VECTOR, },
+ [13] = { .domain = CPU_MASK_ALL, .vector = IRQ13_VECTOR, },
+ [14] = { .domain = CPU_MASK_ALL, .vector = IRQ14_VECTOR, },
+ [15] = { .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
};
-#define for_each_irq_cfg(irq, cfg) \
- for (irq = 0, cfg = irq_cfgx; irq < nr_irqs; irq++, cfg++)
-
-static struct irq_cfg *irq_cfg(unsigned int irq)
+void __init arch_early_irq_init(void)
{
- return irq < nr_irqs ? irq_cfgx + irq : NULL;
+ struct irq_cfg *cfg;
+ struct irq_desc *desc;
+ int count;
+ int i;
+#ifdef CONFIG_SPARSE_IRQ
+ int count_desc = NR_IRQS_LEGACY;
+#else
+ int count_desc = NR_IRQS;
+#endif
+
+ cfg = irq_cfgx;
+ count = ARRAY_SIZE(irq_cfgx);
+
+ BUG_ON(count > count_desc);
+
+ for (i = 0; i < count; i++) {
+ desc = irq_to_desc(i);
+ desc->chip_data = &cfg[i];
+ }
}
-static struct irq_cfg *irq_cfg_alloc(unsigned int irq)
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_cfg *irq_cfg(unsigned int irq)
{
- return irq_cfg(irq);
+ struct irq_cfg *cfg = NULL;
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+ if (desc)
+ cfg = desc->chip_data;
+
+ return cfg;
}
-/*
- * Rough estimation of how many shared IRQs there are, can be changed
- * anytime.
- */
-#define MAX_PLUS_SHARED_IRQS NR_IRQS
-#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
+static struct irq_cfg *get_one_free_irq_cfg(int cpu)
+{
+ struct irq_cfg *cfg;
+ int node;
-/*
- * This is performance-critical, we want to do it O(1)
- *
- * the indexing order of this array favors 1:1 mappings
- * between pins and IRQs.
- */
+ node = cpu_to_node(cpu);
-struct irq_pin_list {
- int apic, pin;
- struct irq_pin_list *next;
-};
+ cfg = kzalloc_node(sizeof(*cfg), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_cfg on cpu %d node %d\n", cpu, node);
-static struct irq_pin_list irq_2_pin_head[PIN_MAP_SIZE];
-static struct irq_pin_list *irq_2_pin_ptr;
+ return cfg;
+}
-static void __init irq_2_pin_init(void)
+void arch_init_chip_data(struct irq_desc *desc, int cpu)
{
- struct irq_pin_list *pin = irq_2_pin_head;
- int i;
-
- for (i = 1; i < PIN_MAP_SIZE; i++)
- pin[i-1].next = &pin[i];
+ struct irq_cfg *cfg;
- irq_2_pin_ptr = &pin[0];
+ cfg = desc->chip_data;
+ if (!cfg) {
+ desc->chip_data = get_one_free_irq_cfg(cpu);
+ if (!desc->chip_data) {
+ printk(KERN_ERR "can not alloc irq_cfg\n");
+ BUG_ON(1);
+ }
+ }
}
-static struct irq_pin_list *get_one_free_irq_2_pin(void)
+#else
+static struct irq_cfg *irq_cfg(unsigned int irq)
{
- struct irq_pin_list *pin = irq_2_pin_ptr;
+ return irq < nr_irqs ? irq_cfgx + irq : NULL;
+}
- if (!pin)
- panic("can not get more irq_2_pin\n");
+#endif
- irq_2_pin_ptr = pin->next;
- pin->next = NULL;
- return pin;
+static inline void set_extra_move_desc(struct irq_desc *desc, cpumask_t mask)
+{
}
struct io_apic {
@@ -237,11 +283,10 @@ static inline void io_apic_modify(unsign
writel(value, &io_apic->data);
}
-static bool io_apic_level_ack_pending(unsigned int irq)
+static bool io_apic_level_ack_pending(struct irq_cfg *cfg)
{
struct irq_pin_list *entry;
unsigned long flags;
- struct irq_cfg *cfg = irq_cfg(irq);
spin_lock_irqsave(&ioapic_lock, flags);
entry = cfg->irq_2_pin;
@@ -323,13 +368,12 @@ static void ioapic_mask_entry(int apic,
}
#ifdef CONFIG_SMP
-static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, u8 vector)
+static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg)
{
int apic, pin;
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
+ u8 vector = cfg->vector;
- cfg = irq_cfg(irq);
entry = cfg->irq_2_pin;
for (;;) {
unsigned int reg;
@@ -359,24 +403,27 @@ static void __target_IO_APIC_irq(unsigne
}
}
-static int assign_irq_vector(int irq, cpumask_t mask);
+static int assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask);
-static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+static void set_ioapic_affinity_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
unsigned long flags;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- cfg = irq_cfg(irq);
- if (assign_irq_vector(irq, mask))
+ irq = desc->irq;
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
/*
@@ -384,12 +431,20 @@ static void set_ioapic_affinity_irq(unsi
*/
dest = SET_APIC_LOGICAL_ID(dest);
- desc = irq_to_desc(irq);
spin_lock_irqsave(&ioapic_lock, flags);
- __target_IO_APIC_irq(irq, dest, cfg->vector);
+ __target_IO_APIC_irq(irq, dest, cfg);
desc->affinity = mask;
spin_unlock_irqrestore(&ioapic_lock, flags);
}
+
+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ set_ioapic_affinity_irq_desc(desc, mask);
+}
#endif /* CONFIG_SMP */
/*
@@ -397,16 +452,18 @@ static void set_ioapic_affinity_irq(unsi
* shared ISA-space IRQs, so we have to support them. We are super
* fast in the common case, and fast for shared ISA-space IRQs.
*/
-static void add_pin_to_irq(unsigned int irq, int apic, int pin)
+static void add_pin_to_irq_cpu(struct irq_cfg *cfg, int cpu, int apic, int pin)
{
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
- /* first time to refer irq_cfg, so with new */
- cfg = irq_cfg_alloc(irq);
entry = cfg->irq_2_pin;
if (!entry) {
- entry = get_one_free_irq_2_pin();
+ entry = get_one_free_irq_2_pin(cpu);
+ if (!entry) {
+ printk(KERN_ERR "can not alloc irq_2_pin to add %d - %d\n",
+ apic, pin);
+ return;
+ }
cfg->irq_2_pin = entry;
entry->apic = apic;
entry->pin = pin;
@@ -421,7 +478,7 @@ static void add_pin_to_irq(unsigned int
entry = entry->next;
}
- entry->next = get_one_free_irq_2_pin();
+ entry->next = get_one_free_irq_2_pin(cpu);
entry = entry->next;
entry->apic = apic;
entry->pin = pin;
@@ -430,11 +487,10 @@ static void add_pin_to_irq(unsigned int
/*
* Reroute an IRQ to a different pin.
*/
-static void __init replace_pin_at_irq(unsigned int irq,
+static void __init replace_pin_at_irq_cpu(struct irq_cfg *cfg, int cpu,
int oldapic, int oldpin,
int newapic, int newpin)
{
- struct irq_cfg *cfg = irq_cfg(irq);
struct irq_pin_list *entry = cfg->irq_2_pin;
int replaced = 0;
@@ -451,18 +507,16 @@ static void __init replace_pin_at_irq(un
/* why? call replace before add? */
if (!replaced)
- add_pin_to_irq(irq, newapic, newpin);
+ add_pin_to_irq_cpu(cfg, cpu, newapic, newpin);
}
-static inline void io_apic_modify_irq(unsigned int irq,
+static inline void io_apic_modify_irq(struct irq_cfg *cfg,
int mask_and, int mask_or,
void (*final)(struct irq_pin_list *entry))
{
int pin;
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
- cfg = irq_cfg(irq);
for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) {
unsigned int reg;
pin = entry->pin;
@@ -475,9 +529,9 @@ static inline void io_apic_modify_irq(un
}
}
-static void __unmask_IO_APIC_irq(unsigned int irq)
+static void __unmask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED, 0, NULL);
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED, 0, NULL);
}
#ifdef CONFIG_X86_64
@@ -492,47 +546,64 @@ void io_apic_sync(struct irq_pin_list *e
readl(&io_apic->data);
}
-static void __mask_IO_APIC_irq(unsigned int irq)
+static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
+ io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
}
#else /* CONFIG_X86_32 */
-static void __mask_IO_APIC_irq(unsigned int irq)
+static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, NULL);
+ io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, NULL);
}
-static void __mask_and_edge_IO_APIC_irq(unsigned int irq)
+static void __mask_and_edge_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_LEVEL_TRIGGER,
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_LEVEL_TRIGGER,
IO_APIC_REDIR_MASKED, NULL);
}
-static void __unmask_and_level_IO_APIC_irq(unsigned int irq)
+static void __unmask_and_level_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED,
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED,
IO_APIC_REDIR_LEVEL_TRIGGER, NULL);
}
#endif /* CONFIG_X86_32 */
-static void mask_IO_APIC_irq (unsigned int irq)
+static void mask_IO_APIC_irq_desc(struct irq_desc *desc)
{
+ struct irq_cfg *cfg = desc->chip_data;
unsigned long flags;
+ BUG_ON(!cfg);
+
spin_lock_irqsave(&ioapic_lock, flags);
- __mask_IO_APIC_irq(irq);
+ __mask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
-static void unmask_IO_APIC_irq (unsigned int irq)
+static void unmask_IO_APIC_irq_desc(struct irq_desc *desc)
{
+ struct irq_cfg *cfg = desc->chip_data;
unsigned long flags;
spin_lock_irqsave(&ioapic_lock, flags);
- __unmask_IO_APIC_irq(irq);
+ __unmask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
+static void mask_IO_APIC_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_IO_APIC_irq_desc(desc);
+}
+static void unmask_IO_APIC_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_IO_APIC_irq_desc(desc);
+}
+
static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
{
struct IO_APIC_route_entry entry;
@@ -809,7 +880,7 @@ EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector
*/
static int EISA_ELCR(unsigned int irq)
{
- if (irq < 16) {
+ if (irq < NR_IRQS_LEGACY) {
unsigned int port = 0x4d0 + (irq >> 3);
return (inb(port) >> (irq & 7)) & 1;
}
@@ -1034,7 +1105,7 @@ void unlock_vector_lock(void)
spin_unlock(&vector_lock);
}
-static int __assign_irq_vector(int irq, cpumask_t mask)
+static int __assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
{
/*
* NOTE! The local APIC isn't very good at handling
@@ -1050,16 +1121,13 @@ static int __assign_irq_vector(int irq,
static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
unsigned int old_vector;
int cpu;
- struct irq_cfg *cfg;
- cfg = irq_cfg(irq);
+ if ((cfg->move_in_progress) || cfg->move_cleanup_count)
+ return -EBUSY;
/* Only try and allocate irqs on cpus that are present */
cpus_and(mask, mask, cpu_online_map);
- if ((cfg->move_in_progress) || cfg->move_cleanup_count)
- return -EBUSY;
-
old_vector = cfg->vector;
if (old_vector) {
cpumask_t tmp;
@@ -1113,24 +1181,22 @@ next:
return -ENOSPC;
}
-static int assign_irq_vector(int irq, cpumask_t mask)
+static int assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
{
int err;
unsigned long flags;
spin_lock_irqsave(&vector_lock, flags);
- err = __assign_irq_vector(irq, mask);
+ err = __assign_irq_vector(irq, cfg, mask);
spin_unlock_irqrestore(&vector_lock, flags);
return err;
}
-static void __clear_irq_vector(int irq)
+static void __clear_irq_vector(int irq, struct irq_cfg *cfg)
{
- struct irq_cfg *cfg;
cpumask_t mask;
int cpu, vector;
- cfg = irq_cfg(irq);
BUG_ON(!cfg->vector);
vector = cfg->vector;
@@ -1162,14 +1228,16 @@ void __setup_vector_irq(int cpu)
/* This function must be called with vector_lock held */
int irq, vector;
struct irq_cfg *cfg;
+ struct irq_desc *desc;
/* Mark the inuse vectors */
- for_each_irq_cfg(irq, cfg) {
+ for_each_irq_desc(irq, desc) {
+ cfg = desc->chip_data;
if (!cpu_isset(cpu, cfg->domain))
continue;
vector = cfg->vector;
per_cpu(vector_irq, cpu)[vector] = irq;
- }
+ } end_for_each_irq_desc();
/* Mark the free vectors */
for (vector = 0; vector < NR_VECTORS; ++vector) {
irq = per_cpu(vector_irq, cpu)[vector];
@@ -1215,11 +1283,8 @@ static inline int IO_APIC_irq_trigger(in
}
#endif
-static void ioapic_register_intr(int irq, unsigned long trigger)
+static void ioapic_register_intr(int irq, struct irq_desc *desc, unsigned long trigger)
{
- struct irq_desc *desc;
-
- desc = irq_to_desc(irq);
if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
trigger == IOAPIC_LEVEL)
@@ -1311,7 +1376,7 @@ static int setup_ioapic_entry(int apic,
return 0;
}
-static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,
+static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_desc *desc,
int trigger, int polarity)
{
struct irq_cfg *cfg;
@@ -1321,10 +1386,10 @@ static void setup_IO_APIC_irq(int apic,
if (!IO_APIC_IRQ(irq))
return;
- cfg = irq_cfg(irq);
+ cfg = desc->chip_data;
mask = TARGET_CPUS;
- if (assign_irq_vector(irq, mask))
+ if (assign_irq_vector(irq, cfg, mask))
return;
cpus_and(mask, cfg->domain, mask);
@@ -1341,12 +1406,12 @@ static void setup_IO_APIC_irq(int apic,
cfg->vector)) {
printk("Failed to setup ioapic entry for ioapic %d, pin %d\n",
mp_ioapics[apic].mp_apicid, pin);
- __clear_irq_vector(irq);
+ __clear_irq_vector(irq, cfg);
return;
}
- ioapic_register_intr(irq, trigger);
- if (irq < 16)
+ ioapic_register_intr(irq, desc, trigger);
+ if (irq < NR_IRQS_LEGACY)
disable_8259A_irq(irq);
ioapic_write_entry(apic, pin, entry);
@@ -1356,6 +1421,9 @@ static void __init setup_IO_APIC_irqs(vo
{
int apic, pin, idx, irq;
int notcon = 0;
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+ int cpu = boot_cpu_id;
apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
@@ -1387,9 +1455,15 @@ static void __init setup_IO_APIC_irqs(vo
if (multi_timer_check(apic, irq))
continue;
#endif
- add_pin_to_irq(irq, apic, pin);
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", irq);
+ continue;
+ }
+ cfg = desc->chip_data;
+ add_pin_to_irq_cpu(cfg, cpu, apic, pin);
- setup_IO_APIC_irq(apic, pin, irq,
+ setup_IO_APIC_irq(apic, pin, irq, desc,
irq_trigger(idx), irq_polarity(idx));
}
}
@@ -1448,6 +1522,7 @@ __apicdebuginit(void) print_IO_APIC(void
union IO_APIC_reg_03 reg_03;
unsigned long flags;
struct irq_cfg *cfg;
+ struct irq_desc *desc;
unsigned int irq;
if (apic_verbosity == APIC_QUIET)
@@ -1537,8 +1612,10 @@ __apicdebuginit(void) print_IO_APIC(void
}
}
printk(KERN_DEBUG "IRQ to pin mappings:\n");
- for_each_irq_cfg(irq, cfg) {
- struct irq_pin_list *entry = cfg->irq_2_pin;
+ for_each_irq_desc(irq, desc) {
+ struct irq_pin_list *entry;
+ cfg = desc->chip_data;
+ entry = cfg->irq_2_pin;
if (!entry)
continue;
printk(KERN_DEBUG "IRQ%d ", irq);
@@ -1549,7 +1626,7 @@ __apicdebuginit(void) print_IO_APIC(void
entry = entry->next;
}
printk("\n");
- }
+ } end_for_each_irq_desc();
printk(KERN_INFO ".................................... done.\n");
@@ -2022,14 +2099,16 @@ static unsigned int startup_ioapic_irq(u
{
int was_pending = 0;
unsigned long flags;
+ struct irq_cfg *cfg;
spin_lock_irqsave(&ioapic_lock, flags);
- if (irq < 16) {
+ if (irq < NR_IRQS_LEGACY) {
disable_8259A_irq(irq);
if (i8259A_irq_pending(irq))
was_pending = 1;
}
- __unmask_IO_APIC_irq(irq);
+ cfg = irq_cfg(irq);
+ __unmask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
return was_pending;
@@ -2092,35 +2171,37 @@ static DECLARE_DELAYED_WORK(ir_migration
* as simple as edge triggered migration and we can do the irq migration
* with a simple atomic update to IO-APIC RTE.
*/
-static void migrate_ioapic_irq(int irq, cpumask_t mask)
+static void migrate_ioapic_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
- struct irq_desc *desc;
cpumask_t tmp, cleanup_mask;
struct irte irte;
int modify_ioapic_rte;
unsigned int dest;
unsigned long flags;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
+ irq = desc->irq;
if (get_irte(irq, &irte))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
- desc = irq_to_desc(irq);
modify_ioapic_rte = desc->status & IRQ_LEVEL;
if (modify_ioapic_rte) {
spin_lock_irqsave(&ioapic_lock, flags);
- __target_IO_APIC_irq(irq, dest, cfg->vector);
+ __target_IO_APIC_irq(irq, dest, cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
@@ -2142,14 +2223,14 @@ static void migrate_ioapic_irq(int irq,
desc->affinity = mask;
}
-static int migrate_irq_remapped_level(int irq)
+static int migrate_irq_remapped_level_desc(struct irq_desc *desc)
{
int ret = -1;
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_cfg *cfg = desc->chip_data;
- mask_IO_APIC_irq(irq);
+ mask_IO_APIC_irq_desc(desc);
- if (io_apic_level_ack_pending(irq)) {
+ if (io_apic_level_ack_pending(cfg)) {
/*
* Interrupt in progress. Migrating irq now will change the
* vector information in the IO-APIC RTE and that will confuse
@@ -2161,14 +2242,15 @@ static int migrate_irq_remapped_level(in
}
/* everthing is clear. we have right of way */
- migrate_ioapic_irq(irq, desc->pending_mask);
+ migrate_ioapic_irq_desc(desc, desc->pending_mask);
ret = 0;
desc->status &= ~IRQ_MOVE_PENDING;
cpus_clear(desc->pending_mask);
unmask:
- unmask_IO_APIC_irq(irq);
+ unmask_IO_APIC_irq_desc(desc);
+
return ret;
}
@@ -2192,24 +2274,28 @@ static void ir_irq_migration(struct work
desc->chip->set_affinity(irq, desc->pending_mask);
spin_unlock_irqrestore(&desc->lock, flags);
}
- }
+ } end_for_each_irq_desc();
}
/*
* Migrates the IRQ destination in the process context.
*/
-static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+static void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
- struct irq_desc *desc = irq_to_desc(irq);
-
if (desc->status & IRQ_LEVEL) {
desc->status |= IRQ_MOVE_PENDING;
desc->pending_mask = mask;
- migrate_irq_remapped_level(irq);
+ migrate_irq_remapped_level_desc(desc);
return;
}
- migrate_ioapic_irq(irq, mask);
+ migrate_ioapic_irq_desc(desc, mask);
+}
+static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ set_ir_ioapic_affinity_irq_desc(desc, mask);
}
#endif
@@ -2229,6 +2315,9 @@ asmlinkage void smp_irq_move_cleanup_int
struct irq_cfg *cfg;
irq = __get_cpu_var(vector_irq)[vector];
+ if (irq == -1)
+ continue;
+
desc = irq_to_desc(irq);
if (!desc)
continue;
@@ -2250,9 +2339,10 @@ unlock:
irq_exit();
}
-static void irq_complete_move(unsigned int irq)
+static void irq_complete_move(struct irq_desc **descp)
{
- struct irq_cfg *cfg = irq_cfg(irq);
+ struct irq_desc *desc = *descp;
+ struct irq_cfg *cfg = desc->chip_data;
unsigned vector, me;
if (likely(!cfg->move_in_progress))
@@ -2270,8 +2360,9 @@ static void irq_complete_move(unsigned i
}
}
#else
-static inline void irq_complete_move(unsigned int irq) {}
+static inline void irq_complete_move(struct irq_desc **descp) {}
#endif
+
#ifdef CONFIG_INTR_REMAP
static void ack_x2apic_level(unsigned int irq)
{
@@ -2282,11 +2373,14 @@ static void ack_x2apic_edge(unsigned int
{
ack_x2APIC_irq();
}
+
#endif
static void ack_apic_edge(unsigned int irq)
{
- irq_complete_move(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ irq_complete_move(&desc);
move_native_irq(irq);
ack_APIC_irq();
}
@@ -2295,18 +2389,21 @@ atomic_t irq_mis_count;
static void ack_apic_level(unsigned int irq)
{
+ struct irq_desc *desc = irq_to_desc(irq);
+
#ifdef CONFIG_X86_32
unsigned long v;
int i;
#endif
+ struct irq_cfg *cfg;
int do_unmask_irq = 0;
- irq_complete_move(irq);
+ irq_complete_move(&desc);
#ifdef CONFIG_GENERIC_PENDING_IRQ
/* If we are moving the irq we need to mask it */
- if (unlikely(irq_to_desc(irq)->status & IRQ_MOVE_PENDING)) {
+ if (unlikely(desc->status & IRQ_MOVE_PENDING)) {
do_unmask_irq = 1;
- mask_IO_APIC_irq(irq);
+ mask_IO_APIC_irq_desc(desc);
}
#endif
@@ -2330,7 +2427,8 @@ static void ack_apic_level(unsigned int
* operation to prevent an edge-triggered interrupt escaping meanwhile.
* The idea is from Manfred Spraul. --macro
*/
- i = irq_cfg(irq)->vector;
+ cfg = desc->chip_data;
+ i = cfg->vector;
v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
#endif
@@ -2369,17 +2467,18 @@ static void ack_apic_level(unsigned int
* accurate and is causing problems then it is a hardware bug
* and you can go talk to the chipset vendor about it.
*/
- if (!io_apic_level_ack_pending(irq))
+ cfg = desc->chip_data;
+ if (!io_apic_level_ack_pending(cfg))
move_masked_irq(irq);
- unmask_IO_APIC_irq(irq);
+ unmask_IO_APIC_irq_desc(desc);
}
#ifdef CONFIG_X86_32
if (!(v & (1 << (i & 0x1f)))) {
atomic_inc(&irq_mis_count);
spin_lock(&ioapic_lock);
- __mask_and_edge_IO_APIC_irq(irq);
- __unmask_and_level_IO_APIC_irq(irq);
+ __mask_and_edge_IO_APIC_irq(cfg);
+ __unmask_and_level_IO_APIC_irq(cfg);
spin_unlock(&ioapic_lock);
}
#endif
@@ -2430,22 +2529,21 @@ static inline void init_IO_APIC_traps(vo
* Also, we've got to be careful not to trash gate
* 0x80, because int 0x80 is hm, kind of importantish. ;)
*/
- for_each_irq_cfg(irq, cfg) {
- if (IO_APIC_IRQ(irq) && !cfg->vector) {
+ for_each_irq_desc(irq, desc) {
+ cfg = desc->chip_data;
+ if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) {
/*
* Hmm.. We don't have an entry for this,
* so default to an old-fashioned 8259
* interrupt if we can..
*/
- if (irq < 16)
+ if (irq < NR_IRQS_LEGACY)
make_8259A_irq(irq);
- else {
- desc = irq_to_desc(irq);
+ else
/* Strange. Oh, well.. */
desc->chip = &no_irq_chip;
- }
}
- }
+ } end_for_each_irq_desc();
}
/*
@@ -2468,7 +2566,7 @@ static void unmask_lapic_irq(unsigned in
apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED);
}
-static void ack_lapic_irq (unsigned int irq)
+static void ack_lapic_irq(unsigned int irq)
{
ack_APIC_irq();
}
@@ -2480,11 +2578,8 @@ static struct irq_chip lapic_chip __read
.ack = ack_lapic_irq,
};
-static void lapic_register_intr(int irq)
+static void lapic_register_intr(int irq, struct irq_desc *desc)
{
- struct irq_desc *desc;
-
- desc = irq_to_desc(irq);
desc->status &= ~IRQ_LEVEL;
set_irq_chip_and_handler_name(irq, &lapic_chip, handle_edge_irq,
"edge");
@@ -2588,7 +2683,9 @@ int timer_through_8259 __initdata;
*/
static inline void __init check_timer(void)
{
- struct irq_cfg *cfg = irq_cfg(0);
+ struct irq_desc *desc = irq_to_desc(0);
+ struct irq_cfg *cfg = desc->chip_data;
+ int cpu = boot_cpu_id;
int apic1, pin1, apic2, pin2;
unsigned long flags;
unsigned int ver;
@@ -2603,7 +2700,7 @@ static inline void __init check_timer(vo
* get/set the timer IRQ vector:
*/
disable_8259A_irq(0);
- assign_irq_vector(0, TARGET_CPUS);
+ assign_irq_vector(0, cfg, TARGET_CPUS);
/*
* As IRQ0 is to be enabled in the 8259A, the virtual
@@ -2654,10 +2751,10 @@ static inline void __init check_timer(vo
* Ok, does IRQ0 through the IOAPIC work?
*/
if (no_pin1) {
- add_pin_to_irq(0, apic1, pin1);
+ add_pin_to_irq_cpu(cfg, cpu, apic1, pin1);
setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
}
- unmask_IO_APIC_irq(0);
+ unmask_IO_APIC_irq_desc(desc);
if (timer_irq_works()) {
if (nmi_watchdog == NMI_IO_APIC) {
setup_nmi();
@@ -2683,9 +2780,9 @@ static inline void __init check_timer(vo
/*
* legacy devices should be connected to IO APIC #0
*/
- replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
+ replace_pin_at_irq_cpu(cfg, cpu, apic1, pin1, apic2, pin2);
setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
- unmask_IO_APIC_irq(0);
+ unmask_IO_APIC_irq_desc(desc);
enable_8259A_irq(0);
if (timer_irq_works()) {
apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
@@ -2717,7 +2814,7 @@ static inline void __init check_timer(vo
apic_printk(APIC_QUIET, KERN_INFO
"...trying to set up timer as Virtual Wire IRQ...\n");
- lapic_register_intr(0);
+ lapic_register_intr(0, desc);
apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */
enable_8259A_irq(0);
@@ -2902,22 +2999,26 @@ unsigned int create_irq_nr(unsigned int
unsigned int irq;
unsigned int new;
unsigned long flags;
- struct irq_cfg *cfg_new;
-
- irq_want = nr_irqs - 1;
+ struct irq_cfg *cfg_new = NULL;
+ int cpu = boot_cpu_id;
+ struct irq_desc *desc_new = NULL;
irq = 0;
spin_lock_irqsave(&vector_lock, flags);
- for (new = irq_want; new > 0; new--) {
+ for (new = irq_want; new < NR_IRQS; new++) {
if (platform_legacy_irq(new))
continue;
- cfg_new = irq_cfg(new);
- if (cfg_new && cfg_new->vector != 0)
+
+ desc_new = irq_to_desc_alloc_cpu(new, cpu);
+ if (!desc_new) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", new);
+ continue;
+ }
+ cfg_new = desc_new->chip_data;
+
+ if (cfg_new->vector != 0)
continue;
- /* check if need to create one */
- if (!cfg_new)
- cfg_new = irq_cfg_alloc(new);
- if (__assign_irq_vector(new, TARGET_CPUS) == 0)
+ if (__assign_irq_vector(new, cfg_new, TARGET_CPUS) == 0)
irq = new;
break;
}
@@ -2925,15 +3026,21 @@ unsigned int create_irq_nr(unsigned int
if (irq > 0) {
dynamic_irq_init(irq);
+ /* restore it, in case dynamic_irq_init clear it */
+ if (desc_new)
+ desc_new->chip_data = cfg_new;
}
return irq;
}
+static int nr_irqs_gsi = NR_IRQS_LEGACY;
int create_irq(void)
{
+ unsigned int irq_want;
int irq;
- irq = create_irq_nr(nr_irqs - 1);
+ irq_want = nr_irqs_gsi;
+ irq = create_irq_nr(irq_want);
if (irq == 0)
irq = -1;
@@ -2944,14 +3051,22 @@ int create_irq(void)
void destroy_irq(unsigned int irq)
{
unsigned long flags;
+ struct irq_cfg *cfg;
+ struct irq_desc *desc;
+ /* store it, in case dynamic_irq_cleanup clear it */
+ desc = irq_to_desc(irq);
+ cfg = desc->chip_data;
dynamic_irq_cleanup(irq);
+ /* connect back irq_cfg */
+ if (desc)
+ desc->chip_data = cfg;
#ifdef CONFIG_INTR_REMAP
free_irte(irq);
#endif
spin_lock_irqsave(&vector_lock, flags);
- __clear_irq_vector(irq);
+ __clear_irq_vector(irq, cfg);
spin_unlock_irqrestore(&vector_lock, flags);
}
@@ -2966,12 +3081,12 @@ static int msi_compose_msg(struct pci_de
unsigned dest;
cpumask_t tmp;
+ cfg = irq_cfg(irq);
tmp = TARGET_CPUS;
- err = assign_irq_vector(irq, tmp);
+ err = assign_irq_vector(irq, cfg, tmp);
if (err)
return err;
- cfg = irq_cfg(irq);
cpus_and(tmp, cfg->domain, tmp);
dest = cpu_mask_to_apicid(tmp);
@@ -3029,35 +3144,35 @@ static int msi_compose_msg(struct pci_de
#ifdef CONFIG_SMP
static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
- read_msi_msg(irq, &msg);
+ read_msi_msg_desc(desc, &msg);
msg.data &= ~MSI_DATA_VECTOR_MASK;
msg.data |= MSI_DATA_VECTOR(cfg->vector);
msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
- write_msi_msg(irq, &msg);
- desc = irq_to_desc(irq);
+ write_msi_msg_desc(desc, &msg);
desc->affinity = mask;
}
-
#ifdef CONFIG_INTR_REMAP
/*
* Migrate the MSI irq to another cpumask. This migration is
@@ -3065,11 +3180,11 @@ static void set_msi_irq_affinity(unsigne
*/
static void ir_set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
unsigned int dest;
cpumask_t tmp, cleanup_mask;
struct irte irte;
- struct irq_desc *desc;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
@@ -3078,10 +3193,12 @@ static void ir_set_msi_irq_affinity(unsi
if (get_irte(irq, &irte))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3105,9 +3222,9 @@ static void ir_set_msi_irq_affinity(unsi
cfg->move_in_progress = 0;
}
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
#endif
#endif /* CONFIG_SMP */
@@ -3166,7 +3283,7 @@ static int msi_alloc_irte(struct pci_dev
}
#endif
-static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc, int irq)
+static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
{
int ret;
struct msi_msg msg;
@@ -3175,7 +3292,7 @@ static int setup_msi_irq(struct pci_dev
if (ret < 0)
return ret;
- set_irq_msi(irq, desc);
+ set_irq_msi(irq, msidesc);
write_msi_msg(irq, &msg);
#ifdef CONFIG_INTR_REMAP
@@ -3195,26 +3312,13 @@ static int setup_msi_irq(struct pci_dev
return 0;
}
-static unsigned int build_irq_for_pci_dev(struct pci_dev *dev)
-{
- unsigned int irq;
-
- irq = dev->bus->number;
- irq <<= 8;
- irq |= dev->devfn;
- irq <<= 12;
-
- return irq;
-}
-
-int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
+int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc)
{
unsigned int irq;
int ret;
unsigned int irq_want;
- irq_want = build_irq_for_pci_dev(dev) + 0x100;
-
+ irq_want = nr_irqs_gsi;
irq = create_irq_nr(irq_want);
if (irq == 0)
return -1;
@@ -3228,7 +3332,7 @@ int arch_setup_msi_irq(struct pci_dev *d
goto error;
no_ir:
#endif
- ret = setup_msi_irq(dev, desc, irq);
+ ret = setup_msi_irq(dev, msidesc, irq);
if (ret < 0) {
destroy_irq(irq);
return ret;
@@ -3246,7 +3350,7 @@ int arch_setup_msi_irqs(struct pci_dev *
{
unsigned int irq;
int ret, sub_handle;
- struct msi_desc *desc;
+ struct msi_desc *msidesc;
unsigned int irq_want;
#ifdef CONFIG_INTR_REMAP
@@ -3254,10 +3358,11 @@ int arch_setup_msi_irqs(struct pci_dev *
int index = 0;
#endif
- irq_want = build_irq_for_pci_dev(dev) + 0x100;
+ irq_want = nr_irqs_gsi;
sub_handle = 0;
- list_for_each_entry(desc, &dev->msi_list, list) {
- irq = create_irq_nr(irq_want--);
+ list_for_each_entry(msidesc, &dev->msi_list, list) {
+ irq = create_irq_nr(irq_want);
+ irq_want++;
if (irq == 0)
return -1;
#ifdef CONFIG_INTR_REMAP
@@ -3289,7 +3394,7 @@ int arch_setup_msi_irqs(struct pci_dev *
}
no_ir:
#endif
- ret = setup_msi_irq(dev, desc, irq);
+ ret = setup_msi_irq(dev, msidesc, irq);
if (ret < 0)
goto error;
sub_handle++;
@@ -3310,20 +3415,22 @@ void arch_teardown_msi_irq(unsigned int
#ifdef CONFIG_SMP
static void dmar_msi_set_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3335,9 +3442,9 @@ static void dmar_msi_set_affinity(unsign
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
dmar_msi_write(irq, &msg);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
#endif /* CONFIG_SMP */
struct irq_chip dmar_msi_type = {
@@ -3371,8 +3478,8 @@ int arch_setup_dmar_msi(unsigned int irq
#ifdef CONFIG_SMP
static void hpet_msi_set_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
- struct irq_desc *desc;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
@@ -3381,10 +3488,12 @@ static void hpet_msi_set_affinity(unsign
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3396,9 +3505,9 @@ static void hpet_msi_set_affinity(unsign
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
hpet_msi_write(irq, &msg);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
#endif /* CONFIG_SMP */
struct irq_chip hpet_msi_type = {
@@ -3453,26 +3562,28 @@ static void target_ht_irq(unsigned int i
static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
target_ht_irq(irq, dest, cfg->vector);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
#endif
static struct irq_chip ht_irq_chip = {
@@ -3492,13 +3603,13 @@ int arch_setup_ht_irq(unsigned int irq,
int err;
cpumask_t tmp;
+ cfg = irq_cfg(irq);
tmp = TARGET_CPUS;
- err = assign_irq_vector(irq, tmp);
+ err = assign_irq_vector(irq, cfg, tmp);
if (!err) {
struct ht_irq_msg msg;
unsigned dest;
- cfg = irq_cfg(irq);
cpus_and(tmp, cfg->domain, tmp);
dest = cpu_mask_to_apicid(tmp);
@@ -3544,7 +3655,9 @@ int arch_enable_uv_irq(char *irq_name, u
unsigned long flags;
int err;
- err = assign_irq_vector(irq, *eligible_cpu);
+ cfg = irq_cfg(irq);
+
+ err = assign_irq_vector(irq, cfg, *eligible_cpu);
if (err != 0)
return err;
@@ -3553,8 +3666,6 @@ int arch_enable_uv_irq(char *irq_name, u
irq_name);
spin_unlock_irqrestore(&vector_lock, flags);
- cfg = irq_cfg(irq);
-
mmr_value = 0;
entry = (struct uv_IO_APIC_route_entry *)&mmr_value;
BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
@@ -3606,9 +3717,16 @@ int __init io_apic_get_redir_entries (in
return reg_01.bits.entries;
}
-int __init probe_nr_irqs(void)
+void __init probe_nr_irqs_gsi(void)
{
- return NR_IRQS;
+ int idx;
+ int nr = 0;
+
+ for (idx = 0; idx < nr_ioapics; idx++)
+ nr += io_apic_get_redir_entries(idx) + 1;
+
+ if (nr > nr_irqs_gsi)
+ nr_irqs_gsi = nr;
}
/* --------------------------------------------------------------------------
@@ -3707,19 +3825,31 @@ int __init io_apic_get_version(int ioapi
int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int polarity)
{
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+ int cpu = boot_cpu_id;
+
if (!IO_APIC_IRQ(irq)) {
apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
ioapic);
return -EINVAL;
}
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc %d\n", irq);
+ return 0;
+ }
+
/*
* IRQs < 16 are already in the irq_2_pin[] map
*/
- if (irq >= 16)
- add_pin_to_irq(irq, ioapic, pin);
+ if (irq >= NR_IRQS_LEGACY) {
+ cfg = desc->chip_data;
+ add_pin_to_irq_cpu(cfg, cpu, ioapic, pin);
+ }
- setup_IO_APIC_irq(ioapic, pin, irq, triggering, polarity);
+ setup_IO_APIC_irq(ioapic, pin, irq, desc, triggering, polarity);
return 0;
}
@@ -3773,9 +3903,10 @@ void __init setup_ioapic_dest(void)
* when you have too many devices, because at that time only boot
* cpu is online.
*/
- cfg = irq_cfg(irq);
+ desc = irq_to_desc(irq);
+ cfg = desc->chip_data;
if (!cfg->vector) {
- setup_IO_APIC_irq(ioapic, pin, irq,
+ setup_IO_APIC_irq(ioapic, pin, irq, desc,
irq_trigger(irq_entry),
irq_polarity(irq_entry));
continue;
@@ -3785,7 +3916,6 @@ void __init setup_ioapic_dest(void)
/*
* Honour affinities which have been set in early boot
*/
- desc = irq_to_desc(irq);
if (desc->status &
(IRQ_NO_BALANCING | IRQ_AFFINITY_SET))
mask = desc->affinity;
@@ -3794,10 +3924,10 @@ void __init setup_ioapic_dest(void)
#ifdef CONFIG_INTR_REMAP
if (intr_remapping_enabled)
- set_ir_ioapic_affinity_irq(irq, mask);
+ set_ir_ioapic_affinity_irq_desc(desc, mask);
else
#endif
- set_ioapic_affinity_irq(irq, mask);
+ set_ioapic_affinity_irq_desc(desc, mask);
}
}
@@ -3846,7 +3976,6 @@ void __init ioapic_init_mappings(void)
struct resource *ioapic_res;
int i;
- irq_2_pin_init();
ioapic_res = ioapic_setup_resources();
for (i = 0; i < nr_ioapics; i++) {
if (smp_found_config) {
Index: linux-2.6/arch/x86/kernel/irqinit_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irqinit_32.c
+++ linux-2.6/arch/x86/kernel/irqinit_32.c
@@ -68,8 +68,7 @@ void __init init_ISA_irqs (void)
/*
* 16 old-style INTA-cycle interrupts:
*/
- for (i = 0; i < 16; i++) {
- /* first time call this irq_desc */
+ for (i = 0; i < NR_IRQS_LEGACY; i++) {
struct irq_desc *desc = irq_to_desc(i);
desc->status = IRQ_DISABLED;
Index: linux-2.6/arch/x86/kernel/irqinit_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irqinit_64.c
+++ linux-2.6/arch/x86/kernel/irqinit_64.c
@@ -76,8 +76,7 @@ void __init init_ISA_irqs(void)
init_bsp_APIC();
init_8259A(0);
- for (i = 0; i < 16; i++) {
- /* first time call this irq_desc */
+ for (i = 0; i < NR_IRQS_LEGACY; i++) {
struct irq_desc *desc = irq_to_desc(i);
desc->status = IRQ_DISABLED;
Index: linux-2.6/drivers/char/random.c
===================================================================
--- linux-2.6.orig/drivers/char/random.c
+++ linux-2.6/drivers/char/random.c
@@ -558,6 +558,8 @@ struct timer_rand_state {
unsigned dont_count_entropy:1;
};
+#ifndef CONFIG_SPARSE_IRQ
+
static struct timer_rand_state *irq_timer_state[NR_IRQS];
static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
@@ -576,6 +578,33 @@ static void set_timer_rand_state(unsigne
irq_timer_state[irq] = state;
}
+#else
+
+static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (!desc)
+ return NULL;
+
+ return desc->timer_rand_state;
+}
+
+static void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (!desc)
+ return;
+
+ desc->timer_rand_state = state;
+}
+#endif
+
static struct timer_rand_state input_timer_state;
/*
@@ -933,8 +962,10 @@ void rand_initialize_irq(int irq)
{
struct timer_rand_state *state;
+#ifndef CONFIG_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
state = get_timer_rand_state(irq);
Index: linux-2.6/drivers/pci/intr_remapping.c
===================================================================
--- linux-2.6.orig/drivers/pci/intr_remapping.c
+++ linux-2.6/drivers/pci/intr_remapping.c
@@ -19,17 +19,75 @@ struct irq_2_iommu {
u8 irte_mask;
};
-static struct irq_2_iommu irq_2_iommuX[NR_IRQS];
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_2_iommu *get_one_free_irq_2_iommu(int cpu)
+{
+ struct irq_2_iommu *iommu;
+ int node;
+
+ node = cpu_to_node(cpu);
+
+ iommu = kzalloc_node(sizeof(*iommu), GFP_ATOMIC, node);
+ printk(KERN_DEBUG "alloc irq_2_iommu on cpu %d node %d\n", cpu, node);
+
+ return iommu;
+}
static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
{
- return (irq < nr_irqs) ? irq_2_iommuX + irq : NULL;
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (WARN_ON_ONCE(!desc))
+ return NULL;
+
+ return desc->irq_2_iommu;
+}
+
+static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc;
+ struct irq_2_iommu *irq_iommu;
+
+ /*
+ * alloc irq desc if not allocated already.
+ */
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", irq);
+ return NULL;
+ }
+
+ irq_iommu = desc->irq_2_iommu;
+
+ if (!irq_iommu)
+ desc->irq_2_iommu = get_one_free_irq_2_iommu(cpu);
+
+ return desc->irq_2_iommu;
+}
+
+static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
+{
+ return irq_2_iommu_alloc_cpu(irq, boot_cpu_id);
}
+#else /* !CONFIG_SPARSE_IRQ */
+
+static struct irq_2_iommu irq_2_iommuX[NR_IRQS];
+
+static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
+{
+ if (irq < nr_irqs)
+ return &irq_2_iommuX[irq];
+
+ return NULL;
+}
static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
{
return irq_2_iommu(irq);
}
+#endif
static DEFINE_SPINLOCK(irq_2_ir_lock);
@@ -86,9 +144,11 @@ int alloc_irte(struct intel_iommu *iommu
if (!count)
return -1;
+#ifndef CONFIG_SPARSE_IRQ
/* protect irq_2_iommu_alloc later */
if (irq >= nr_irqs)
return -1;
+#endif
/*
* start the IRTE search from index 0.
@@ -130,6 +190,12 @@ int alloc_irte(struct intel_iommu *iommu
table->base[i].present = 1;
irq_iommu = irq_2_iommu_alloc(irq);
+ if (!irq_iommu) {
+ spin_unlock(&irq_2_ir_lock);
+ printk(KERN_ERR "can't allocate irq_2_iommu\n");
+ return -1;
+ }
+
irq_iommu->iommu = iommu;
irq_iommu->irte_index = index;
irq_iommu->sub_handle = 0;
@@ -177,6 +243,12 @@ int set_irte_irq(int irq, struct intel_i
irq_iommu = irq_2_iommu_alloc(irq);
+ if (!irq_iommu) {
+ spin_unlock(&irq_2_ir_lock);
+ printk(KERN_ERR "can't allocate irq_2_iommu\n");
+ return -1;
+ }
+
irq_iommu->iommu = iommu;
irq_iommu->irte_index = index;
irq_iommu->sub_handle = subhandle;
Index: linux-2.6/drivers/xen/events.c
===================================================================
--- linux-2.6.orig/drivers/xen/events.c
+++ linux-2.6/drivers/xen/events.c
@@ -141,8 +141,9 @@ static void init_evtchn_cpu_bindings(voi
int i;
/* By default all event channels notify CPU#0. */
- for_each_irq_desc(i, desc)
+ for_each_irq_desc(i, desc) {
desc->affinity = cpumask_of_cpu(0);
+ } end_for_each_irq_desc();
#endif
memset(cpu_evtchn, 0, sizeof(cpu_evtchn));
@@ -231,7 +232,7 @@ static int find_unbound_irq(void)
int irq;
/* Only allocate from dynirq range */
- for_each_irq_nr(irq)
+ for (irq = 0; irq < nr_irqs; irq++)
if (irq_bindcount[irq] == 0)
break;
@@ -792,7 +793,7 @@ void xen_irq_resume(void)
mask_evtchn(evtchn);
/* No IRQ <-> event-channel mappings. */
- for_each_irq_nr(irq)
+ for (irq = 0; irq < nr_irqs; irq++)
irq_info[irq].evtchn = 0; /* zap event-channel binding */
for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
@@ -824,7 +825,7 @@ void __init xen_init_IRQ(void)
mask_evtchn(i);
/* Dynamic IRQ space is currently unbound. Zero the refcnts. */
- for_each_irq_nr(i)
+ for (i = 0; i < nr_irqs; i++)
irq_bindcount[i] = 0;
irq_ctx_init(smp_processor_id());
Index: linux-2.6/fs/proc/stat.c
===================================================================
--- linux-2.6.orig/fs/proc/stat.c
+++ linux-2.6/fs/proc/stat.c
@@ -27,6 +27,9 @@ static int show_stat(struct seq_file *p,
u64 sum = 0;
struct timespec boottime;
unsigned int per_irq_sum;
+#ifdef CONFIG_GENERIC_HARDIRQS
+ struct irq_desc *desc;
+#endif
user = nice = system = idle = iowait =
irq = softirq = steal = cputime64_zero;
@@ -44,10 +47,9 @@ static int show_stat(struct seq_file *p,
softirq = cputime64_add(softirq, kstat_cpu(i).cpustat.softirq);
steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal);
guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest);
-
- for_each_irq_nr(j)
+ for_each_irq_desc(j, desc) {
sum += kstat_irqs_cpu(j, i);
-
+ } end_for_each_irq_desc();
sum += arch_irq_stat_cpu(i);
}
sum += arch_irq_stat();
@@ -90,14 +92,17 @@ static int show_stat(struct seq_file *p,
seq_printf(p, "intr %llu", (unsigned long long)sum);
/* sum again ? it could be updated? */
- for_each_irq_nr(j) {
+ for_each_irq_desc(j, desc) {
per_irq_sum = 0;
-
for_each_possible_cpu(i)
per_irq_sum += kstat_irqs_cpu(j, i);
+#ifdef CONFIG_SPARSE_IRQ
+ seq_printf(p, " %d:%u", j, per_irq_sum);
+#else
seq_printf(p, " %u", per_irq_sum);
- }
+#endif
+ } end_for_each_irq_desc();
seq_printf(p,
"\nctxt %llu\n"
Index: linux-2.6/fs/proc/interrupts.c
===================================================================
--- linux-2.6.orig/fs/proc/interrupts.c
+++ linux-2.6/fs/proc/interrupts.c
@@ -8,6 +8,23 @@
/*
* /proc/interrupts
*/
+#ifdef CONFIG_SPARSE_IRQ
+static void *int_seq_start(struct seq_file *f, loff_t *pos)
+{
+ rcu_read_lock();
+ return seq_list_start(&sparse_irqs_head, *pos);
+}
+
+static void *int_seq_next(struct seq_file *f, void *v, loff_t *pos)
+{
+ return seq_list_next(v, &sparse_irqs_head, pos);
+}
+
+static void int_seq_stop(struct seq_file *f, void *v)
+{
+ rcu_read_unlock();
+}
+#else
static void *int_seq_start(struct seq_file *f, loff_t *pos)
{
return (*pos <= nr_irqs) ? pos : NULL;
@@ -25,6 +42,7 @@ static void int_seq_stop(struct seq_file
{
/* Nothing to do */
}
+#endif
static const struct seq_operations int_seq_ops = {
.start = int_seq_start,
Index: linux-2.6/include/linux/interrupt.h
===================================================================
--- linux-2.6.orig/include/linux/interrupt.h
+++ linux-2.6/include/linux/interrupt.h
@@ -18,6 +18,8 @@
#include <asm/ptrace.h>
#include <asm/system.h>
+extern int nr_irqs;
+
/*
* These correspond to the IORESOURCE_IRQ_* defines in
* linux/ioport.h to select the interrupt line behaviour. When
Index: linux-2.6/include/linux/irq.h
===================================================================
--- linux-2.6.orig/include/linux/irq.h
+++ linux-2.6/include/linux/irq.h
@@ -129,6 +129,8 @@ struct irq_chip {
const char *typename;
};
+struct timer_rand_state;
+struct irq_2_iommu;
/**
* struct irq_desc - interrupt descriptor
* @irq: interrupt number for this descriptor
@@ -154,6 +156,14 @@ struct irq_chip {
*/
struct irq_desc {
unsigned int irq;
+#ifdef CONFIG_SPARSE_IRQ
+ struct list_head list;
+ struct timer_rand_state *timer_rand_state;
+ unsigned int *kstat_irqs;
+# ifdef CONFIG_INTR_REMAP
+ struct irq_2_iommu *irq_2_iommu;
+# endif
+#endif
irq_flow_handler_t handle_irq;
struct irq_chip *chip;
struct msi_desc *msi_desc;
@@ -181,14 +191,64 @@ struct irq_desc {
const char *name;
} ____cacheline_internodealigned_in_smp;
+extern void early_irq_init(void);
+extern void arch_early_irq_init(void);
+extern void arch_init_chip_data(struct irq_desc *desc, int cpu);
+extern void arch_init_copy_chip_data(struct irq_desc *old_desc,
+ struct irq_desc *desc, int cpu);
+extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc);
+
+#ifndef CONFIG_SPARSE_IRQ
extern struct irq_desc irq_desc[NR_IRQS];
static inline struct irq_desc *irq_to_desc(unsigned int irq)
{
- return (irq < nr_irqs) ? irq_desc + irq : NULL;
+ return (irq < NR_IRQS) ? irq_desc + irq : NULL;
+}
+static inline struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+{
+ return irq_to_desc(irq);
}
+#ifdef CONFIG_GENERIC_HARDIRQS
+# define for_each_irq_desc(irq, desc) \
+ for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
+# define for_each_irq_desc_reverse(irq, desc) \
+ for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \
+ irq >= 0; irq--, desc--)
+
+#define end_for_each_irq_desc()
+#endif
+
+#else
+
+extern struct irq_desc *irq_to_desc(unsigned int irq);
+extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu);
+extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu);
+
+extern struct list_head sparse_irqs_head;
+#define for_each_irq_desc(irqX, desc) \
+ rcu_read_lock(); \
+ for (desc = list_entry(rcu_dereference(sparse_irqs_head.next), typeof(*desc), list), irqX = desc->irq; \
+ prefetch(desc->list.next), &desc->list != &sparse_irqs_head; \
+ desc = list_entry(rcu_dereference(desc->list.next), typeof(*desc), list), irqX = desc ? desc->irq : -1U)
+
+#define for_each_irq_desc_reverse(irqX, desc) \
+ rcu_read_lock(); \
+ for (desc = list_entry(rcu_dereference(sparse_irqs_head.prev), typeof(*desc), list), irqX = desc->irq; \
+ prefetch(desc->list.prev), &desc->list != &sparse_irqs_head; \
+ desc = list_entry(rcu_dereference(desc->list.prev), typeof(*desc), list), irqX = desc ? desc->irq : -1U)
+
+#define end_for_each_irq_desc() rcu_read_unlock()
+
+#define kstat_irqs_this_cpu(DESC) \
+ ((DESC)->kstat_irqs[smp_processor_id()])
+#define kstat_incr_irqs_this_cpu(irqno, DESC) \
+ ((DESC)->kstat_irqs[smp_processor_id()]++)
+
+#endif
+
/*
* Migration helpers for obsolete names, they will go away:
*/
@@ -380,6 +440,11 @@ extern int set_irq_msi(unsigned int irq,
#define get_irq_data(irq) (irq_to_desc(irq)->handler_data)
#define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc)
+#define get_irq_desc_chip(desc) ((desc)->chip)
+#define get_irq_desc_chip_data(desc) ((desc)->chip_data)
+#define get_irq_desc_data(desc) ((desc)->handler_data)
+#define get_irq_desc_msi(desc) ((desc)->msi_desc)
+
#endif /* CONFIG_GENERIC_HARDIRQS */
#endif /* !CONFIG_S390 */
Index: linux-2.6/include/linux/kernel_stat.h
===================================================================
--- linux-2.6.orig/include/linux/kernel_stat.h
+++ linux-2.6/include/linux/kernel_stat.h
@@ -28,7 +28,9 @@ struct cpu_usage_stat {
struct kernel_stat {
struct cpu_usage_stat cpustat;
- unsigned int irqs[NR_IRQS];
+#ifndef CONFIG_SPARSE_IRQ
+ unsigned int irqs[NR_IRQS];
+#endif
};
DECLARE_PER_CPU(struct kernel_stat, kstat);
@@ -39,6 +41,10 @@ DECLARE_PER_CPU(struct kernel_stat, ksta
extern unsigned long long nr_context_switches(void);
+#ifndef CONFIG_SPARSE_IRQ
+#define kstat_irqs_this_cpu(irq) \
+ (kstat_this_cpu.irqs[irq])
+
struct irq_desc;
static inline void kstat_incr_irqs_this_cpu(unsigned int irq,
@@ -46,11 +52,17 @@ static inline void kstat_incr_irqs_this_
{
kstat_this_cpu.irqs[irq]++;
}
+#endif
+
+#ifndef CONFIG_SPARSE_IRQ
static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
{
return kstat_cpu(cpu).irqs[irq];
}
+#else
+extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu);
+#endif
/*
* Number of interrupts per specific IRQ source, since bootup
Index: linux-2.6/kernel/irq/autoprobe.c
===================================================================
--- linux-2.6.orig/kernel/irq/autoprobe.c
+++ linux-2.6/kernel/irq/autoprobe.c
@@ -57,7 +57,7 @@ unsigned long probe_irq_on(void)
desc->chip->startup(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
/* Wait for longstanding interrupts to trigger. */
msleep(20);
@@ -75,7 +75,7 @@ unsigned long probe_irq_on(void)
desc->status |= IRQ_PENDING;
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
/*
* Wait for spurious interrupts to trigger
@@ -99,7 +99,7 @@ unsigned long probe_irq_on(void)
mask |= 1 << i;
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
return mask;
}
@@ -135,7 +135,7 @@ unsigned int probe_irq_mask(unsigned lon
desc->chip->shutdown(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
mutex_unlock(&probing_active);
return mask & val;
@@ -179,7 +179,7 @@ int probe_irq_off(unsigned long val)
desc->chip->shutdown(i);
}
spin_unlock_irq(&desc->lock);
- }
+ } end_for_each_irq_desc();
mutex_unlock(&probing_active);
if (nr_of_irqs > 1)
Index: linux-2.6/kernel/irq/chip.c
===================================================================
--- linux-2.6.orig/kernel/irq/chip.c
+++ linux-2.6/kernel/irq/chip.c
@@ -24,9 +24,10 @@
*/
void dynamic_irq_init(unsigned int irq)
{
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_desc *desc;
unsigned long flags;
+ desc = irq_to_desc(irq);
if (!desc) {
WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
return;
Index: linux-2.6/kernel/irq/handle.c
===================================================================
--- linux-2.6.orig/kernel/irq/handle.c
+++ linux-2.6/kernel/irq/handle.c
@@ -15,9 +15,16 @@
#include <linux/random.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
+#include <linux/rculist.h>
+#include <linux/hash.h>
#include "internals.h"
+/*
+ * lockdep: we want to handle all irq_desc locks as a single lock-class:
+ */
+static struct lock_class_key irq_desc_lock_class;
+
/**
* handle_bad_irq - handle spurious and unhandled irqs
* @irq: the interrupt number
@@ -49,6 +56,164 @@ void handle_bad_irq(unsigned int irq, st
int nr_irqs = NR_IRQS;
EXPORT_SYMBOL_GPL(nr_irqs);
+void __init __attribute__((weak)) arch_early_irq_init(void)
+{
+}
+
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_desc irq_desc_init = {
+ .irq = -1,
+ .status = IRQ_DISABLED,
+ .chip = &no_irq_chip,
+ .handle_irq = handle_bad_irq,
+ .depth = 1,
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
+#ifdef CONFIG_SMP
+ .affinity = CPU_MASK_ALL
+#endif
+};
+
+static void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr)
+{
+ unsigned long bytes;
+ char *ptr;
+ int node;
+
+ /* Compute how many bytes we need per irq and allocate them */
+ bytes = nr * sizeof(unsigned int);
+
+ node = cpu_to_node(cpu);
+ ptr = kzalloc_node(bytes, GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc kstat_irqs on cpu %d node %d\n", cpu, node);
+
+ if (ptr)
+ desc->kstat_irqs = (unsigned int *)ptr;
+}
+
+void __attribute__((weak)) arch_init_chip_data(struct irq_desc *desc, int cpu)
+{
+}
+
+static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu)
+{
+ memcpy(desc, &irq_desc_init, sizeof(struct irq_desc));
+ desc->irq = irq;
+#ifdef CONFIG_SMP
+ desc->cpu = cpu;
+#endif
+ lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ init_kstat_irqs(desc, cpu, nr_cpu_ids);
+ if (!desc->kstat_irqs) {
+ printk(KERN_ERR "can not alloc kstat_irqs\n");
+ BUG_ON(1);
+ }
+ arch_init_chip_data(desc, cpu);
+}
+
+/*
+ * Protect the sparse_irqs:
+ */
+static DEFINE_SPINLOCK(sparse_irq_lock);
+LIST_HEAD(sparse_irqs_head);
+
+struct irq_desc *irq_desc_ptrs[NR_IRQS] __read_mostly;
+
+static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = {
+ [0 ... NR_IRQS_LEGACY-1] = {
+ .irq = -1,
+ .status = IRQ_DISABLED,
+ .chip = &no_irq_chip,
+ .handle_irq = handle_bad_irq,
+ .depth = 1,
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
+#ifdef CONFIG_SMP
+ .affinity = CPU_MASK_ALL
+#endif
+ }
+};
+
+/* FIXME: use bootmem alloc ...*/
+static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS];
+
+void __init early_irq_init(void)
+{
+ struct irq_desc *desc;
+ int legacy_count;
+ int i;
+
+ desc = irq_desc_legacy;
+ legacy_count = ARRAY_SIZE(irq_desc_legacy);
+
+ for (i = 0; i < legacy_count; i++) {
+ desc[i].irq = i;
+ desc[i].kstat_irqs = kstat_irqs_legacy[i];
+
+ irq_desc_ptrs[i] = desc + i;
+ list_add_tail(&desc[i].list, &sparse_irqs_head);
+ }
+
+ for (i = legacy_count; i < NR_IRQS; i++)
+ irq_desc_ptrs[i] = NULL;
+
+ arch_early_irq_init();
+}
+
+struct irq_desc *irq_to_desc(unsigned int irq)
+{
+ if (irq >= NR_IRQS) {
+ printk(KERN_WARNING "irq >= NR_IRQS in irq_to_desc: %d %d\n",
+ irq, NR_IRQS);
+ WARN_ON(1);
+ return NULL;
+ }
+ return irq_desc_ptrs[irq];
+}
+
+struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc;
+ unsigned long flags;
+ int node;
+
+ if (irq >= NR_IRQS) {
+ printk(KERN_WARNING "irq >= NR_IRQS in irq_to_desc_alloc: %d %d\n",
+ irq, NR_IRQS);
+ WARN_ON(1);
+ return NULL;
+ }
+
+ desc = irq_desc_ptrs[irq];
+ if (desc)
+ return desc;
+
+ spin_lock_irqsave(&sparse_irq_lock, flags);
+
+ /* We have to check it to avoid races with another CPU */
+ desc = irq_desc_ptrs[irq];
+ if (desc)
+ goto out_unlock;
+
+ node = cpu_to_node(cpu);
+ desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_desc for %d on cpu %d node %d\n",
+ irq, cpu, node);
+ if (!desc) {
+ printk(KERN_ERR "can not alloc irq_desc\n");
+ BUG_ON(1);
+ }
+ init_one_irq_desc(irq, desc, cpu);
+
+ irq_desc_ptrs[irq] = desc;
+ list_add_tail_rcu(&desc->list, &sparse_irqs_head);
+
+out_unlock:
+ spin_unlock_irqrestore(&sparse_irq_lock, flags);
+
+ return desc;
+}
+
+#else
+
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
[0 ... NR_IRQS-1] = {
.status = IRQ_DISABLED,
@@ -62,6 +227,8 @@ struct irq_desc irq_desc[NR_IRQS] __cach
}
};
+#endif
+
/*
* What should we do if we get a hw irq event on an illegal vector?
* Each architecture has to answer this themself.
@@ -261,17 +428,25 @@ out:
#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_SPARSE_IRQ
struct irq_desc *desc;
int i;
- for_each_irq_desc(i, desc)
+ for_each_irq_desc(i, desc) {
lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ } end_for_each_irq_desc();
+#endif
}
#endif
+
+#ifdef CONFIG_SPARSE_IRQ
+unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ return desc->kstat_irqs[cpu];
+}
+#endif
+EXPORT_SYMBOL(kstat_irqs_cpu);
+
Index: linux-2.6/arch/x86/kernel/irq.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq.c
+++ linux-2.6/arch/x86/kernel/irq.c
@@ -99,25 +99,37 @@ static int show_other_interrupts(struct
int show_interrupts(struct seq_file *p, void *v)
{
unsigned long flags, any_count = 0;
- int i = *(loff_t *) v, j;
+ int i, j;
struct irqaction *action;
struct irq_desc *desc;
+ int head = 0;
+#ifdef CONFIG_SPARSE_IRQ
+ desc = list_entry(v, struct irq_desc, list);
+ i = desc->irq;
+ if (&desc->list == sparse_irqs_head.next)
+ head = 1;
+#else
+ i = *(loff_t *) v;
if (i > nr_irqs)
return 0;
if (i == nr_irqs)
return show_other_interrupts(p);
+ if (i == 0)
+ head = 1;
+
+ desc = irq_to_desc(i);
+#endif
/* print header */
- if (i == 0) {
+ if (head) {
seq_printf(p, " ");
for_each_online_cpu(j)
seq_printf(p, "CPU%-8d", j);
seq_putc(p, '\n');
}
- desc = irq_to_desc(i);
spin_lock_irqsave(&desc->lock, flags);
#ifndef CONFIG_SMP
any_count = kstat_irqs(i);
@@ -148,6 +160,12 @@ int show_interrupts(struct seq_file *p,
seq_putc(p, '\n');
out:
spin_unlock_irqrestore(&desc->lock, flags);
+
+#ifdef CONFIG_SPARSE_IRQ
+ if (&desc->list == sparse_irqs_head.prev)
+ show_other_interrupts(p);
+#endif
+
return 0;
}
Index: linux-2.6/include/linux/irqnr.h
===================================================================
--- linux-2.6.orig/include/linux/irqnr.h
+++ linux-2.6/include/linux/irqnr.h
@@ -7,18 +7,11 @@
# define for_each_irq_desc(irq, desc) \
for (irq = 0; irq < nr_irqs; irq++)
-#else
-extern int nr_irqs;
+# define end_for_each_irq_desc()
-# define for_each_irq_desc(irq, desc) \
- for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
-
-# define for_each_irq_desc_reverse(irq, desc) \
- for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \
- irq >= 0; irq--, desc--)
+static inline early_sparse_irq_init(void)
+{
+}
#endif
-#define for_each_irq_nr(irq) \
- for (irq = 0; irq < nr_irqs; irq++)
-
#endif
Index: linux-2.6/arch/x86/kernel/irq_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_32.c
+++ linux-2.6/arch/x86/kernel/irq_32.c
@@ -254,7 +254,7 @@ void fixup_irqs(cpumask_t map)
desc->chip->set_affinity(irq, mask);
else if (desc->action && !(warned++))
printk("Cannot set affinity for irq %i\n", irq);
- }
+ } end_for_each_irq_desc();
#if 0
barrier();
Index: linux-2.6/arch/x86/kernel/irq_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_64.c
+++ linux-2.6/arch/x86/kernel/irq_64.c
@@ -125,7 +125,7 @@ void fixup_irqs(cpumask_t map)
printk("Broke affinity for irq %i\n", irq);
else if (!set_affinity)
printk("Cannot set affinity for irq %i\n", irq);
- }
+ } end_for_each_irq_desc();
/* That doesn't seem sufficient. Give it 1ms. */
local_irq_enable();
Index: linux-2.6/kernel/irq/proc.c
===================================================================
--- linux-2.6.orig/kernel/irq/proc.c
+++ linux-2.6/kernel/irq/proc.c
@@ -243,7 +243,8 @@ void init_irq_proc(void)
/*
* Create entries for all existing IRQs.
*/
- for_each_irq_desc(irq, desc)
+ for_each_irq_desc(irq, desc) {
register_irq_proc(irq, desc);
+ } end_for_each_irq_desc();
}
Index: linux-2.6/kernel/irq/spurious.c
===================================================================
--- linux-2.6.orig/kernel/irq/spurious.c
+++ linux-2.6/kernel/irq/spurious.c
@@ -99,7 +99,7 @@ static int misrouted_irq(int irq)
if (try_one_irq(i, desc))
ok = 1;
- }
+ } end_for_each_irq_desc();
/* So the caller can adjust the irq error counts */
return ok;
}
@@ -122,7 +122,7 @@ static void poll_spurious_irqs(unsigned
continue;
try_one_irq(i, desc);
- }
+ } end_for_each_irq_desc();
mod_timer(&poll_spurious_irq_timer,
jiffies + POLL_SPURIOUS_IRQ_INTERVAL);
Index: linux-2.6/init/main.c
===================================================================
--- linux-2.6.orig/init/main.c
+++ linux-2.6/init/main.c
@@ -542,6 +542,15 @@ void __init __weak thread_info_cache_ini
{
}
+void __init __weak arch_early_irq_init(void)
+{
+}
+
+void __init __weak early_irq_init(void)
+{
+ arch_early_irq_init();
+}
+
asmlinkage void __init start_kernel(void)
{
char * command_line;
@@ -612,6 +621,8 @@ asmlinkage void __init start_kernel(void
sort_main_extable();
trap_init();
rcu_init();
+ /* init some links before init_ISA_irqs() */
+ early_irq_init();
init_IRQ();
pidhash_init();
init_timers();
Index: linux-2.6/arch/x86/include/asm/irq_vectors.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/irq_vectors.h
+++ linux-2.6/arch/x86/include/asm/irq_vectors.h
@@ -101,12 +101,23 @@
#define LAST_VM86_IRQ 15
#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
+#define NR_IRQS_LEGACY 16
+
#if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER)
+
+#ifndef CONFIG_SPARSE_IRQ
# if NR_CPUS < MAX_IO_APICS
# define NR_IRQS (NR_VECTORS + (32 * NR_CPUS))
# else
# define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS))
# endif
+#else
+# if (8 * NR_CPUS) > (32 * MAX_IO_APICS)
+# define NR_IRQS (NR_VECTORS + (8 * NR_CPUS))
+# else
+# define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS))
+# endif
+#endif
#elif defined(CONFIG_X86_VOYAGER)
Index: linux-2.6/drivers/pci/msi.c
===================================================================
--- linux-2.6.orig/drivers/pci/msi.c
+++ linux-2.6/drivers/pci/msi.c
@@ -103,11 +103,11 @@ static void msix_set_enable(struct pci_d
}
}
-static void msix_flush_writes(unsigned int irq)
+static void msix_flush_writes(struct irq_desc *desc)
{
struct msi_desc *entry;
- entry = get_irq_msi(irq);
+ entry = get_irq_desc_msi(desc);
BUG_ON(!entry || !entry->dev);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
@@ -135,11 +135,11 @@ static void msix_flush_writes(unsigned i
* Returns 1 if it succeeded in masking the interrupt and 0 if the device
* doesn't support MSI masking.
*/
-static int msi_set_mask_bits(unsigned int irq, u32 mask, u32 flag)
+static int msi_set_mask_bits(struct irq_desc *desc, u32 mask, u32 flag)
{
struct msi_desc *entry;
- entry = get_irq_msi(irq);
+ entry = get_irq_desc_msi(desc);
BUG_ON(!entry || !entry->dev);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
@@ -172,9 +172,9 @@ static int msi_set_mask_bits(unsigned in
return 1;
}
-void read_msi_msg(unsigned int irq, struct msi_msg *msg)
+void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
{
- struct msi_desc *entry = get_irq_msi(irq);
+ struct msi_desc *entry = get_irq_desc_msi(desc);
switch(entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
{
@@ -211,9 +211,16 @@ void read_msi_msg(unsigned int irq, stru
}
}
-void write_msi_msg(unsigned int irq, struct msi_msg *msg)
+void read_msi_msg(unsigned int irq, struct msi_msg *msg)
{
- struct msi_desc *entry = get_irq_msi(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ read_msi_msg_desc(desc, msg);
+}
+
+void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
+{
+ struct msi_desc *entry = get_irq_desc_msi(desc);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
{
@@ -252,21 +259,31 @@ void write_msi_msg(unsigned int irq, str
entry->msg = *msg;
}
+void write_msi_msg(unsigned int irq, struct msi_msg *msg)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ write_msi_msg_desc(desc, msg);
+}
+
void mask_msi_irq(unsigned int irq)
{
- msi_set_mask_bits(irq, 1, 1);
- msix_flush_writes(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ msi_set_mask_bits(desc, 1, 1);
+ msix_flush_writes(desc);
}
void unmask_msi_irq(unsigned int irq)
{
- msi_set_mask_bits(irq, 1, 0);
- msix_flush_writes(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ msi_set_mask_bits(desc, 1, 0);
+ msix_flush_writes(desc);
}
static int msi_free_irqs(struct pci_dev* dev);
-
static struct msi_desc* alloc_msi_entry(void)
{
struct msi_desc *entry;
@@ -303,9 +320,11 @@ static void __pci_restore_msi_state(stru
pci_intx_for_msi(dev, 0);
msi_set_enable(dev, 0);
write_msi_msg(dev->irq, &entry->msg);
- if (entry->msi_attrib.maskbit)
- msi_set_mask_bits(dev->irq, entry->msi_attrib.maskbits_mask,
+ if (entry->msi_attrib.maskbit) {
+ struct irq_desc *desc = irq_to_desc(dev->irq);
+ msi_set_mask_bits(desc, entry->msi_attrib.maskbits_mask,
entry->msi_attrib.masked);
+ }
pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
control &= ~PCI_MSI_FLAGS_QSIZE;
@@ -327,8 +346,9 @@ static void __pci_restore_msix_state(str
msix_set_enable(dev, 0);
list_for_each_entry(entry, &dev->msi_list, list) {
+ struct irq_desc *desc = irq_to_desc(entry->irq);
write_msi_msg(entry->irq, &entry->msg);
- msi_set_mask_bits(entry->irq, 1, entry->msi_attrib.masked);
+ msi_set_mask_bits(desc, 1, entry->msi_attrib.masked);
}
BUG_ON(list_empty(&dev->msi_list));
@@ -596,7 +616,8 @@ void pci_msi_shutdown(struct pci_dev* de
/* Return the the pci reset with msi irqs unmasked */
if (entry->msi_attrib.maskbit) {
u32 mask = entry->msi_attrib.maskbits_mask;
- msi_set_mask_bits(dev->irq, mask, ~mask);
+ struct irq_desc *desc = irq_to_desc(dev->irq);
+ msi_set_mask_bits(desc, mask, ~mask);
}
if (!entry->dev || entry->msi_attrib.type != PCI_CAP_ID_MSI)
return;
Index: linux-2.6/include/linux/msi.h
===================================================================
--- linux-2.6.orig/include/linux/msi.h
+++ linux-2.6/include/linux/msi.h
@@ -10,8 +10,11 @@ struct msi_msg {
};
/* Helper functions */
+struct irq_desc;
extern void mask_msi_irq(unsigned int irq);
extern void unmask_msi_irq(unsigned int irq);
+extern void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg);
+extern void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg);
extern void read_msi_msg(unsigned int irq, struct msi_msg *msg);
extern void write_msi_msg(unsigned int irq, struct msi_msg *msg);
Index: linux-2.6/arch/x86/include/asm/io_apic.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/io_apic.h
+++ linux-2.6/arch/x86/include/asm/io_apic.h
@@ -198,7 +198,7 @@ extern void restore_IO_APIC_setup(void);
extern void reinit_intr_remapped_IO_APIC(int);
#endif
-extern int probe_nr_irqs(void);
+extern void probe_nr_irqs_gsi(void);
#else /* !CONFIG_X86_IO_APIC */
#define io_apic_assign_pci_irqs 0
Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup.c
+++ linux-2.6/arch/x86/kernel/setup.c
@@ -953,7 +953,7 @@ void __init setup_arch(char **cmdline_p)
ioapic_init_mappings();
/* need to wait for io_apic is mapped */
- nr_irqs = probe_nr_irqs();
+ probe_nr_irqs_gsi();
kvm_guest_init();
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 2/2] irq: move irq_desc according to smp_affinity v3
2008-11-27 2:26 ` [PATCH 1/2] irq: sparseirq enabling v3 Yinghai Lu
@ 2008-11-27 2:26 ` Yinghai Lu
2008-11-28 16:34 ` [PATCH 1/2] irq: sparseirq enabling v3 Ingo Molnar
1 sibling, 0 replies; 20+ messages in thread
From: Yinghai Lu @ 2008-11-27 2:26 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel@vger.kernel.org
impact: new feature move irq_desc with sparseirq
if CONFIG_MOVE_IRQ_DESC is set
make irq_desc to go with affinity aka irq_desc moving etc
call move_irq_desc in irq_complete_move()
legacy irq_desc is not moved, because they are allocated via static array
v3: add calling to irq_to_desc after calling ack/eoi instead of passing desc
for logical apic mode, need to add move_desc_in_progress_in_same_domain. otherwise it will not get moved. ==> also could need two phase to get irq_desc moved.
for example: 0xff is old affinity, and need to set 0xf, and then set to 0xf0.
[ or we need to change domain definition to cpus on the same node ? ]
LBSuse:~ # cat /proc/irq/22/smp_affinity
00000000,00000000,00000000,000000ff
LBSuse:~ # echo f > /proc/irq/22/smp_affinity
LBSuse:~ # cat /proc/irq/22/smp_affinity
00000000,00000000,00000000,0000000f
LBSuse:~ # tail /var/log/messages
...
Oct 27 12:35:34 LBSuse kernel: klogd 1.4.1, log source = /proc/kmsg started.
Oct 27 12:35:34 LBSuse kernel: eth0: no IPv6 routers present
LBSuse:~ # echo f0 > /proc/irq/22/smp_affinity
LBSuse:~ # tail /var/log/messages
Oct 27 12:35:34 LBSuse kernel: klogd 1.4.1, log source = /proc/kmsg started.
Oct 27 12:35:34 LBSuse kernel: eth0: no IPv6 routers present
Oct 27 12:36:46 LBSuse kernel: move irq_desc for 22 aka 0x16 to cpu 7 node 1
Oct 27 12:36:46 LBSuse kernel: alloc kstat_irqs on cpu 7 node 1
Oct 27 12:36:46 LBSuse kernel: alloc irq_cfg on cpu 7 node 1
Oct 27 12:36:46 LBSuse kernel: alloc irq_2_pin on cpu 7 node 1
so assume the user space program should update /proc/irq/XX/smp_affinity to 03 or 0f at first on boot
or we change irq_default_affinity ?
for physical apic is much simple
on 4 sockets 16 cores system
irq_desc is moving..
when
# echo 10 > /proc/irq/134483967/smp_affinity
# echo 100 > /proc/irq/134483967/smp_affinity
# echo 1000 > /proc/irq/134483967/smp_affinity
got
Nov 9 21:39:51 LBSuse kernel: move irq_desc for 134483967 aka 0x8040fff to cpu 4 node 1
Nov 9 21:39:51 LBSuse kernel: alloc kstat_irqs on cpu 4 node 1
Nov 9 21:39:51 LBSuse kernel: alloc irq_cfg on cpu 4 node 1
Nov 9 21:40:05 LBSuse kernel: move irq_desc for 134483967 aka 0x8040fff to cpu 8 node 2
Nov 9 21:40:05 LBSuse kernel: alloc kstat_irqs on cpu 8 node 2
Nov 9 21:40:05 LBSuse kernel: alloc irq_cfg on cpu 8 node 2
Nov 9 21:40:18 LBSuse kernel: move irq_desc for 134483967 aka 0x8040fff to cpu 12 node 3
Nov 9 21:40:18 LBSuse kernel: alloc kstat_irqs on cpu 12 node 3
Nov 9 21:40:18 LBSuse kernel: alloc irq_cfg on cpu 12 node 3
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/Kconfig | 9 ++
arch/x86/kernel/io_apic.c | 143 +++++++++++++++++++++++++++++++++++++++++++++-
kernel/irq/chip.c | 30 +++++++++
kernel/irq/handle.c | 125 +++++++++++++++++++++++++++++++++++++++-
4 files changed, 302 insertions(+), 5 deletions(-)
Index: linux-2.6/arch/x86/Kconfig
===================================================================
--- linux-2.6.orig/arch/x86/Kconfig
+++ linux-2.6/arch/x86/Kconfig
@@ -251,6 +251,15 @@ config SPARSE_IRQ
If you don't know what to do here, say Y.
+config MOVE_IRQ_DESC
+ bool "Move irq desc when changing irq smp_affinity"
+ depends on SPARSE_IRQ && SMP
+ default y
+ help
+ This enables moving irq_desc to cpu/node that irq will use handled.
+
+ If you don't know what to do here, say Y.
+
config X86_FIND_SMP_CONFIG
def_bool y
depends on X86_MPPARSE || X86_VOYAGER
Index: linux-2.6/arch/x86/kernel/io_apic.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/io_apic.c
+++ linux-2.6/arch/x86/kernel/io_apic.c
@@ -141,6 +141,9 @@ struct irq_cfg {
unsigned move_cleanup_count;
u8 vector;
u8 move_in_progress : 1;
+#ifdef CONFIG_MOVE_IRQ_DESC
+ u8 move_desc_in_progress_in_same_domain : 1;
+#endif
};
/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
@@ -230,6 +233,122 @@ void arch_init_chip_data(struct irq_desc
}
}
+#ifdef CONFIG_MOVE_IRQ_DESC
+
+static void init_copy_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg,
+ int cpu)
+{
+ struct irq_pin_list *old_entry, *head, *tail, *entry;
+
+ cfg->irq_2_pin = NULL;
+ old_entry = old_cfg->irq_2_pin;
+ if (!old_entry)
+ return;
+
+ entry = get_one_free_irq_2_pin(cpu);
+ if (!entry)
+ return;
+
+ entry->apic = old_entry->apic;
+ entry->pin = old_entry->pin;
+ head = entry;
+ tail = entry;
+ old_entry = old_entry->next;
+
+ while (old_entry) {
+ entry = get_one_free_irq_2_pin(cpu);
+ if (!entry) {
+ entry = head;
+ while (entry) {
+ head = entry->next;
+ kfree(entry);
+ entry = head;
+ }
+ /* still use the old one */
+ return;
+ }
+ entry->apic = old_entry->apic;
+ entry->pin = old_entry->pin;
+ tail->next = entry;
+ tail = entry;
+ old_entry = old_entry->next;
+ }
+
+ tail->next = NULL;
+ cfg->irq_2_pin = head;
+}
+
+static void free_irq_2_pin(struct irq_cfg *old_cfg, struct irq_cfg *cfg)
+{
+ struct irq_pin_list *entry, *next;
+
+ if (old_cfg->irq_2_pin == cfg->irq_2_pin)
+ return;
+
+ entry = old_cfg->irq_2_pin;
+
+ while (entry) {
+ next = entry->next;
+ kfree(entry);
+ entry = next;
+ }
+ old_cfg->irq_2_pin = NULL;
+}
+
+void arch_init_copy_chip_data(struct irq_desc *old_desc,
+ struct irq_desc *desc, int cpu)
+{
+ struct irq_cfg *cfg;
+ struct irq_cfg *old_cfg;
+
+ cfg = get_one_free_irq_cfg(cpu);
+
+ if (!cfg)
+ return;
+
+ desc->chip_data = cfg;
+
+ old_cfg = old_desc->chip_data;
+
+ memcpy(cfg, old_cfg, sizeof(struct irq_cfg));
+
+ init_copy_irq_2_pin(old_cfg, cfg, cpu);
+}
+
+static void free_irq_cfg(struct irq_cfg *old_cfg)
+{
+ kfree(old_cfg);
+}
+
+void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc)
+{
+ struct irq_cfg *old_cfg, *cfg;
+
+ old_cfg = old_desc->chip_data;
+ cfg = desc->chip_data;
+
+ if (old_cfg == cfg)
+ return;
+
+ if (old_cfg) {
+ free_irq_2_pin(old_cfg, cfg);
+ free_irq_cfg(old_cfg);
+ old_desc->chip_data = NULL;
+ }
+}
+
+static void set_extra_move_desc(struct irq_desc *desc, cpumask_t mask)
+{
+ struct irq_cfg *cfg = desc->chip_data;
+
+ if (!cfg->move_in_progress) {
+ /* it means that domain is not changed */
+ if (!cpus_intersects(desc->affinity, mask))
+ cfg->move_desc_in_progress_in_same_domain = 1;
+ }
+}
+#endif
+
#else
static struct irq_cfg *irq_cfg(unsigned int irq)
{
@@ -238,9 +357,11 @@ static struct irq_cfg *irq_cfg(unsigned
#endif
+#ifndef CONFIG_MOVE_IRQ_DESC
static inline void set_extra_move_desc(struct irq_desc *desc, cpumask_t mask)
{
}
+#endif
struct io_apic {
unsigned int index;
@@ -2345,14 +2466,34 @@ static void irq_complete_move(struct irq
struct irq_cfg *cfg = desc->chip_data;
unsigned vector, me;
- if (likely(!cfg->move_in_progress))
+ if (likely(!cfg->move_in_progress)) {
+#ifdef CONFIG_MOVE_IRQ_DESC
+ if (likely(!cfg->move_desc_in_progress_in_same_domain))
+ return;
+
+ /* domain is not change, but affinity is changed */
+ me = smp_processor_id();
+ if (cpu_isset(me, desc->affinity)) {
+ *descp = desc = move_irq_desc(desc, me);
+ /* get the new one */
+ cfg = desc->chip_data;
+ cfg->move_desc_in_progress_in_same_domain = 0;
+ }
+#endif
return;
+ }
vector = ~get_irq_regs()->orig_ax;
me = smp_processor_id();
if ((vector == cfg->vector) && cpu_isset(me, cfg->domain)) {
cpumask_t cleanup_mask;
+#ifdef CONFIG_MOVE_IRQ_DESC
+ *descp = desc = move_irq_desc(desc, me);
+ /* get the new one */
+ cfg = desc->chip_data;
+#endif
+
cpus_and(cleanup_mask, cfg->old_domain, cpu_online_map);
cfg->move_cleanup_count = cpus_weight(cleanup_mask);
send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
Index: linux-2.6/kernel/irq/handle.c
===================================================================
--- linux-2.6.orig/kernel/irq/handle.c
+++ linux-2.6/kernel/irq/handle.c
@@ -90,6 +90,32 @@ static void init_kstat_irqs(struct irq_d
desc->kstat_irqs = (unsigned int *)ptr;
}
+#ifdef CONFIG_MOVE_IRQ_DESC
+static void init_copy_kstat_irqs(struct irq_desc *old_desc, struct irq_desc *desc,
+ int cpu, int nr)
+{
+ unsigned long bytes;
+
+ init_kstat_irqs(desc, cpu, nr);
+
+ if (desc->kstat_irqs != old_desc->kstat_irqs) {
+ /* Compute how many bytes we need per irq and allocate them */
+ bytes = nr * sizeof(unsigned int);
+
+ memcpy(desc->kstat_irqs, old_desc->kstat_irqs, bytes);
+ }
+}
+
+static void free_kstat_irqs(struct irq_desc *old_desc, struct irq_desc *desc)
+{
+ if (old_desc->kstat_irqs == desc->kstat_irqs)
+ return;
+
+ kfree(old_desc->kstat_irqs);
+ old_desc->kstat_irqs = NULL;
+}
+#endif
+
void __attribute__((weak)) arch_init_chip_data(struct irq_desc *desc, int cpu)
{
}
@@ -110,6 +136,23 @@ static void init_one_irq_desc(int irq, s
arch_init_chip_data(desc, cpu);
}
+#ifdef CONFIG_MOVE_IRQ_DESC
+static void init_copy_one_irq_desc(int irq, struct irq_desc *old_desc,
+ struct irq_desc *desc, int cpu)
+{
+ memcpy(desc, old_desc, sizeof(struct irq_desc));
+ desc->cpu = cpu;
+ lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids);
+ arch_init_copy_chip_data(old_desc, desc, cpu);
+}
+
+static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc)
+{
+ free_kstat_irqs(old_desc, desc);
+ arch_free_chip_data(old_desc, desc);
+}
+#endif
/*
* Protect the sparse_irqs:
*/
@@ -212,6 +255,74 @@ out_unlock:
return desc;
}
+#ifdef CONFIG_MOVE_IRQ_DESC
+static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc,
+ int cpu)
+{
+ struct irq_desc *desc;
+ unsigned int irq;
+ unsigned long flags;
+ int node;
+
+ irq = old_desc->irq;
+
+ spin_lock_irqsave(&sparse_irq_lock, flags);
+
+ /* We have to check it to avoid races with another CPU */
+ desc = irq_desc_ptrs[irq];
+
+ if (desc && old_desc != desc)
+ goto out_unlock;
+
+ node = cpu_to_node(cpu);
+ desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " move irq_desc for %d to cpu %d node %d\n",
+ irq, cpu, node);
+ if (!desc) {
+ printk(KERN_ERR "can not get new irq_desc for moving\n");
+ /* still use old one */
+ desc = old_desc;
+ goto out_unlock;
+ }
+ init_copy_one_irq_desc(irq, old_desc, desc, cpu);
+
+ irq_desc_ptrs[irq] = desc;
+ list_replace_rcu(&old_desc->list, &desc->list);
+
+ /* free the old one */
+ free_one_irq_desc(old_desc, desc);
+ kfree(old_desc);
+
+out_unlock:
+ spin_unlock_irqrestore(&sparse_irq_lock, flags);
+
+ return desc;
+}
+
+struct irq_desc *move_irq_desc(struct irq_desc *desc, int cpu)
+{
+ int old_cpu;
+ int node, old_node;
+
+ /* those all static, do move them */
+ if (desc->irq < NR_IRQS_LEGACY)
+ return desc;
+
+ old_cpu = desc->cpu;
+ printk(KERN_DEBUG "try to move irq_desc from cpu %d to %d\n", old_cpu, cpu);
+ if (old_cpu != cpu) {
+ node = cpu_to_node(cpu);
+ old_node = cpu_to_node(old_cpu);
+ if (old_node != node)
+ desc = __real_move_irq_desc(desc, cpu);
+ else
+ desc->cpu = cpu;
+ }
+
+ return desc;
+}
+#endif
+
#else
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
@@ -346,8 +457,13 @@ unsigned int __do_IRQ(unsigned int irq)
/*
* No locking required for CPU-local interrupts:
*/
- if (desc->chip->ack)
+ if (desc->chip->ack) {
desc->chip->ack(irq);
+#ifdef CONFIG_MOVE_IRQ_DESC
+ /* get new one */
+ desc = irq_to_desc(irq);
+#endif
+ }
if (likely(!(desc->status & IRQ_DISABLED))) {
action_ret = handle_IRQ_event(irq, desc->action);
if (!noirqdebug)
@@ -358,8 +474,13 @@ unsigned int __do_IRQ(unsigned int irq)
}
spin_lock(&desc->lock);
- if (desc->chip->ack)
+ if (desc->chip->ack) {
desc->chip->ack(irq);
+#ifdef CONFIG_MOVE_IRQ_DESC
+ /* get new one */
+ desc = irq_to_desc(irq);
+#endif
+ }
/*
* REPLAY is when Linux resends an IRQ that was dropped earlier
* WAITING is used by probe to mark irqs that are being tested
Index: linux-2.6/kernel/irq/chip.c
===================================================================
--- linux-2.6.orig/kernel/irq/chip.c
+++ linux-2.6/kernel/irq/chip.c
@@ -353,6 +353,10 @@ handle_level_irq(unsigned int irq, struc
spin_lock(&desc->lock);
mask_ack_irq(desc, irq);
+#ifdef CONFIG_MOVE_IRQ_DESC
+ /* get new one */
+ desc = irq_to_desc(irq);
+#endif
if (unlikely(desc->status & IRQ_INPROGRESS))
goto out_unlock;
@@ -430,6 +434,10 @@ handle_fasteoi_irq(unsigned int irq, str
desc->status &= ~IRQ_INPROGRESS;
out:
desc->chip->eoi(irq);
+#ifdef CONFIG_MOVE_IRQ_DESC
+ /* get new one */
+ desc = irq_to_desc(irq);
+#endif
spin_unlock(&desc->lock);
}
@@ -466,12 +474,20 @@ handle_edge_irq(unsigned int irq, struct
!desc->action)) {
desc->status |= (IRQ_PENDING | IRQ_MASKED);
mask_ack_irq(desc, irq);
+#ifdef CONFIG_MOVE_IRQ_DESC
+ /* get new one */
+ desc = irq_to_desc(irq);
+#endif
goto out_unlock;
}
kstat_incr_irqs_this_cpu(irq, desc);
/* Start handling the irq */
desc->chip->ack(irq);
+#ifdef CONFIG_MOVE_IRQ_DESC
+ /* get new one */
+ desc = irq_to_desc(irq);
+#endif
/* Mark the IRQ currently in progress.*/
desc->status |= IRQ_INPROGRESS;
@@ -532,8 +548,13 @@ handle_percpu_irq(unsigned int irq, stru
if (!noirqdebug)
note_interrupt(irq, desc, action_ret);
- if (desc->chip->eoi)
+ if (desc->chip->eoi) {
desc->chip->eoi(irq);
+#ifdef CONFIG_MOVE_IRQ_DESC
+ /* get new one */
+ desc = irq_to_desc(irq);
+#endif
+ }
}
void
@@ -568,8 +589,13 @@ __set_irq_handler(unsigned int irq, irq_
/* Uninstall? */
if (handle == handle_bad_irq) {
- if (desc->chip != &no_irq_chip)
+ if (desc->chip != &no_irq_chip) {
mask_ack_irq(desc, irq);
+#ifdef CONFIG_MOVE_IRQ_DESC
+ /* get new one */
+ desc = irq_to_desc(irq);
+#endif
+ }
desc->status |= IRQ_DISABLED;
desc->depth = 1;
}
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/2] irq: sparseirq enabling v3
2008-11-27 2:26 ` [PATCH 1/2] irq: sparseirq enabling v3 Yinghai Lu
2008-11-27 2:26 ` [PATCH 2/2] irq: move irq_desc according to smp_affinity v3 Yinghai Lu
@ 2008-11-28 16:34 ` Ingo Molnar
2008-11-29 7:13 ` [PATCH] irq: sparseirq enabling v4 Yinghai Lu
1 sibling, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2008-11-28 16:34 UTC (permalink / raw)
To: Yinghai Lu
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
* Yinghai Lu <yinghai@kernel.org> wrote:
> +void __init arch_early_irq_init(void)
> {
> - return irq < nr_irqs ? irq_cfgx + irq : NULL;
> + struct irq_cfg *cfg;
> + struct irq_desc *desc;
> + int count;
> + int i;
> +#ifdef CONFIG_SPARSE_IRQ
> + int count_desc = NR_IRQS_LEGACY;
> +#else
> + int count_desc = NR_IRQS;
> +#endif
could this be hidden in a .h file by creating some sort of nr_boot_irqs()
inline, or a NR_BOOT_IRQS define?
> Index: linux-2.6/drivers/char/random.c
> ===================================================================
> --- linux-2.6.orig/drivers/char/random.c
> +++ linux-2.6/drivers/char/random.c
> @@ -558,6 +558,8 @@ struct timer_rand_state {
> unsigned dont_count_entropy:1;
> };
>
> +#ifndef CONFIG_SPARSE_IRQ
> +
> static struct timer_rand_state *irq_timer_state[NR_IRQS];
>
> static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
> @@ -576,6 +578,33 @@ static void set_timer_rand_state(unsigne
> irq_timer_state[irq] = state;
> }
>
> +#else
> +
> +static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
> +{
> + struct irq_desc *desc;
> +
> + desc = irq_to_desc(irq);
> +
> + if (!desc)
> + return NULL;
> +
> + return desc->timer_rand_state;
> +}
> +
> +static void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state)
> +{
> + struct irq_desc *desc;
> +
> + desc = irq_to_desc(irq);
> +
> + if (!desc)
> + return;
> +
> + desc->timer_rand_state = state;
> +}
> +#endif
i'd suggest to move this into a .h file.
> +++ linux-2.6/fs/proc/stat.c
> @@ -27,6 +27,9 @@ static int show_stat(struct seq_file *p,
> u64 sum = 0;
> struct timespec boottime;
> unsigned int per_irq_sum;
> +#ifdef CONFIG_GENERIC_HARDIRQS
> + struct irq_desc *desc;
> +#endif
Why is this define needed? If it's about a build warning, you can add
something like this to defines:
(void)(param)
to make unused parameters used as well.
> +#ifdef CONFIG_SPARSE_IRQ
> + seq_printf(p, " %d:%u", j, per_irq_sum);
> +#else
> seq_printf(p, " %u", per_irq_sum);
> - }
> +#endif
doesnt this change the /proc ABI ? A couple of tools would break. I think
the right approach is to go from 0 to NR_IRQS-1 and print zeroes for NULL
descs. I.e. a natural extension of the current scheme.
> +++ linux-2.6/fs/proc/interrupts.c
> @@ -8,6 +8,23 @@
> /*
> * /proc/interrupts
> */
> +#ifdef CONFIG_SPARSE_IRQ
> +static void *int_seq_start(struct seq_file *f, loff_t *pos)
> +{
> + rcu_read_lock();
> + return seq_list_start(&sparse_irqs_head, *pos);
is this rcu-safe approach still needed?
> ===================================================================
> --- linux-2.6.orig/include/linux/interrupt.h
> +++ linux-2.6/include/linux/interrupt.h
> @@ -18,6 +18,8 @@
> #include <asm/ptrace.h>
> #include <asm/system.h>
>
> +extern int nr_irqs;
isnt this obsolete now?
> Index: linux-2.6/arch/x86/kernel/irq.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/irq.c
> +++ linux-2.6/arch/x86/kernel/irq.c
> @@ -99,25 +99,37 @@ static int show_other_interrupts(struct
> int show_interrupts(struct seq_file *p, void *v)
> {
> unsigned long flags, any_count = 0;
> - int i = *(loff_t *) v, j;
> + int i, j;
> struct irqaction *action;
> struct irq_desc *desc;
> + int head = 0;
>
> +#ifdef CONFIG_SPARSE_IRQ
> + desc = list_entry(v, struct irq_desc, list);
> + i = desc->irq;
> + if (&desc->list == sparse_irqs_head.next)
> + head = 1;
> +#else
> + i = *(loff_t *) v;
> if (i > nr_irqs)
> return 0;
>
> if (i == nr_irqs)
> return show_other_interrupts(p);
> + if (i == 0)
> + head = 1;
> +
> + desc = irq_to_desc(i);
> +#endif
i dont think this has to change? We have an array of pointers, and we
should extend the current loops by skipping over NULL entries.
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH] irq: sparseirq enabling v4
2008-11-28 16:34 ` [PATCH 1/2] irq: sparseirq enabling v3 Ingo Molnar
@ 2008-11-29 7:13 ` Yinghai Lu
2008-11-29 10:02 ` Ingo Molnar
0 siblings, 1 reply; 20+ messages in thread
From: Yinghai Lu @ 2008-11-29 7:13 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel@vger.kernel.org
impact: new feature sparseirq
add some kind of hash table as Ingo suggesting.
remove dyna_array
when sparse_irq is used (CONFIG_SPARSE_IRQ), use kzalloc_node to get irq_desc, irq_cfg
use desc->chip_data for x86 to store irq_cfg
also prepare
need to add struct (irq_desc **descp) to ack_edge/level to make sure desc get updated
try to pass desc cfg as more as possible to avoid list looking up.
seperate move_irq_desc to another patch
v2: use pointer array instead of hash
v3: remove code for passing desc
v4: remove sparse_irq_head list
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/Kconfig | 10
arch/x86/include/asm/io_apic.h | 2
arch/x86/include/asm/irq_vectors.h | 11
arch/x86/kernel/io_apic.c | 625 ++++++++++++++++++++++---------------
arch/x86/kernel/irq.c | 3
arch/x86/kernel/irq_32.c | 2
arch/x86/kernel/irq_64.c | 2
arch/x86/kernel/irqinit_32.c | 3
arch/x86/kernel/irqinit_64.c | 3
arch/x86/kernel/setup.c | 2
drivers/char/random.c | 22 -
drivers/pci/intr_remapping.c | 76 ++++
drivers/pci/msi.c | 55 ++-
drivers/xen/events.c | 12
fs/proc/stat.c | 17 -
include/linux/interrupt.h | 2
include/linux/irq.h | 54 +++
include/linux/irqnr.h | 14
include/linux/kernel_stat.h | 14
include/linux/msi.h | 3
include/linux/random.h | 51 +++
init/main.c | 11
kernel/irq/autoprobe.c | 15
kernel/irq/chip.c | 3
kernel/irq/handle.c | 187 ++++++++++-
kernel/irq/proc.c | 6
kernel/irq/spurious.c | 5
27 files changed, 891 insertions(+), 319 deletions(-)
Index: linux-2.6/arch/x86/Kconfig
===================================================================
--- linux-2.6.orig/arch/x86/Kconfig
+++ linux-2.6/arch/x86/Kconfig
@@ -241,6 +241,16 @@ config X86_HAS_BOOT_CPU_ID
def_bool y
depends on X86_VOYAGER
+config SPARSE_IRQ
+ bool "Support sparse irq numbering"
+ depends on PCI_MSI || HT_IRQ
+ default y
+ help
+ This enables support for sparse irq, esp for msi/msi-x. You may need
+ if you have lots of cards supports msi-x installed.
+
+ If you don't know what to do here, say Y.
+
config X86_FIND_SMP_CONFIG
def_bool y
depends on X86_MPPARSE || X86_VOYAGER
Index: linux-2.6/arch/x86/kernel/io_apic.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/io_apic.c
+++ linux-2.6/arch/x86/kernel/io_apic.c
@@ -108,8 +108,33 @@ static int __init parse_noapic(char *str
early_param("noapic", parse_noapic);
struct irq_pin_list;
+
+/*
+ * This is performance-critical, we want to do it O(1)
+ *
+ * the indexing order of this array favors 1:1 mappings
+ * between pins and IRQs.
+ */
+
+struct irq_pin_list {
+ int apic, pin;
+ struct irq_pin_list *next;
+};
+
+static struct irq_pin_list *get_one_free_irq_2_pin(int cpu)
+{
+ struct irq_pin_list *pin;
+ int node;
+
+ node = cpu_to_node(cpu);
+
+ pin = kzalloc_node(sizeof(*pin), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_2_pin on cpu %d node %d\n", cpu, node);
+
+ return pin;
+}
+
struct irq_cfg {
- unsigned int irq;
struct irq_pin_list *irq_2_pin;
cpumask_t domain;
cpumask_t old_domain;
@@ -119,81 +144,95 @@ struct irq_cfg {
};
/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_cfg irq_cfgx[] = {
+#else
static struct irq_cfg irq_cfgx[NR_IRQS] = {
- [0] = { .irq = 0, .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
- [1] = { .irq = 1, .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
- [2] = { .irq = 2, .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
- [3] = { .irq = 3, .domain = CPU_MASK_ALL, .vector = IRQ3_VECTOR, },
- [4] = { .irq = 4, .domain = CPU_MASK_ALL, .vector = IRQ4_VECTOR, },
- [5] = { .irq = 5, .domain = CPU_MASK_ALL, .vector = IRQ5_VECTOR, },
- [6] = { .irq = 6, .domain = CPU_MASK_ALL, .vector = IRQ6_VECTOR, },
- [7] = { .irq = 7, .domain = CPU_MASK_ALL, .vector = IRQ7_VECTOR, },
- [8] = { .irq = 8, .domain = CPU_MASK_ALL, .vector = IRQ8_VECTOR, },
- [9] = { .irq = 9, .domain = CPU_MASK_ALL, .vector = IRQ9_VECTOR, },
- [10] = { .irq = 10, .domain = CPU_MASK_ALL, .vector = IRQ10_VECTOR, },
- [11] = { .irq = 11, .domain = CPU_MASK_ALL, .vector = IRQ11_VECTOR, },
- [12] = { .irq = 12, .domain = CPU_MASK_ALL, .vector = IRQ12_VECTOR, },
- [13] = { .irq = 13, .domain = CPU_MASK_ALL, .vector = IRQ13_VECTOR, },
- [14] = { .irq = 14, .domain = CPU_MASK_ALL, .vector = IRQ14_VECTOR, },
- [15] = { .irq = 15, .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
+#endif
+ [0] = { .domain = CPU_MASK_ALL, .vector = IRQ0_VECTOR, },
+ [1] = { .domain = CPU_MASK_ALL, .vector = IRQ1_VECTOR, },
+ [2] = { .domain = CPU_MASK_ALL, .vector = IRQ2_VECTOR, },
+ [3] = { .domain = CPU_MASK_ALL, .vector = IRQ3_VECTOR, },
+ [4] = { .domain = CPU_MASK_ALL, .vector = IRQ4_VECTOR, },
+ [5] = { .domain = CPU_MASK_ALL, .vector = IRQ5_VECTOR, },
+ [6] = { .domain = CPU_MASK_ALL, .vector = IRQ6_VECTOR, },
+ [7] = { .domain = CPU_MASK_ALL, .vector = IRQ7_VECTOR, },
+ [8] = { .domain = CPU_MASK_ALL, .vector = IRQ8_VECTOR, },
+ [9] = { .domain = CPU_MASK_ALL, .vector = IRQ9_VECTOR, },
+ [10] = { .domain = CPU_MASK_ALL, .vector = IRQ10_VECTOR, },
+ [11] = { .domain = CPU_MASK_ALL, .vector = IRQ11_VECTOR, },
+ [12] = { .domain = CPU_MASK_ALL, .vector = IRQ12_VECTOR, },
+ [13] = { .domain = CPU_MASK_ALL, .vector = IRQ13_VECTOR, },
+ [14] = { .domain = CPU_MASK_ALL, .vector = IRQ14_VECTOR, },
+ [15] = { .domain = CPU_MASK_ALL, .vector = IRQ15_VECTOR, },
};
-#define for_each_irq_cfg(irq, cfg) \
- for (irq = 0, cfg = irq_cfgx; irq < nr_irqs; irq++, cfg++)
-
-static struct irq_cfg *irq_cfg(unsigned int irq)
+void __init arch_early_irq_init(void)
{
- return irq < nr_irqs ? irq_cfgx + irq : NULL;
+ struct irq_cfg *cfg;
+ struct irq_desc *desc;
+ int count;
+ int i;
+
+ cfg = irq_cfgx;
+ count = ARRAY_SIZE(irq_cfgx);
+
+ for (i = 0; i < count; i++) {
+ desc = irq_to_desc(i);
+ desc->chip_data = &cfg[i];
+ }
}
-static struct irq_cfg *irq_cfg_alloc(unsigned int irq)
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_cfg *irq_cfg(unsigned int irq)
{
- return irq_cfg(irq);
+ struct irq_cfg *cfg = NULL;
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+ if (desc)
+ cfg = desc->chip_data;
+
+ return cfg;
}
-/*
- * Rough estimation of how many shared IRQs there are, can be changed
- * anytime.
- */
-#define MAX_PLUS_SHARED_IRQS NR_IRQS
-#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
+static struct irq_cfg *get_one_free_irq_cfg(int cpu)
+{
+ struct irq_cfg *cfg;
+ int node;
-/*
- * This is performance-critical, we want to do it O(1)
- *
- * the indexing order of this array favors 1:1 mappings
- * between pins and IRQs.
- */
+ node = cpu_to_node(cpu);
-struct irq_pin_list {
- int apic, pin;
- struct irq_pin_list *next;
-};
+ cfg = kzalloc_node(sizeof(*cfg), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_cfg on cpu %d node %d\n", cpu, node);
-static struct irq_pin_list irq_2_pin_head[PIN_MAP_SIZE];
-static struct irq_pin_list *irq_2_pin_ptr;
+ return cfg;
+}
-static void __init irq_2_pin_init(void)
+void arch_init_chip_data(struct irq_desc *desc, int cpu)
{
- struct irq_pin_list *pin = irq_2_pin_head;
- int i;
-
- for (i = 1; i < PIN_MAP_SIZE; i++)
- pin[i-1].next = &pin[i];
+ struct irq_cfg *cfg;
- irq_2_pin_ptr = &pin[0];
+ cfg = desc->chip_data;
+ if (!cfg) {
+ desc->chip_data = get_one_free_irq_cfg(cpu);
+ if (!desc->chip_data) {
+ printk(KERN_ERR "can not alloc irq_cfg\n");
+ BUG_ON(1);
+ }
+ }
}
-static struct irq_pin_list *get_one_free_irq_2_pin(void)
+#else
+static struct irq_cfg *irq_cfg(unsigned int irq)
{
- struct irq_pin_list *pin = irq_2_pin_ptr;
+ return irq < nr_irqs ? irq_cfgx + irq : NULL;
+}
- if (!pin)
- panic("can not get more irq_2_pin\n");
+#endif
- irq_2_pin_ptr = pin->next;
- pin->next = NULL;
- return pin;
+static inline void set_extra_move_desc(struct irq_desc *desc, cpumask_t mask)
+{
}
struct io_apic {
@@ -237,11 +276,10 @@ static inline void io_apic_modify(unsign
writel(value, &io_apic->data);
}
-static bool io_apic_level_ack_pending(unsigned int irq)
+static bool io_apic_level_ack_pending(struct irq_cfg *cfg)
{
struct irq_pin_list *entry;
unsigned long flags;
- struct irq_cfg *cfg = irq_cfg(irq);
spin_lock_irqsave(&ioapic_lock, flags);
entry = cfg->irq_2_pin;
@@ -323,13 +361,12 @@ static void ioapic_mask_entry(int apic,
}
#ifdef CONFIG_SMP
-static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, u8 vector)
+static void __target_IO_APIC_irq(unsigned int irq, unsigned int dest, struct irq_cfg *cfg)
{
int apic, pin;
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
+ u8 vector = cfg->vector;
- cfg = irq_cfg(irq);
entry = cfg->irq_2_pin;
for (;;) {
unsigned int reg;
@@ -359,24 +396,27 @@ static void __target_IO_APIC_irq(unsigne
}
}
-static int assign_irq_vector(int irq, cpumask_t mask);
+static int assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask);
-static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+static void set_ioapic_affinity_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
unsigned long flags;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- cfg = irq_cfg(irq);
- if (assign_irq_vector(irq, mask))
+ irq = desc->irq;
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
/*
@@ -384,12 +424,20 @@ static void set_ioapic_affinity_irq(unsi
*/
dest = SET_APIC_LOGICAL_ID(dest);
- desc = irq_to_desc(irq);
spin_lock_irqsave(&ioapic_lock, flags);
- __target_IO_APIC_irq(irq, dest, cfg->vector);
+ __target_IO_APIC_irq(irq, dest, cfg);
desc->affinity = mask;
spin_unlock_irqrestore(&ioapic_lock, flags);
}
+
+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ set_ioapic_affinity_irq_desc(desc, mask);
+}
#endif /* CONFIG_SMP */
/*
@@ -397,16 +445,18 @@ static void set_ioapic_affinity_irq(unsi
* shared ISA-space IRQs, so we have to support them. We are super
* fast in the common case, and fast for shared ISA-space IRQs.
*/
-static void add_pin_to_irq(unsigned int irq, int apic, int pin)
+static void add_pin_to_irq_cpu(struct irq_cfg *cfg, int cpu, int apic, int pin)
{
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
- /* first time to refer irq_cfg, so with new */
- cfg = irq_cfg_alloc(irq);
entry = cfg->irq_2_pin;
if (!entry) {
- entry = get_one_free_irq_2_pin();
+ entry = get_one_free_irq_2_pin(cpu);
+ if (!entry) {
+ printk(KERN_ERR "can not alloc irq_2_pin to add %d - %d\n",
+ apic, pin);
+ return;
+ }
cfg->irq_2_pin = entry;
entry->apic = apic;
entry->pin = pin;
@@ -421,7 +471,7 @@ static void add_pin_to_irq(unsigned int
entry = entry->next;
}
- entry->next = get_one_free_irq_2_pin();
+ entry->next = get_one_free_irq_2_pin(cpu);
entry = entry->next;
entry->apic = apic;
entry->pin = pin;
@@ -430,11 +480,10 @@ static void add_pin_to_irq(unsigned int
/*
* Reroute an IRQ to a different pin.
*/
-static void __init replace_pin_at_irq(unsigned int irq,
+static void __init replace_pin_at_irq_cpu(struct irq_cfg *cfg, int cpu,
int oldapic, int oldpin,
int newapic, int newpin)
{
- struct irq_cfg *cfg = irq_cfg(irq);
struct irq_pin_list *entry = cfg->irq_2_pin;
int replaced = 0;
@@ -451,18 +500,16 @@ static void __init replace_pin_at_irq(un
/* why? call replace before add? */
if (!replaced)
- add_pin_to_irq(irq, newapic, newpin);
+ add_pin_to_irq_cpu(cfg, cpu, newapic, newpin);
}
-static inline void io_apic_modify_irq(unsigned int irq,
+static inline void io_apic_modify_irq(struct irq_cfg *cfg,
int mask_and, int mask_or,
void (*final)(struct irq_pin_list *entry))
{
int pin;
- struct irq_cfg *cfg;
struct irq_pin_list *entry;
- cfg = irq_cfg(irq);
for (entry = cfg->irq_2_pin; entry != NULL; entry = entry->next) {
unsigned int reg;
pin = entry->pin;
@@ -475,9 +522,9 @@ static inline void io_apic_modify_irq(un
}
}
-static void __unmask_IO_APIC_irq(unsigned int irq)
+static void __unmask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED, 0, NULL);
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED, 0, NULL);
}
#ifdef CONFIG_X86_64
@@ -492,47 +539,64 @@ void io_apic_sync(struct irq_pin_list *e
readl(&io_apic->data);
}
-static void __mask_IO_APIC_irq(unsigned int irq)
+static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
+ io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, &io_apic_sync);
}
#else /* CONFIG_X86_32 */
-static void __mask_IO_APIC_irq(unsigned int irq)
+static void __mask_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~0, IO_APIC_REDIR_MASKED, NULL);
+ io_apic_modify_irq(cfg, ~0, IO_APIC_REDIR_MASKED, NULL);
}
-static void __mask_and_edge_IO_APIC_irq(unsigned int irq)
+static void __mask_and_edge_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_LEVEL_TRIGGER,
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_LEVEL_TRIGGER,
IO_APIC_REDIR_MASKED, NULL);
}
-static void __unmask_and_level_IO_APIC_irq(unsigned int irq)
+static void __unmask_and_level_IO_APIC_irq(struct irq_cfg *cfg)
{
- io_apic_modify_irq(irq, ~IO_APIC_REDIR_MASKED,
+ io_apic_modify_irq(cfg, ~IO_APIC_REDIR_MASKED,
IO_APIC_REDIR_LEVEL_TRIGGER, NULL);
}
#endif /* CONFIG_X86_32 */
-static void mask_IO_APIC_irq (unsigned int irq)
+static void mask_IO_APIC_irq_desc(struct irq_desc *desc)
{
+ struct irq_cfg *cfg = desc->chip_data;
unsigned long flags;
+ BUG_ON(!cfg);
+
spin_lock_irqsave(&ioapic_lock, flags);
- __mask_IO_APIC_irq(irq);
+ __mask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
-static void unmask_IO_APIC_irq (unsigned int irq)
+static void unmask_IO_APIC_irq_desc(struct irq_desc *desc)
{
+ struct irq_cfg *cfg = desc->chip_data;
unsigned long flags;
spin_lock_irqsave(&ioapic_lock, flags);
- __unmask_IO_APIC_irq(irq);
+ __unmask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
+static void mask_IO_APIC_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ mask_IO_APIC_irq_desc(desc);
+}
+static void unmask_IO_APIC_irq(unsigned int irq)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ unmask_IO_APIC_irq_desc(desc);
+}
+
static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
{
struct IO_APIC_route_entry entry;
@@ -809,7 +873,7 @@ EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector
*/
static int EISA_ELCR(unsigned int irq)
{
- if (irq < 16) {
+ if (irq < NR_IRQS_LEGACY) {
unsigned int port = 0x4d0 + (irq >> 3);
return (inb(port) >> (irq & 7)) & 1;
}
@@ -1034,7 +1098,7 @@ void unlock_vector_lock(void)
spin_unlock(&vector_lock);
}
-static int __assign_irq_vector(int irq, cpumask_t mask)
+static int __assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
{
/*
* NOTE! The local APIC isn't very good at handling
@@ -1050,16 +1114,13 @@ static int __assign_irq_vector(int irq,
static int current_vector = FIRST_DEVICE_VECTOR, current_offset = 0;
unsigned int old_vector;
int cpu;
- struct irq_cfg *cfg;
- cfg = irq_cfg(irq);
+ if ((cfg->move_in_progress) || cfg->move_cleanup_count)
+ return -EBUSY;
/* Only try and allocate irqs on cpus that are present */
cpus_and(mask, mask, cpu_online_map);
- if ((cfg->move_in_progress) || cfg->move_cleanup_count)
- return -EBUSY;
-
old_vector = cfg->vector;
if (old_vector) {
cpumask_t tmp;
@@ -1113,24 +1174,22 @@ next:
return -ENOSPC;
}
-static int assign_irq_vector(int irq, cpumask_t mask)
+static int assign_irq_vector(int irq, struct irq_cfg *cfg, cpumask_t mask)
{
int err;
unsigned long flags;
spin_lock_irqsave(&vector_lock, flags);
- err = __assign_irq_vector(irq, mask);
+ err = __assign_irq_vector(irq, cfg, mask);
spin_unlock_irqrestore(&vector_lock, flags);
return err;
}
-static void __clear_irq_vector(int irq)
+static void __clear_irq_vector(int irq, struct irq_cfg *cfg)
{
- struct irq_cfg *cfg;
cpumask_t mask;
int cpu, vector;
- cfg = irq_cfg(irq);
BUG_ON(!cfg->vector);
vector = cfg->vector;
@@ -1162,9 +1221,13 @@ void __setup_vector_irq(int cpu)
/* This function must be called with vector_lock held */
int irq, vector;
struct irq_cfg *cfg;
+ struct irq_desc *desc;
/* Mark the inuse vectors */
- for_each_irq_cfg(irq, cfg) {
+ for_each_irq_desc(irq, desc) {
+ if (!desc)
+ continue;
+ cfg = desc->chip_data;
if (!cpu_isset(cpu, cfg->domain))
continue;
vector = cfg->vector;
@@ -1215,11 +1278,8 @@ static inline int IO_APIC_irq_trigger(in
}
#endif
-static void ioapic_register_intr(int irq, unsigned long trigger)
+static void ioapic_register_intr(int irq, struct irq_desc *desc, unsigned long trigger)
{
- struct irq_desc *desc;
-
- desc = irq_to_desc(irq);
if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
trigger == IOAPIC_LEVEL)
@@ -1311,7 +1371,7 @@ static int setup_ioapic_entry(int apic,
return 0;
}
-static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq,
+static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_desc *desc,
int trigger, int polarity)
{
struct irq_cfg *cfg;
@@ -1321,10 +1381,10 @@ static void setup_IO_APIC_irq(int apic,
if (!IO_APIC_IRQ(irq))
return;
- cfg = irq_cfg(irq);
+ cfg = desc->chip_data;
mask = TARGET_CPUS;
- if (assign_irq_vector(irq, mask))
+ if (assign_irq_vector(irq, cfg, mask))
return;
cpus_and(mask, cfg->domain, mask);
@@ -1341,12 +1401,12 @@ static void setup_IO_APIC_irq(int apic,
cfg->vector)) {
printk("Failed to setup ioapic entry for ioapic %d, pin %d\n",
mp_ioapics[apic].mp_apicid, pin);
- __clear_irq_vector(irq);
+ __clear_irq_vector(irq, cfg);
return;
}
- ioapic_register_intr(irq, trigger);
- if (irq < 16)
+ ioapic_register_intr(irq, desc, trigger);
+ if (irq < NR_IRQS_LEGACY)
disable_8259A_irq(irq);
ioapic_write_entry(apic, pin, entry);
@@ -1356,6 +1416,9 @@ static void __init setup_IO_APIC_irqs(vo
{
int apic, pin, idx, irq;
int notcon = 0;
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+ int cpu = boot_cpu_id;
apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
@@ -1387,9 +1450,15 @@ static void __init setup_IO_APIC_irqs(vo
if (multi_timer_check(apic, irq))
continue;
#endif
- add_pin_to_irq(irq, apic, pin);
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", irq);
+ continue;
+ }
+ cfg = desc->chip_data;
+ add_pin_to_irq_cpu(cfg, cpu, apic, pin);
- setup_IO_APIC_irq(apic, pin, irq,
+ setup_IO_APIC_irq(apic, pin, irq, desc,
irq_trigger(idx), irq_polarity(idx));
}
}
@@ -1448,6 +1517,7 @@ __apicdebuginit(void) print_IO_APIC(void
union IO_APIC_reg_03 reg_03;
unsigned long flags;
struct irq_cfg *cfg;
+ struct irq_desc *desc;
unsigned int irq;
if (apic_verbosity == APIC_QUIET)
@@ -1537,8 +1607,13 @@ __apicdebuginit(void) print_IO_APIC(void
}
}
printk(KERN_DEBUG "IRQ to pin mappings:\n");
- for_each_irq_cfg(irq, cfg) {
- struct irq_pin_list *entry = cfg->irq_2_pin;
+ for_each_irq_desc(irq, desc) {
+ struct irq_pin_list *entry;
+
+ if (!desc)
+ continue;
+ cfg = desc->chip_data;
+ entry = cfg->irq_2_pin;
if (!entry)
continue;
printk(KERN_DEBUG "IRQ%d ", irq);
@@ -2022,14 +2097,16 @@ static unsigned int startup_ioapic_irq(u
{
int was_pending = 0;
unsigned long flags;
+ struct irq_cfg *cfg;
spin_lock_irqsave(&ioapic_lock, flags);
- if (irq < 16) {
+ if (irq < NR_IRQS_LEGACY) {
disable_8259A_irq(irq);
if (i8259A_irq_pending(irq))
was_pending = 1;
}
- __unmask_IO_APIC_irq(irq);
+ cfg = irq_cfg(irq);
+ __unmask_IO_APIC_irq(cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
return was_pending;
@@ -2092,35 +2169,37 @@ static DECLARE_DELAYED_WORK(ir_migration
* as simple as edge triggered migration and we can do the irq migration
* with a simple atomic update to IO-APIC RTE.
*/
-static void migrate_ioapic_irq(int irq, cpumask_t mask)
+static void migrate_ioapic_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
struct irq_cfg *cfg;
- struct irq_desc *desc;
cpumask_t tmp, cleanup_mask;
struct irte irte;
int modify_ioapic_rte;
unsigned int dest;
unsigned long flags;
+ unsigned int irq;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
+ irq = desc->irq;
if (get_irte(irq, &irte))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
- desc = irq_to_desc(irq);
modify_ioapic_rte = desc->status & IRQ_LEVEL;
if (modify_ioapic_rte) {
spin_lock_irqsave(&ioapic_lock, flags);
- __target_IO_APIC_irq(irq, dest, cfg->vector);
+ __target_IO_APIC_irq(irq, dest, cfg);
spin_unlock_irqrestore(&ioapic_lock, flags);
}
@@ -2142,14 +2221,14 @@ static void migrate_ioapic_irq(int irq,
desc->affinity = mask;
}
-static int migrate_irq_remapped_level(int irq)
+static int migrate_irq_remapped_level_desc(struct irq_desc *desc)
{
int ret = -1;
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_cfg *cfg = desc->chip_data;
- mask_IO_APIC_irq(irq);
+ mask_IO_APIC_irq_desc(desc);
- if (io_apic_level_ack_pending(irq)) {
+ if (io_apic_level_ack_pending(cfg)) {
/*
* Interrupt in progress. Migrating irq now will change the
* vector information in the IO-APIC RTE and that will confuse
@@ -2161,14 +2240,15 @@ static int migrate_irq_remapped_level(in
}
/* everthing is clear. we have right of way */
- migrate_ioapic_irq(irq, desc->pending_mask);
+ migrate_ioapic_irq_desc(desc, desc->pending_mask);
ret = 0;
desc->status &= ~IRQ_MOVE_PENDING;
cpus_clear(desc->pending_mask);
unmask:
- unmask_IO_APIC_irq(irq);
+ unmask_IO_APIC_irq_desc(desc);
+
return ret;
}
@@ -2178,6 +2258,9 @@ static void ir_irq_migration(struct work
struct irq_desc *desc;
for_each_irq_desc(irq, desc) {
+ if (!desc)
+ continue;
+
if (desc->status & IRQ_MOVE_PENDING) {
unsigned long flags;
@@ -2198,18 +2281,22 @@ static void ir_irq_migration(struct work
/*
* Migrates the IRQ destination in the process context.
*/
-static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+static void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, cpumask_t mask)
{
- struct irq_desc *desc = irq_to_desc(irq);
-
if (desc->status & IRQ_LEVEL) {
desc->status |= IRQ_MOVE_PENDING;
desc->pending_mask = mask;
- migrate_irq_remapped_level(irq);
+ migrate_irq_remapped_level_desc(desc);
return;
}
- migrate_ioapic_irq(irq, mask);
+ migrate_ioapic_irq_desc(desc, mask);
+}
+static void set_ir_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ set_ir_ioapic_affinity_irq_desc(desc, mask);
}
#endif
@@ -2229,6 +2316,9 @@ asmlinkage void smp_irq_move_cleanup_int
struct irq_cfg *cfg;
irq = __get_cpu_var(vector_irq)[vector];
+ if (irq == -1)
+ continue;
+
desc = irq_to_desc(irq);
if (!desc)
continue;
@@ -2250,9 +2340,10 @@ unlock:
irq_exit();
}
-static void irq_complete_move(unsigned int irq)
+static void irq_complete_move(struct irq_desc **descp)
{
- struct irq_cfg *cfg = irq_cfg(irq);
+ struct irq_desc *desc = *descp;
+ struct irq_cfg *cfg = desc->chip_data;
unsigned vector, me;
if (likely(!cfg->move_in_progress))
@@ -2270,8 +2361,9 @@ static void irq_complete_move(unsigned i
}
}
#else
-static inline void irq_complete_move(unsigned int irq) {}
+static inline void irq_complete_move(struct irq_desc **descp) {}
#endif
+
#ifdef CONFIG_INTR_REMAP
static void ack_x2apic_level(unsigned int irq)
{
@@ -2282,11 +2374,14 @@ static void ack_x2apic_edge(unsigned int
{
ack_x2APIC_irq();
}
+
#endif
static void ack_apic_edge(unsigned int irq)
{
- irq_complete_move(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ irq_complete_move(&desc);
move_native_irq(irq);
ack_APIC_irq();
}
@@ -2295,18 +2390,21 @@ atomic_t irq_mis_count;
static void ack_apic_level(unsigned int irq)
{
+ struct irq_desc *desc = irq_to_desc(irq);
+
#ifdef CONFIG_X86_32
unsigned long v;
int i;
#endif
+ struct irq_cfg *cfg;
int do_unmask_irq = 0;
- irq_complete_move(irq);
+ irq_complete_move(&desc);
#ifdef CONFIG_GENERIC_PENDING_IRQ
/* If we are moving the irq we need to mask it */
- if (unlikely(irq_to_desc(irq)->status & IRQ_MOVE_PENDING)) {
+ if (unlikely(desc->status & IRQ_MOVE_PENDING)) {
do_unmask_irq = 1;
- mask_IO_APIC_irq(irq);
+ mask_IO_APIC_irq_desc(desc);
}
#endif
@@ -2330,7 +2428,8 @@ static void ack_apic_level(unsigned int
* operation to prevent an edge-triggered interrupt escaping meanwhile.
* The idea is from Manfred Spraul. --macro
*/
- i = irq_cfg(irq)->vector;
+ cfg = desc->chip_data;
+ i = cfg->vector;
v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
#endif
@@ -2369,17 +2468,18 @@ static void ack_apic_level(unsigned int
* accurate and is causing problems then it is a hardware bug
* and you can go talk to the chipset vendor about it.
*/
- if (!io_apic_level_ack_pending(irq))
+ cfg = desc->chip_data;
+ if (!io_apic_level_ack_pending(cfg))
move_masked_irq(irq);
- unmask_IO_APIC_irq(irq);
+ unmask_IO_APIC_irq_desc(desc);
}
#ifdef CONFIG_X86_32
if (!(v & (1 << (i & 0x1f)))) {
atomic_inc(&irq_mis_count);
spin_lock(&ioapic_lock);
- __mask_and_edge_IO_APIC_irq(irq);
- __unmask_and_level_IO_APIC_irq(irq);
+ __mask_and_edge_IO_APIC_irq(cfg);
+ __unmask_and_level_IO_APIC_irq(cfg);
spin_unlock(&ioapic_lock);
}
#endif
@@ -2430,20 +2530,22 @@ static inline void init_IO_APIC_traps(vo
* Also, we've got to be careful not to trash gate
* 0x80, because int 0x80 is hm, kind of importantish. ;)
*/
- for_each_irq_cfg(irq, cfg) {
- if (IO_APIC_IRQ(irq) && !cfg->vector) {
+ for_each_irq_desc(irq, desc) {
+ if (!desc)
+ continue;
+
+ cfg = desc->chip_data;
+ if (IO_APIC_IRQ(irq) && cfg && !cfg->vector) {
/*
* Hmm.. We don't have an entry for this,
* so default to an old-fashioned 8259
* interrupt if we can..
*/
- if (irq < 16)
+ if (irq < NR_IRQS_LEGACY)
make_8259A_irq(irq);
- else {
- desc = irq_to_desc(irq);
+ else
/* Strange. Oh, well.. */
desc->chip = &no_irq_chip;
- }
}
}
}
@@ -2468,7 +2570,7 @@ static void unmask_lapic_irq(unsigned in
apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED);
}
-static void ack_lapic_irq (unsigned int irq)
+static void ack_lapic_irq(unsigned int irq)
{
ack_APIC_irq();
}
@@ -2480,11 +2582,8 @@ static struct irq_chip lapic_chip __read
.ack = ack_lapic_irq,
};
-static void lapic_register_intr(int irq)
+static void lapic_register_intr(int irq, struct irq_desc *desc)
{
- struct irq_desc *desc;
-
- desc = irq_to_desc(irq);
desc->status &= ~IRQ_LEVEL;
set_irq_chip_and_handler_name(irq, &lapic_chip, handle_edge_irq,
"edge");
@@ -2588,7 +2687,9 @@ int timer_through_8259 __initdata;
*/
static inline void __init check_timer(void)
{
- struct irq_cfg *cfg = irq_cfg(0);
+ struct irq_desc *desc = irq_to_desc(0);
+ struct irq_cfg *cfg = desc->chip_data;
+ int cpu = boot_cpu_id;
int apic1, pin1, apic2, pin2;
unsigned long flags;
unsigned int ver;
@@ -2603,7 +2704,7 @@ static inline void __init check_timer(vo
* get/set the timer IRQ vector:
*/
disable_8259A_irq(0);
- assign_irq_vector(0, TARGET_CPUS);
+ assign_irq_vector(0, cfg, TARGET_CPUS);
/*
* As IRQ0 is to be enabled in the 8259A, the virtual
@@ -2654,10 +2755,10 @@ static inline void __init check_timer(vo
* Ok, does IRQ0 through the IOAPIC work?
*/
if (no_pin1) {
- add_pin_to_irq(0, apic1, pin1);
+ add_pin_to_irq_cpu(cfg, cpu, apic1, pin1);
setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
}
- unmask_IO_APIC_irq(0);
+ unmask_IO_APIC_irq_desc(desc);
if (timer_irq_works()) {
if (nmi_watchdog == NMI_IO_APIC) {
setup_nmi();
@@ -2683,9 +2784,9 @@ static inline void __init check_timer(vo
/*
* legacy devices should be connected to IO APIC #0
*/
- replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
+ replace_pin_at_irq_cpu(cfg, cpu, apic1, pin1, apic2, pin2);
setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
- unmask_IO_APIC_irq(0);
+ unmask_IO_APIC_irq_desc(desc);
enable_8259A_irq(0);
if (timer_irq_works()) {
apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
@@ -2717,7 +2818,7 @@ static inline void __init check_timer(vo
apic_printk(APIC_QUIET, KERN_INFO
"...trying to set up timer as Virtual Wire IRQ...\n");
- lapic_register_intr(0);
+ lapic_register_intr(0, desc);
apic_write(APIC_LVT0, APIC_DM_FIXED | cfg->vector); /* Fixed mode */
enable_8259A_irq(0);
@@ -2902,22 +3003,26 @@ unsigned int create_irq_nr(unsigned int
unsigned int irq;
unsigned int new;
unsigned long flags;
- struct irq_cfg *cfg_new;
-
- irq_want = nr_irqs - 1;
+ struct irq_cfg *cfg_new = NULL;
+ int cpu = boot_cpu_id;
+ struct irq_desc *desc_new = NULL;
irq = 0;
spin_lock_irqsave(&vector_lock, flags);
- for (new = irq_want; new > 0; new--) {
+ for (new = irq_want; new < NR_IRQS; new++) {
if (platform_legacy_irq(new))
continue;
- cfg_new = irq_cfg(new);
- if (cfg_new && cfg_new->vector != 0)
+
+ desc_new = irq_to_desc_alloc_cpu(new, cpu);
+ if (!desc_new) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", new);
+ continue;
+ }
+ cfg_new = desc_new->chip_data;
+
+ if (cfg_new->vector != 0)
continue;
- /* check if need to create one */
- if (!cfg_new)
- cfg_new = irq_cfg_alloc(new);
- if (__assign_irq_vector(new, TARGET_CPUS) == 0)
+ if (__assign_irq_vector(new, cfg_new, TARGET_CPUS) == 0)
irq = new;
break;
}
@@ -2925,15 +3030,21 @@ unsigned int create_irq_nr(unsigned int
if (irq > 0) {
dynamic_irq_init(irq);
+ /* restore it, in case dynamic_irq_init clear it */
+ if (desc_new)
+ desc_new->chip_data = cfg_new;
}
return irq;
}
+static int nr_irqs_gsi = NR_IRQS_LEGACY;
int create_irq(void)
{
+ unsigned int irq_want;
int irq;
- irq = create_irq_nr(nr_irqs - 1);
+ irq_want = nr_irqs_gsi;
+ irq = create_irq_nr(irq_want);
if (irq == 0)
irq = -1;
@@ -2944,14 +3055,22 @@ int create_irq(void)
void destroy_irq(unsigned int irq)
{
unsigned long flags;
+ struct irq_cfg *cfg;
+ struct irq_desc *desc;
+ /* store it, in case dynamic_irq_cleanup clear it */
+ desc = irq_to_desc(irq);
+ cfg = desc->chip_data;
dynamic_irq_cleanup(irq);
+ /* connect back irq_cfg */
+ if (desc)
+ desc->chip_data = cfg;
#ifdef CONFIG_INTR_REMAP
free_irte(irq);
#endif
spin_lock_irqsave(&vector_lock, flags);
- __clear_irq_vector(irq);
+ __clear_irq_vector(irq, cfg);
spin_unlock_irqrestore(&vector_lock, flags);
}
@@ -2966,12 +3085,12 @@ static int msi_compose_msg(struct pci_de
unsigned dest;
cpumask_t tmp;
+ cfg = irq_cfg(irq);
tmp = TARGET_CPUS;
- err = assign_irq_vector(irq, tmp);
+ err = assign_irq_vector(irq, cfg, tmp);
if (err)
return err;
- cfg = irq_cfg(irq);
cpus_and(tmp, cfg->domain, tmp);
dest = cpu_mask_to_apicid(tmp);
@@ -3029,35 +3148,35 @@ static int msi_compose_msg(struct pci_de
#ifdef CONFIG_SMP
static void set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
- read_msi_msg(irq, &msg);
+ read_msi_msg_desc(desc, &msg);
msg.data &= ~MSI_DATA_VECTOR_MASK;
msg.data |= MSI_DATA_VECTOR(cfg->vector);
msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
- write_msi_msg(irq, &msg);
- desc = irq_to_desc(irq);
+ write_msi_msg_desc(desc, &msg);
desc->affinity = mask;
}
-
#ifdef CONFIG_INTR_REMAP
/*
* Migrate the MSI irq to another cpumask. This migration is
@@ -3065,11 +3184,11 @@ static void set_msi_irq_affinity(unsigne
*/
static void ir_set_msi_irq_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
unsigned int dest;
cpumask_t tmp, cleanup_mask;
struct irte irte;
- struct irq_desc *desc;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
@@ -3078,10 +3197,12 @@ static void ir_set_msi_irq_affinity(unsi
if (get_irte(irq, &irte))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3105,9 +3226,9 @@ static void ir_set_msi_irq_affinity(unsi
cfg->move_in_progress = 0;
}
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
#endif
#endif /* CONFIG_SMP */
@@ -3166,7 +3287,7 @@ static int msi_alloc_irte(struct pci_dev
}
#endif
-static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc, int irq)
+static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
{
int ret;
struct msi_msg msg;
@@ -3175,7 +3296,7 @@ static int setup_msi_irq(struct pci_dev
if (ret < 0)
return ret;
- set_irq_msi(irq, desc);
+ set_irq_msi(irq, msidesc);
write_msi_msg(irq, &msg);
#ifdef CONFIG_INTR_REMAP
@@ -3195,26 +3316,13 @@ static int setup_msi_irq(struct pci_dev
return 0;
}
-static unsigned int build_irq_for_pci_dev(struct pci_dev *dev)
-{
- unsigned int irq;
-
- irq = dev->bus->number;
- irq <<= 8;
- irq |= dev->devfn;
- irq <<= 12;
-
- return irq;
-}
-
-int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
+int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc)
{
unsigned int irq;
int ret;
unsigned int irq_want;
- irq_want = build_irq_for_pci_dev(dev) + 0x100;
-
+ irq_want = nr_irqs_gsi;
irq = create_irq_nr(irq_want);
if (irq == 0)
return -1;
@@ -3228,7 +3336,7 @@ int arch_setup_msi_irq(struct pci_dev *d
goto error;
no_ir:
#endif
- ret = setup_msi_irq(dev, desc, irq);
+ ret = setup_msi_irq(dev, msidesc, irq);
if (ret < 0) {
destroy_irq(irq);
return ret;
@@ -3246,7 +3354,7 @@ int arch_setup_msi_irqs(struct pci_dev *
{
unsigned int irq;
int ret, sub_handle;
- struct msi_desc *desc;
+ struct msi_desc *msidesc;
unsigned int irq_want;
#ifdef CONFIG_INTR_REMAP
@@ -3254,10 +3362,11 @@ int arch_setup_msi_irqs(struct pci_dev *
int index = 0;
#endif
- irq_want = build_irq_for_pci_dev(dev) + 0x100;
+ irq_want = nr_irqs_gsi;
sub_handle = 0;
- list_for_each_entry(desc, &dev->msi_list, list) {
- irq = create_irq_nr(irq_want--);
+ list_for_each_entry(msidesc, &dev->msi_list, list) {
+ irq = create_irq_nr(irq_want);
+ irq_want++;
if (irq == 0)
return -1;
#ifdef CONFIG_INTR_REMAP
@@ -3289,7 +3398,7 @@ int arch_setup_msi_irqs(struct pci_dev *
}
no_ir:
#endif
- ret = setup_msi_irq(dev, desc, irq);
+ ret = setup_msi_irq(dev, msidesc, irq);
if (ret < 0)
goto error;
sub_handle++;
@@ -3310,20 +3419,22 @@ void arch_teardown_msi_irq(unsigned int
#ifdef CONFIG_SMP
static void dmar_msi_set_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3335,9 +3446,9 @@ static void dmar_msi_set_affinity(unsign
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
dmar_msi_write(irq, &msg);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
#endif /* CONFIG_SMP */
struct irq_chip dmar_msi_type = {
@@ -3371,8 +3482,8 @@ int arch_setup_dmar_msi(unsigned int irq
#ifdef CONFIG_SMP
static void hpet_msi_set_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
- struct irq_desc *desc;
struct msi_msg msg;
unsigned int dest;
cpumask_t tmp;
@@ -3381,10 +3492,12 @@ static void hpet_msi_set_affinity(unsign
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
@@ -3396,9 +3509,9 @@ static void hpet_msi_set_affinity(unsign
msg.address_lo |= MSI_ADDR_DEST_ID(dest);
hpet_msi_write(irq, &msg);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
#endif /* CONFIG_SMP */
struct irq_chip hpet_msi_type = {
@@ -3453,26 +3566,28 @@ static void target_ht_irq(unsigned int i
static void set_ht_irq_affinity(unsigned int irq, cpumask_t mask)
{
+ struct irq_desc *desc = irq_to_desc(irq);
struct irq_cfg *cfg;
unsigned int dest;
cpumask_t tmp;
- struct irq_desc *desc;
cpus_and(tmp, mask, cpu_online_map);
if (cpus_empty(tmp))
return;
- if (assign_irq_vector(irq, mask))
+ cfg = desc->chip_data;
+ if (assign_irq_vector(irq, cfg, mask))
return;
- cfg = irq_cfg(irq);
+ set_extra_move_desc(desc, mask);
+
cpus_and(tmp, cfg->domain, mask);
dest = cpu_mask_to_apicid(tmp);
target_ht_irq(irq, dest, cfg->vector);
- desc = irq_to_desc(irq);
desc->affinity = mask;
}
+
#endif
static struct irq_chip ht_irq_chip = {
@@ -3492,13 +3607,13 @@ int arch_setup_ht_irq(unsigned int irq,
int err;
cpumask_t tmp;
+ cfg = irq_cfg(irq);
tmp = TARGET_CPUS;
- err = assign_irq_vector(irq, tmp);
+ err = assign_irq_vector(irq, cfg, tmp);
if (!err) {
struct ht_irq_msg msg;
unsigned dest;
- cfg = irq_cfg(irq);
cpus_and(tmp, cfg->domain, tmp);
dest = cpu_mask_to_apicid(tmp);
@@ -3544,7 +3659,9 @@ int arch_enable_uv_irq(char *irq_name, u
unsigned long flags;
int err;
- err = assign_irq_vector(irq, *eligible_cpu);
+ cfg = irq_cfg(irq);
+
+ err = assign_irq_vector(irq, cfg, *eligible_cpu);
if (err != 0)
return err;
@@ -3553,8 +3670,6 @@ int arch_enable_uv_irq(char *irq_name, u
irq_name);
spin_unlock_irqrestore(&vector_lock, flags);
- cfg = irq_cfg(irq);
-
mmr_value = 0;
entry = (struct uv_IO_APIC_route_entry *)&mmr_value;
BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
@@ -3606,9 +3721,16 @@ int __init io_apic_get_redir_entries (in
return reg_01.bits.entries;
}
-int __init probe_nr_irqs(void)
+void __init probe_nr_irqs_gsi(void)
{
- return NR_IRQS;
+ int idx;
+ int nr = 0;
+
+ for (idx = 0; idx < nr_ioapics; idx++)
+ nr += io_apic_get_redir_entries(idx) + 1;
+
+ if (nr > nr_irqs_gsi)
+ nr_irqs_gsi = nr;
}
/* --------------------------------------------------------------------------
@@ -3707,19 +3829,31 @@ int __init io_apic_get_version(int ioapi
int io_apic_set_pci_routing (int ioapic, int pin, int irq, int triggering, int polarity)
{
+ struct irq_desc *desc;
+ struct irq_cfg *cfg;
+ int cpu = boot_cpu_id;
+
if (!IO_APIC_IRQ(irq)) {
apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
ioapic);
return -EINVAL;
}
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc %d\n", irq);
+ return 0;
+ }
+
/*
* IRQs < 16 are already in the irq_2_pin[] map
*/
- if (irq >= 16)
- add_pin_to_irq(irq, ioapic, pin);
+ if (irq >= NR_IRQS_LEGACY) {
+ cfg = desc->chip_data;
+ add_pin_to_irq_cpu(cfg, cpu, ioapic, pin);
+ }
- setup_IO_APIC_irq(ioapic, pin, irq, triggering, polarity);
+ setup_IO_APIC_irq(ioapic, pin, irq, desc, triggering, polarity);
return 0;
}
@@ -3773,9 +3907,10 @@ void __init setup_ioapic_dest(void)
* when you have too many devices, because at that time only boot
* cpu is online.
*/
- cfg = irq_cfg(irq);
+ desc = irq_to_desc(irq);
+ cfg = desc->chip_data;
if (!cfg->vector) {
- setup_IO_APIC_irq(ioapic, pin, irq,
+ setup_IO_APIC_irq(ioapic, pin, irq, desc,
irq_trigger(irq_entry),
irq_polarity(irq_entry));
continue;
@@ -3785,7 +3920,6 @@ void __init setup_ioapic_dest(void)
/*
* Honour affinities which have been set in early boot
*/
- desc = irq_to_desc(irq);
if (desc->status &
(IRQ_NO_BALANCING | IRQ_AFFINITY_SET))
mask = desc->affinity;
@@ -3794,10 +3928,10 @@ void __init setup_ioapic_dest(void)
#ifdef CONFIG_INTR_REMAP
if (intr_remapping_enabled)
- set_ir_ioapic_affinity_irq(irq, mask);
+ set_ir_ioapic_affinity_irq_desc(desc, mask);
else
#endif
- set_ioapic_affinity_irq(irq, mask);
+ set_ioapic_affinity_irq_desc(desc, mask);
}
}
@@ -3846,7 +3980,6 @@ void __init ioapic_init_mappings(void)
struct resource *ioapic_res;
int i;
- irq_2_pin_init();
ioapic_res = ioapic_setup_resources();
for (i = 0; i < nr_ioapics; i++) {
if (smp_found_config) {
Index: linux-2.6/arch/x86/kernel/irqinit_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irqinit_32.c
+++ linux-2.6/arch/x86/kernel/irqinit_32.c
@@ -68,8 +68,7 @@ void __init init_ISA_irqs (void)
/*
* 16 old-style INTA-cycle interrupts:
*/
- for (i = 0; i < 16; i++) {
- /* first time call this irq_desc */
+ for (i = 0; i < NR_IRQS_LEGACY; i++) {
struct irq_desc *desc = irq_to_desc(i);
desc->status = IRQ_DISABLED;
Index: linux-2.6/arch/x86/kernel/irqinit_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irqinit_64.c
+++ linux-2.6/arch/x86/kernel/irqinit_64.c
@@ -76,8 +76,7 @@ void __init init_ISA_irqs(void)
init_bsp_APIC();
init_8259A(0);
- for (i = 0; i < 16; i++) {
- /* first time call this irq_desc */
+ for (i = 0; i < NR_IRQS_LEGACY; i++) {
struct irq_desc *desc = irq_to_desc(i);
desc->status = IRQ_DISABLED;
Index: linux-2.6/drivers/char/random.c
===================================================================
--- linux-2.6.orig/drivers/char/random.c
+++ linux-2.6/drivers/char/random.c
@@ -558,23 +558,9 @@ struct timer_rand_state {
unsigned dont_count_entropy:1;
};
-static struct timer_rand_state *irq_timer_state[NR_IRQS];
-
-static struct timer_rand_state *get_timer_rand_state(unsigned int irq)
-{
- if (irq >= nr_irqs)
- return NULL;
-
- return irq_timer_state[irq];
-}
-
-static void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state)
-{
- if (irq >= nr_irqs)
- return;
-
- irq_timer_state[irq] = state;
-}
+#ifndef CONFIG_SPARSE_IRQ
+struct timer_rand_state *irq_timer_state[NR_IRQS];
+#endif
static struct timer_rand_state input_timer_state;
@@ -933,8 +919,10 @@ void rand_initialize_irq(int irq)
{
struct timer_rand_state *state;
+#ifndef CONFIG_SPARSE_IRQ
if (irq >= nr_irqs)
return;
+#endif
state = get_timer_rand_state(irq);
Index: linux-2.6/drivers/pci/intr_remapping.c
===================================================================
--- linux-2.6.orig/drivers/pci/intr_remapping.c
+++ linux-2.6/drivers/pci/intr_remapping.c
@@ -19,17 +19,75 @@ struct irq_2_iommu {
u8 irte_mask;
};
-static struct irq_2_iommu irq_2_iommuX[NR_IRQS];
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_2_iommu *get_one_free_irq_2_iommu(int cpu)
+{
+ struct irq_2_iommu *iommu;
+ int node;
+
+ node = cpu_to_node(cpu);
+
+ iommu = kzalloc_node(sizeof(*iommu), GFP_ATOMIC, node);
+ printk(KERN_DEBUG "alloc irq_2_iommu on cpu %d node %d\n", cpu, node);
+
+ return iommu;
+}
static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
{
- return (irq < nr_irqs) ? irq_2_iommuX + irq : NULL;
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (WARN_ON_ONCE(!desc))
+ return NULL;
+
+ return desc->irq_2_iommu;
+}
+
+static struct irq_2_iommu *irq_2_iommu_alloc_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc;
+ struct irq_2_iommu *irq_iommu;
+
+ /*
+ * alloc irq desc if not allocated already.
+ */
+ desc = irq_to_desc_alloc_cpu(irq, cpu);
+ if (!desc) {
+ printk(KERN_INFO "can not get irq_desc for %d\n", irq);
+ return NULL;
+ }
+
+ irq_iommu = desc->irq_2_iommu;
+
+ if (!irq_iommu)
+ desc->irq_2_iommu = get_one_free_irq_2_iommu(cpu);
+
+ return desc->irq_2_iommu;
+}
+
+static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
+{
+ return irq_2_iommu_alloc_cpu(irq, boot_cpu_id);
}
+#else /* !CONFIG_SPARSE_IRQ */
+
+static struct irq_2_iommu irq_2_iommuX[NR_IRQS];
+
+static struct irq_2_iommu *irq_2_iommu(unsigned int irq)
+{
+ if (irq < nr_irqs)
+ return &irq_2_iommuX[irq];
+
+ return NULL;
+}
static struct irq_2_iommu *irq_2_iommu_alloc(unsigned int irq)
{
return irq_2_iommu(irq);
}
+#endif
static DEFINE_SPINLOCK(irq_2_ir_lock);
@@ -86,9 +144,11 @@ int alloc_irte(struct intel_iommu *iommu
if (!count)
return -1;
+#ifndef CONFIG_SPARSE_IRQ
/* protect irq_2_iommu_alloc later */
if (irq >= nr_irqs)
return -1;
+#endif
/*
* start the IRTE search from index 0.
@@ -130,6 +190,12 @@ int alloc_irte(struct intel_iommu *iommu
table->base[i].present = 1;
irq_iommu = irq_2_iommu_alloc(irq);
+ if (!irq_iommu) {
+ spin_unlock(&irq_2_ir_lock);
+ printk(KERN_ERR "can't allocate irq_2_iommu\n");
+ return -1;
+ }
+
irq_iommu->iommu = iommu;
irq_iommu->irte_index = index;
irq_iommu->sub_handle = 0;
@@ -177,6 +243,12 @@ int set_irte_irq(int irq, struct intel_i
irq_iommu = irq_2_iommu_alloc(irq);
+ if (!irq_iommu) {
+ spin_unlock(&irq_2_ir_lock);
+ printk(KERN_ERR "can't allocate irq_2_iommu\n");
+ return -1;
+ }
+
irq_iommu->iommu = iommu;
irq_iommu->irte_index = index;
irq_iommu->sub_handle = subhandle;
Index: linux-2.6/drivers/xen/events.c
===================================================================
--- linux-2.6.orig/drivers/xen/events.c
+++ linux-2.6/drivers/xen/events.c
@@ -141,8 +141,12 @@ static void init_evtchn_cpu_bindings(voi
int i;
/* By default all event channels notify CPU#0. */
- for_each_irq_desc(i, desc)
+ for_each_irq_desc(i, desc) {
+ if (!desc)
+ continue;
+
desc->affinity = cpumask_of_cpu(0);
+ }
#endif
memset(cpu_evtchn, 0, sizeof(cpu_evtchn));
@@ -231,7 +235,7 @@ static int find_unbound_irq(void)
int irq;
/* Only allocate from dynirq range */
- for_each_irq_nr(irq)
+ for (irq = 0; irq < nr_irqs; irq++)
if (irq_bindcount[irq] == 0)
break;
@@ -792,7 +796,7 @@ void xen_irq_resume(void)
mask_evtchn(evtchn);
/* No IRQ <-> event-channel mappings. */
- for_each_irq_nr(irq)
+ for (irq = 0; irq < nr_irqs; irq++)
irq_info[irq].evtchn = 0; /* zap event-channel binding */
for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
@@ -824,7 +828,7 @@ void __init xen_init_IRQ(void)
mask_evtchn(i);
/* Dynamic IRQ space is currently unbound. Zero the refcnts. */
- for_each_irq_nr(i)
+ for (i = 0; i < nr_irqs; i++)
irq_bindcount[i] = 0;
irq_ctx_init(smp_processor_id());
Index: linux-2.6/fs/proc/stat.c
===================================================================
--- linux-2.6.orig/fs/proc/stat.c
+++ linux-2.6/fs/proc/stat.c
@@ -27,6 +27,7 @@ static int show_stat(struct seq_file *p,
u64 sum = 0;
struct timespec boottime;
unsigned int per_irq_sum;
+ struct irq_desc *desc;
user = nice = system = idle = iowait =
irq = softirq = steal = cputime64_zero;
@@ -44,10 +45,11 @@ static int show_stat(struct seq_file *p,
softirq = cputime64_add(softirq, kstat_cpu(i).cpustat.softirq);
steal = cputime64_add(steal, kstat_cpu(i).cpustat.steal);
guest = cputime64_add(guest, kstat_cpu(i).cpustat.guest);
-
- for_each_irq_nr(j)
+ for_each_irq_desc(j, desc) {
+ if (!desc)
+ continue;
sum += kstat_irqs_cpu(j, i);
-
+ }
sum += arch_irq_stat_cpu(i);
}
sum += arch_irq_stat();
@@ -90,11 +92,14 @@ static int show_stat(struct seq_file *p,
seq_printf(p, "intr %llu", (unsigned long long)sum);
/* sum again ? it could be updated? */
- for_each_irq_nr(j) {
+ for (j = 0; j < NR_IRQS; j++) {
+ desc = irq_to_desc(j);
per_irq_sum = 0;
- for_each_possible_cpu(i)
- per_irq_sum += kstat_irqs_cpu(j, i);
+ if (desc) {
+ for_each_possible_cpu(i)
+ per_irq_sum += kstat_irqs_cpu(j, i);
+ }
seq_printf(p, " %u", per_irq_sum);
}
Index: linux-2.6/include/linux/interrupt.h
===================================================================
--- linux-2.6.orig/include/linux/interrupt.h
+++ linux-2.6/include/linux/interrupt.h
@@ -18,6 +18,8 @@
#include <asm/ptrace.h>
#include <asm/system.h>
+extern int nr_irqs;
+
/*
* These correspond to the IORESOURCE_IRQ_* defines in
* linux/ioport.h to select the interrupt line behaviour. When
Index: linux-2.6/include/linux/irq.h
===================================================================
--- linux-2.6.orig/include/linux/irq.h
+++ linux-2.6/include/linux/irq.h
@@ -129,6 +129,8 @@ struct irq_chip {
const char *typename;
};
+struct timer_rand_state;
+struct irq_2_iommu;
/**
* struct irq_desc - interrupt descriptor
* @irq: interrupt number for this descriptor
@@ -154,6 +156,13 @@ struct irq_chip {
*/
struct irq_desc {
unsigned int irq;
+#ifdef CONFIG_SPARSE_IRQ
+ struct timer_rand_state *timer_rand_state;
+ unsigned int *kstat_irqs;
+# ifdef CONFIG_INTR_REMAP
+ struct irq_2_iommu *irq_2_iommu;
+# endif
+#endif
irq_flow_handler_t handle_irq;
struct irq_chip *chip;
struct msi_desc *msi_desc;
@@ -181,14 +190,52 @@ struct irq_desc {
const char *name;
} ____cacheline_internodealigned_in_smp;
+extern void early_irq_init(void);
+extern void arch_early_irq_init(void);
+extern void arch_init_chip_data(struct irq_desc *desc, int cpu);
+extern void arch_init_copy_chip_data(struct irq_desc *old_desc,
+ struct irq_desc *desc, int cpu);
+extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc);
+
+#ifndef CONFIG_SPARSE_IRQ
extern struct irq_desc irq_desc[NR_IRQS];
static inline struct irq_desc *irq_to_desc(unsigned int irq)
{
- return (irq < nr_irqs) ? irq_desc + irq : NULL;
+ return (irq < NR_IRQS) ? irq_desc + irq : NULL;
+}
+static inline struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+{
+ return irq_to_desc(irq);
}
+#ifdef CONFIG_GENERIC_HARDIRQS
+# define for_each_irq_desc(irq, desc) \
+ for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
+# define for_each_irq_desc_reverse(irq, desc) \
+ for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \
+ irq >= 0; irq--, desc--)
+#endif
+
+#else
+
+extern struct irq_desc *irq_to_desc(unsigned int irq);
+extern struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu);
+extern struct irq_desc *move_irq_desc(struct irq_desc *old_desc, int cpu);
+
+# define for_each_irq_desc(irq, desc) \
+ for (irq = 0, desc = irq_to_desc(irq); irq < nr_irqs; irq++, desc = irq_to_desc(irq))
+# define for_each_irq_desc_reverse(irq, desc) \
+ for (irq = nr_irqs - 1, desc = irq_to_desc(irq); irq >= 0; irq--, desc = irq_to_desc(irq))
+
+#define kstat_irqs_this_cpu(DESC) \
+ ((DESC)->kstat_irqs[smp_processor_id()])
+#define kstat_incr_irqs_this_cpu(irqno, DESC) \
+ ((DESC)->kstat_irqs[smp_processor_id()]++)
+
+#endif
+
/*
* Migration helpers for obsolete names, they will go away:
*/
@@ -380,6 +427,11 @@ extern int set_irq_msi(unsigned int irq,
#define get_irq_data(irq) (irq_to_desc(irq)->handler_data)
#define get_irq_msi(irq) (irq_to_desc(irq)->msi_desc)
+#define get_irq_desc_chip(desc) ((desc)->chip)
+#define get_irq_desc_chip_data(desc) ((desc)->chip_data)
+#define get_irq_desc_data(desc) ((desc)->handler_data)
+#define get_irq_desc_msi(desc) ((desc)->msi_desc)
+
#endif /* CONFIG_GENERIC_HARDIRQS */
#endif /* !CONFIG_S390 */
Index: linux-2.6/include/linux/kernel_stat.h
===================================================================
--- linux-2.6.orig/include/linux/kernel_stat.h
+++ linux-2.6/include/linux/kernel_stat.h
@@ -28,7 +28,9 @@ struct cpu_usage_stat {
struct kernel_stat {
struct cpu_usage_stat cpustat;
- unsigned int irqs[NR_IRQS];
+#ifndef CONFIG_SPARSE_IRQ
+ unsigned int irqs[NR_IRQS];
+#endif
};
DECLARE_PER_CPU(struct kernel_stat, kstat);
@@ -39,6 +41,10 @@ DECLARE_PER_CPU(struct kernel_stat, ksta
extern unsigned long long nr_context_switches(void);
+#ifndef CONFIG_SPARSE_IRQ
+#define kstat_irqs_this_cpu(irq) \
+ (kstat_this_cpu.irqs[irq])
+
struct irq_desc;
static inline void kstat_incr_irqs_this_cpu(unsigned int irq,
@@ -46,11 +52,17 @@ static inline void kstat_incr_irqs_this_
{
kstat_this_cpu.irqs[irq]++;
}
+#endif
+
+#ifndef CONFIG_SPARSE_IRQ
static inline unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
{
return kstat_cpu(cpu).irqs[irq];
}
+#else
+extern unsigned int kstat_irqs_cpu(unsigned int irq, int cpu);
+#endif
/*
* Number of interrupts per specific IRQ source, since bootup
Index: linux-2.6/kernel/irq/autoprobe.c
===================================================================
--- linux-2.6.orig/kernel/irq/autoprobe.c
+++ linux-2.6/kernel/irq/autoprobe.c
@@ -40,6 +40,9 @@ unsigned long probe_irq_on(void)
* flush such a longstanding irq before considering it as spurious.
*/
for_each_irq_desc_reverse(i, desc) {
+ if (!desc)
+ continue;
+
spin_lock_irq(&desc->lock);
if (!desc->action && !(desc->status & IRQ_NOPROBE)) {
/*
@@ -68,6 +71,9 @@ unsigned long probe_irq_on(void)
* happened in the previous stage, it may have masked itself)
*/
for_each_irq_desc_reverse(i, desc) {
+ if (!desc)
+ continue;
+
spin_lock_irq(&desc->lock);
if (!desc->action && !(desc->status & IRQ_NOPROBE)) {
desc->status |= IRQ_AUTODETECT | IRQ_WAITING;
@@ -86,6 +92,9 @@ unsigned long probe_irq_on(void)
* Now filter out any obviously spurious interrupts
*/
for_each_irq_desc(i, desc) {
+ if (!desc)
+ continue;
+
spin_lock_irq(&desc->lock);
status = desc->status;
@@ -124,6 +133,9 @@ unsigned int probe_irq_mask(unsigned lon
int i;
for_each_irq_desc(i, desc) {
+ if (!desc)
+ continue;
+
spin_lock_irq(&desc->lock);
status = desc->status;
@@ -166,6 +178,9 @@ int probe_irq_off(unsigned long val)
unsigned int status;
for_each_irq_desc(i, desc) {
+ if (!desc)
+ continue;
+
spin_lock_irq(&desc->lock);
status = desc->status;
Index: linux-2.6/kernel/irq/chip.c
===================================================================
--- linux-2.6.orig/kernel/irq/chip.c
+++ linux-2.6/kernel/irq/chip.c
@@ -24,9 +24,10 @@
*/
void dynamic_irq_init(unsigned int irq)
{
- struct irq_desc *desc = irq_to_desc(irq);
+ struct irq_desc *desc;
unsigned long flags;
+ desc = irq_to_desc(irq);
if (!desc) {
WARN(1, KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
return;
Index: linux-2.6/kernel/irq/handle.c
===================================================================
--- linux-2.6.orig/kernel/irq/handle.c
+++ linux-2.6/kernel/irq/handle.c
@@ -15,9 +15,16 @@
#include <linux/random.h>
#include <linux/interrupt.h>
#include <linux/kernel_stat.h>
+#include <linux/rculist.h>
+#include <linux/hash.h>
#include "internals.h"
+/*
+ * lockdep: we want to handle all irq_desc locks as a single lock-class:
+ */
+static struct lock_class_key irq_desc_lock_class;
+
/**
* handle_bad_irq - handle spurious and unhandled irqs
* @irq: the interrupt number
@@ -49,6 +56,161 @@ void handle_bad_irq(unsigned int irq, st
int nr_irqs = NR_IRQS;
EXPORT_SYMBOL_GPL(nr_irqs);
+void __init __attribute__((weak)) arch_early_irq_init(void)
+{
+}
+
+#ifdef CONFIG_SPARSE_IRQ
+static struct irq_desc irq_desc_init = {
+ .irq = -1,
+ .status = IRQ_DISABLED,
+ .chip = &no_irq_chip,
+ .handle_irq = handle_bad_irq,
+ .depth = 1,
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
+#ifdef CONFIG_SMP
+ .affinity = CPU_MASK_ALL
+#endif
+};
+
+static void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr)
+{
+ unsigned long bytes;
+ char *ptr;
+ int node;
+
+ /* Compute how many bytes we need per irq and allocate them */
+ bytes = nr * sizeof(unsigned int);
+
+ node = cpu_to_node(cpu);
+ ptr = kzalloc_node(bytes, GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc kstat_irqs on cpu %d node %d\n", cpu, node);
+
+ if (ptr)
+ desc->kstat_irqs = (unsigned int *)ptr;
+}
+
+void __attribute__((weak)) arch_init_chip_data(struct irq_desc *desc, int cpu)
+{
+}
+
+static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu)
+{
+ memcpy(desc, &irq_desc_init, sizeof(struct irq_desc));
+ desc->irq = irq;
+#ifdef CONFIG_SMP
+ desc->cpu = cpu;
+#endif
+ lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ init_kstat_irqs(desc, cpu, nr_cpu_ids);
+ if (!desc->kstat_irqs) {
+ printk(KERN_ERR "can not alloc kstat_irqs\n");
+ BUG_ON(1);
+ }
+ arch_init_chip_data(desc, cpu);
+}
+
+/*
+ * Protect the sparse_irqs:
+ */
+static DEFINE_SPINLOCK(sparse_irq_lock);
+
+struct irq_desc *irq_desc_ptrs[NR_IRQS] __read_mostly;
+
+static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = {
+ [0 ... NR_IRQS_LEGACY-1] = {
+ .irq = -1,
+ .status = IRQ_DISABLED,
+ .chip = &no_irq_chip,
+ .handle_irq = handle_bad_irq,
+ .depth = 1,
+ .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
+#ifdef CONFIG_SMP
+ .affinity = CPU_MASK_ALL
+#endif
+ }
+};
+
+/* FIXME: use bootmem alloc ...*/
+static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS];
+
+void __init early_irq_init(void)
+{
+ struct irq_desc *desc;
+ int legacy_count;
+ int i;
+
+ desc = irq_desc_legacy;
+ legacy_count = ARRAY_SIZE(irq_desc_legacy);
+
+ for (i = 0; i < legacy_count; i++) {
+ desc[i].irq = i;
+ desc[i].kstat_irqs = kstat_irqs_legacy[i];
+
+ irq_desc_ptrs[i] = desc + i;
+ }
+
+ for (i = legacy_count; i < NR_IRQS; i++)
+ irq_desc_ptrs[i] = NULL;
+
+ arch_early_irq_init();
+}
+
+struct irq_desc *irq_to_desc(unsigned int irq)
+{
+ if (irq >= NR_IRQS) {
+ printk(KERN_WARNING "irq >= NR_IRQS in irq_to_desc: %d %d\n",
+ irq, NR_IRQS);
+ WARN_ON(1);
+ return NULL;
+ }
+ return irq_desc_ptrs[irq];
+}
+
+struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc;
+ unsigned long flags;
+ int node;
+
+ if (irq >= NR_IRQS) {
+ printk(KERN_WARNING "irq >= NR_IRQS in irq_to_desc_alloc: %d %d\n",
+ irq, NR_IRQS);
+ WARN_ON(1);
+ return NULL;
+ }
+
+ desc = irq_desc_ptrs[irq];
+ if (desc)
+ return desc;
+
+ spin_lock_irqsave(&sparse_irq_lock, flags);
+
+ /* We have to check it to avoid races with another CPU */
+ desc = irq_desc_ptrs[irq];
+ if (desc)
+ goto out_unlock;
+
+ node = cpu_to_node(cpu);
+ desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node);
+ printk(KERN_DEBUG " alloc irq_desc for %d on cpu %d node %d\n",
+ irq, cpu, node);
+ if (!desc) {
+ printk(KERN_ERR "can not alloc irq_desc\n");
+ BUG_ON(1);
+ }
+ init_one_irq_desc(irq, desc, cpu);
+
+ irq_desc_ptrs[irq] = desc;
+
+out_unlock:
+ spin_unlock_irqrestore(&sparse_irq_lock, flags);
+
+ return desc;
+}
+
+#else
+
struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
[0 ... NR_IRQS-1] = {
.status = IRQ_DISABLED,
@@ -62,6 +224,8 @@ struct irq_desc irq_desc[NR_IRQS] __cach
}
};
+#endif
+
/*
* What should we do if we get a hw irq event on an illegal vector?
* Each architecture has to answer this themself.
@@ -261,17 +425,28 @@ out:
#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_SPARSE_IRQ
struct irq_desc *desc;
int i;
- for_each_irq_desc(i, desc)
+ for_each_irq_desc(i, desc) {
+ if (!desc)
+ continue;
+
lockdep_set_class(&desc->lock, &irq_desc_lock_class);
+ }
+#endif
}
#endif
+
+#ifdef CONFIG_SPARSE_IRQ
+unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+ return desc->kstat_irqs[cpu];
+}
+#endif
+EXPORT_SYMBOL(kstat_irqs_cpu);
+
Index: linux-2.6/include/linux/irqnr.h
===================================================================
--- linux-2.6.orig/include/linux/irqnr.h
+++ linux-2.6/include/linux/irqnr.h
@@ -7,18 +7,10 @@
# define for_each_irq_desc(irq, desc) \
for (irq = 0; irq < nr_irqs; irq++)
-#else
-extern int nr_irqs;
-# define for_each_irq_desc(irq, desc) \
- for (irq = 0, desc = irq_desc; irq < nr_irqs; irq++, desc++)
-
-# define for_each_irq_desc_reverse(irq, desc) \
- for (irq = nr_irqs - 1, desc = irq_desc + (nr_irqs - 1); \
- irq >= 0; irq--, desc--)
+static inline early_sparse_irq_init(void)
+{
+}
#endif
-#define for_each_irq_nr(irq) \
- for (irq = 0; irq < nr_irqs; irq++)
-
#endif
Index: linux-2.6/arch/x86/kernel/irq_32.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_32.c
+++ linux-2.6/arch/x86/kernel/irq_32.c
@@ -242,6 +242,8 @@ void fixup_irqs(cpumask_t map)
for_each_irq_desc(irq, desc) {
cpumask_t mask;
+ if (!desc)
+ continue;
if (irq == 2)
continue;
Index: linux-2.6/arch/x86/kernel/irq_64.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq_64.c
+++ linux-2.6/arch/x86/kernel/irq_64.c
@@ -90,6 +90,8 @@ void fixup_irqs(cpumask_t map)
int break_affinity = 0;
int set_affinity = 1;
+ if (!desc)
+ continue;
if (irq == 2)
continue;
Index: linux-2.6/kernel/irq/proc.c
===================================================================
--- linux-2.6.orig/kernel/irq/proc.c
+++ linux-2.6/kernel/irq/proc.c
@@ -243,7 +243,11 @@ void init_irq_proc(void)
/*
* Create entries for all existing IRQs.
*/
- for_each_irq_desc(irq, desc)
+ for_each_irq_desc(irq, desc) {
+ if (!desc)
+ continue;
+
register_irq_proc(irq, desc);
+ }
}
Index: linux-2.6/kernel/irq/spurious.c
===================================================================
--- linux-2.6.orig/kernel/irq/spurious.c
+++ linux-2.6/kernel/irq/spurious.c
@@ -91,6 +91,9 @@ static int misrouted_irq(int irq)
int i, ok = 0;
for_each_irq_desc(i, desc) {
+ if (!desc)
+ continue;
+
if (!i)
continue;
@@ -112,6 +115,8 @@ static void poll_spurious_irqs(unsigned
for_each_irq_desc(i, desc) {
unsigned int status;
+ if (!desc)
+ continue;
if (!i)
continue;
Index: linux-2.6/init/main.c
===================================================================
--- linux-2.6.orig/init/main.c
+++ linux-2.6/init/main.c
@@ -542,6 +542,15 @@ void __init __weak thread_info_cache_ini
{
}
+void __init __weak arch_early_irq_init(void)
+{
+}
+
+void __init __weak early_irq_init(void)
+{
+ arch_early_irq_init();
+}
+
asmlinkage void __init start_kernel(void)
{
char * command_line;
@@ -612,6 +621,8 @@ asmlinkage void __init start_kernel(void
sort_main_extable();
trap_init();
rcu_init();
+ /* init some links before init_ISA_irqs() */
+ early_irq_init();
init_IRQ();
pidhash_init();
init_timers();
Index: linux-2.6/arch/x86/include/asm/irq_vectors.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/irq_vectors.h
+++ linux-2.6/arch/x86/include/asm/irq_vectors.h
@@ -101,12 +101,23 @@
#define LAST_VM86_IRQ 15
#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
+#define NR_IRQS_LEGACY 16
+
#if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER)
+
+#ifndef CONFIG_SPARSE_IRQ
# if NR_CPUS < MAX_IO_APICS
# define NR_IRQS (NR_VECTORS + (32 * NR_CPUS))
# else
# define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS))
# endif
+#else
+# if (8 * NR_CPUS) > (32 * MAX_IO_APICS)
+# define NR_IRQS (NR_VECTORS + (8 * NR_CPUS))
+# else
+# define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS))
+# endif
+#endif
#elif defined(CONFIG_X86_VOYAGER)
Index: linux-2.6/drivers/pci/msi.c
===================================================================
--- linux-2.6.orig/drivers/pci/msi.c
+++ linux-2.6/drivers/pci/msi.c
@@ -103,11 +103,11 @@ static void msix_set_enable(struct pci_d
}
}
-static void msix_flush_writes(unsigned int irq)
+static void msix_flush_writes(struct irq_desc *desc)
{
struct msi_desc *entry;
- entry = get_irq_msi(irq);
+ entry = get_irq_desc_msi(desc);
BUG_ON(!entry || !entry->dev);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
@@ -135,11 +135,11 @@ static void msix_flush_writes(unsigned i
* Returns 1 if it succeeded in masking the interrupt and 0 if the device
* doesn't support MSI masking.
*/
-static int msi_set_mask_bits(unsigned int irq, u32 mask, u32 flag)
+static int msi_set_mask_bits(struct irq_desc *desc, u32 mask, u32 flag)
{
struct msi_desc *entry;
- entry = get_irq_msi(irq);
+ entry = get_irq_desc_msi(desc);
BUG_ON(!entry || !entry->dev);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
@@ -172,9 +172,9 @@ static int msi_set_mask_bits(unsigned in
return 1;
}
-void read_msi_msg(unsigned int irq, struct msi_msg *msg)
+void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
{
- struct msi_desc *entry = get_irq_msi(irq);
+ struct msi_desc *entry = get_irq_desc_msi(desc);
switch(entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
{
@@ -211,9 +211,16 @@ void read_msi_msg(unsigned int irq, stru
}
}
-void write_msi_msg(unsigned int irq, struct msi_msg *msg)
+void read_msi_msg(unsigned int irq, struct msi_msg *msg)
{
- struct msi_desc *entry = get_irq_msi(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ read_msi_msg_desc(desc, msg);
+}
+
+void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
+{
+ struct msi_desc *entry = get_irq_desc_msi(desc);
switch (entry->msi_attrib.type) {
case PCI_CAP_ID_MSI:
{
@@ -252,21 +259,31 @@ void write_msi_msg(unsigned int irq, str
entry->msg = *msg;
}
+void write_msi_msg(unsigned int irq, struct msi_msg *msg)
+{
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ write_msi_msg_desc(desc, msg);
+}
+
void mask_msi_irq(unsigned int irq)
{
- msi_set_mask_bits(irq, 1, 1);
- msix_flush_writes(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ msi_set_mask_bits(desc, 1, 1);
+ msix_flush_writes(desc);
}
void unmask_msi_irq(unsigned int irq)
{
- msi_set_mask_bits(irq, 1, 0);
- msix_flush_writes(irq);
+ struct irq_desc *desc = irq_to_desc(irq);
+
+ msi_set_mask_bits(desc, 1, 0);
+ msix_flush_writes(desc);
}
static int msi_free_irqs(struct pci_dev* dev);
-
static struct msi_desc* alloc_msi_entry(void)
{
struct msi_desc *entry;
@@ -303,9 +320,11 @@ static void __pci_restore_msi_state(stru
pci_intx_for_msi(dev, 0);
msi_set_enable(dev, 0);
write_msi_msg(dev->irq, &entry->msg);
- if (entry->msi_attrib.maskbit)
- msi_set_mask_bits(dev->irq, entry->msi_attrib.maskbits_mask,
+ if (entry->msi_attrib.maskbit) {
+ struct irq_desc *desc = irq_to_desc(dev->irq);
+ msi_set_mask_bits(desc, entry->msi_attrib.maskbits_mask,
entry->msi_attrib.masked);
+ }
pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
control &= ~PCI_MSI_FLAGS_QSIZE;
@@ -327,8 +346,9 @@ static void __pci_restore_msix_state(str
msix_set_enable(dev, 0);
list_for_each_entry(entry, &dev->msi_list, list) {
+ struct irq_desc *desc = irq_to_desc(entry->irq);
write_msi_msg(entry->irq, &entry->msg);
- msi_set_mask_bits(entry->irq, 1, entry->msi_attrib.masked);
+ msi_set_mask_bits(desc, 1, entry->msi_attrib.masked);
}
BUG_ON(list_empty(&dev->msi_list));
@@ -596,7 +616,8 @@ void pci_msi_shutdown(struct pci_dev* de
/* Return the the pci reset with msi irqs unmasked */
if (entry->msi_attrib.maskbit) {
u32 mask = entry->msi_attrib.maskbits_mask;
- msi_set_mask_bits(dev->irq, mask, ~mask);
+ struct irq_desc *desc = irq_to_desc(dev->irq);
+ msi_set_mask_bits(desc, mask, ~mask);
}
if (!entry->dev || entry->msi_attrib.type != PCI_CAP_ID_MSI)
return;
Index: linux-2.6/include/linux/msi.h
===================================================================
--- linux-2.6.orig/include/linux/msi.h
+++ linux-2.6/include/linux/msi.h
@@ -10,8 +10,11 @@ struct msi_msg {
};
/* Helper functions */
+struct irq_desc;
extern void mask_msi_irq(unsigned int irq);
extern void unmask_msi_irq(unsigned int irq);
+extern void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg);
+extern void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg);
extern void read_msi_msg(unsigned int irq, struct msi_msg *msg);
extern void write_msi_msg(unsigned int irq, struct msi_msg *msg);
Index: linux-2.6/arch/x86/include/asm/io_apic.h
===================================================================
--- linux-2.6.orig/arch/x86/include/asm/io_apic.h
+++ linux-2.6/arch/x86/include/asm/io_apic.h
@@ -198,7 +198,7 @@ extern void restore_IO_APIC_setup(void);
extern void reinit_intr_remapped_IO_APIC(int);
#endif
-extern int probe_nr_irqs(void);
+extern void probe_nr_irqs_gsi(void);
#else /* !CONFIG_X86_IO_APIC */
#define io_apic_assign_pci_irqs 0
Index: linux-2.6/arch/x86/kernel/setup.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/setup.c
+++ linux-2.6/arch/x86/kernel/setup.c
@@ -953,7 +953,7 @@ void __init setup_arch(char **cmdline_p)
ioapic_init_mappings();
/* need to wait for io_apic is mapped */
- nr_irqs = probe_nr_irqs();
+ probe_nr_irqs_gsi();
kvm_guest_init();
Index: linux-2.6/include/linux/random.h
===================================================================
--- linux-2.6.orig/include/linux/random.h
+++ linux-2.6/include/linux/random.h
@@ -44,6 +44,57 @@ struct rand_pool_info {
extern void rand_initialize_irq(int irq);
+struct timer_rand_state;
+#ifndef CONFIG_SPARSE_IRQ
+
+extern struct timer_rand_state *irq_timer_state[];
+
+extern int nr_irqs;
+static inline struct timer_rand_state *get_timer_rand_state(unsigned int irq)
+{
+ if (irq >= nr_irqs)
+ return NULL;
+
+ return irq_timer_state[irq];
+}
+
+static inline void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state)
+{
+ if (irq >= nr_irqs)
+ return;
+
+ irq_timer_state[irq] = state;
+}
+
+#else
+
+#include <linux/irq.h>
+static inline struct timer_rand_state *get_timer_rand_state(unsigned int irq)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (!desc)
+ return NULL;
+
+ return desc->timer_rand_state;
+}
+
+static inline void set_timer_rand_state(unsigned int irq, struct timer_rand_state *state)
+{
+ struct irq_desc *desc;
+
+ desc = irq_to_desc(irq);
+
+ if (!desc)
+ return;
+
+ desc->timer_rand_state = state;
+}
+#endif
+
+
extern void add_input_randomness(unsigned int type, unsigned int code,
unsigned int value);
extern void add_interrupt_randomness(int irq);
Index: linux-2.6/arch/x86/kernel/irq.c
===================================================================
--- linux-2.6.orig/arch/x86/kernel/irq.c
+++ linux-2.6/arch/x86/kernel/irq.c
@@ -118,6 +118,9 @@ int show_interrupts(struct seq_file *p,
}
desc = irq_to_desc(i);
+ if (!desc)
+ return 0;
+
spin_lock_irqsave(&desc->lock, flags);
#ifndef CONFIG_SMP
any_count = kstat_irqs(i);
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] irq: sparseirq enabling v4
2008-11-29 7:13 ` [PATCH] irq: sparseirq enabling v4 Yinghai Lu
@ 2008-11-29 10:02 ` Ingo Molnar
2008-11-29 10:26 ` Ingo Molnar
2008-11-29 10:57 ` [PATCH] irq: sparseirq enabling v4 Sam Ravnborg
0 siblings, 2 replies; 20+ messages in thread
From: Ingo Molnar @ 2008-11-29 10:02 UTC (permalink / raw)
To: Yinghai Lu
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
* Yinghai Lu <yinghai@kernel.org> wrote:
> impact: new feature sparseirq
> ---
> arch/x86/Kconfig | 10
> arch/x86/include/asm/io_apic.h | 2
> arch/x86/include/asm/irq_vectors.h | 11
> arch/x86/kernel/io_apic.c | 625 ++++++++++++++++++++++---------------
> arch/x86/kernel/irq.c | 3
> arch/x86/kernel/irq_32.c | 2
> arch/x86/kernel/irq_64.c | 2
> arch/x86/kernel/irqinit_32.c | 3
> arch/x86/kernel/irqinit_64.c | 3
> arch/x86/kernel/setup.c | 2
> drivers/char/random.c | 22 -
> drivers/pci/intr_remapping.c | 76 ++++
> drivers/pci/msi.c | 55 ++-
> drivers/xen/events.c | 12
> fs/proc/stat.c | 17 -
> include/linux/interrupt.h | 2
> include/linux/irq.h | 54 +++
> include/linux/irqnr.h | 14
> include/linux/kernel_stat.h | 14
> include/linux/msi.h | 3
> include/linux/random.h | 51 +++
> init/main.c | 11
> kernel/irq/autoprobe.c | 15
> kernel/irq/chip.c | 3
> kernel/irq/handle.c | 187 ++++++++++-
> kernel/irq/proc.c | 6
> kernel/irq/spurious.c | 5
> 27 files changed, 891 insertions(+), 319 deletions(-)
very nice!
All the structural feedback i gave seems to be addressed properly, and
the patch has shrunk and consolidated nicely. I think we can start
splitting it up and applying it to tip/irq/sparseirq. We might notice a
few more details when that happens, on a per patch basis.
I started this by applying the whole patch and creating a good commit log
entry for it. Could you please use the commit log and create a split-up
series from it? Each main bullet point starting with " - " should go into
a separate patch - see the commit log below.
I've pushed it out into tip/irq/sparseirq, but not yet into tip/master.
Will rebase irq/sparseirq with the split-up series of 8-9 patches once
you send it.
Thanks,
Ingo
---------------->
>From 29c35c370d0ae5484c8d9e8aa2475ea6633623fc Mon Sep 17 00:00:00 2001
From: Yinghai Lu <yinghai@kernel.org>
Date: Fri, 28 Nov 2008 23:13:03 -0800
Subject: [PATCH] irq: sparse irq_desc[] support
Impact: new CONFIG_SPARSE_IRQ feature, which makes irq_desc[] a sparse array
To support kernels with very large NR_CPUS and NR_IRQS settings,
we need to reduce the size of irq_desc[]. On x86, when NR_CPUS is
set to 4096, the irq_desc[] array will waste megabytes of RAM,
which is not acceptable overhead to generic distro kernels.
In v2.6.28 we already introduced a generic API to make access to
the irq_desc[] array more abstract - and to allow a different
data structure to underly it. This patch finishes that process.
Core kernel changes:
- fix missing sparseirq API changes in various bits of core kernel code
(missing for_irq_desc primitives, missing checks for !desc, etc.)
- introduce a new data type in the IRQ code: irq_desc_ptrs[] and its
handling in the core IRQ code
- detach the IRQ statistics counters from kernel_stat and
attach it to irq_desc->kstat_irqs[] dynamically allocated
array of pointers. (this can use percpu_alloc() in the
future, once percpu_alloc() becomes generic enough)
- detach the NR_IRQS array in random.c.
- interrupt remapping: when moving an IRQ on NUMA, reallocate the irq
descriptor so that we get proper NUMA-local memory for the descriptor,
for the irq_cfg entry and for the kstat_irqs array.
Architectures can enable this by setting the CONFIG_SPARSE_IRQ
config switch. The x86 architecture is extended/fixed to deal
with such an irq_desc[] model:
- io_apic irq_cfg[NR_IRQS] array is re-attached to desc->irq_chip
- MSI virtual IRQ numbering is sanitized to go from the max upper
end of the physical IRQ range up towards NR_IRQS - instead of
coming down from the end of NR_IRQS.
- re-tunes our max NR_IRQS calculations
Architectures that do not specify CONFIG_SPARSE_IRQ, do not need
to change anything - this is a transparent feature that is not
supposed to break any existing code.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] irq: sparseirq enabling v4
2008-11-29 10:02 ` Ingo Molnar
@ 2008-11-29 10:26 ` Ingo Molnar
2008-12-01 4:44 ` [PATCH] irq: sparse irq_desc[] support - fix Yinghai Lu
2008-11-29 10:57 ` [PATCH] irq: sparseirq enabling v4 Sam Ravnborg
1 sibling, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2008-11-29 10:26 UTC (permalink / raw)
To: Yinghai Lu
Cc: Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
FYI:
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3617, comm: ps Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802cbd18>] ? check_bytes_and_report+0x38/0xe0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff80278148>] ? debug_mutex_init+0x38/0x60
[<ffffffff802ef6d9>] ? seq_open+0x89/0xb0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
Ingo
BIOS EBDA/lowmem at: 0009fc00/0009fc00
Linux version 2.6.28-rc6-tip-01066-gb8cb0e0-dirty (mingo@titan) (gcc version 4.2.3) #1 SMP Sat Nov 29 11:15:16 CET 2008
Command line: root=/dev/sda1 earlyprintk=serial,ttyS0,115200 console=ttyS0,115200 console=tty 5 profile=0 debug initcall_debug apic=debug apic=verbose ignore_loglevel sysrq_always_enabled pci=nomsi nosmp nmi_watchdog=0 noapic nolapic_timer lapic hpet=disable idle=poll nopat pci=nomsi
KERNEL supported cpus:
Centaur CentaurHauls
CPU: vendor_id 'GenuineIntel' unknown, using generic init.
CPU: Your system may be unstable.
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000003ed94000 (usable)
BIOS-e820: 000000003ed94000 - 000000003ee4e000 (ACPI NVS)
BIOS-e820: 000000003ee4e000 - 000000003fea2000 (usable)
BIOS-e820: 000000003fea2000 - 000000003fee9000 (ACPI NVS)
BIOS-e820: 000000003fee9000 - 000000003feed000 (usable)
BIOS-e820: 000000003feed000 - 000000003feff000 (ACPI data)
BIOS-e820: 000000003feff000 - 000000003ff00000 (usable)
console [earlyser0] enabled
debug: ignoring loglevel setting.
using polling idle threads.
DMI 2.3 present.
last_pfn = 0x3ff00 max_arch_pfn = 0x3ffffffff
Scanning 2 areas for low memory corruption
modified physical RAM map:
modified: 0000000000000000 - 0000000000001000 (usable)
modified: 0000000000001000 - 0000000000006000 (reserved)
modified: 0000000000006000 - 0000000000008000 (usable)
modified: 0000000000008000 - 0000000000010000 (reserved)
modified: 0000000000010000 - 0000000000092c00 (usable)
modified: 000000000009fc00 - 00000000000a0000 (reserved)
modified: 00000000000e0000 - 0000000000100000 (reserved)
modified: 0000000000100000 - 000000003ed94000 (usable)
modified: 000000003ed94000 - 000000003ee4e000 (ACPI NVS)
modified: 000000003ee4e000 - 000000003fea2000 (usable)
modified: 000000003fea2000 - 000000003fee9000 (ACPI NVS)
modified: 000000003fee9000 - 000000003feed000 (usable)
modified: 000000003feed000 - 000000003feff000 (ACPI data)
modified: 000000003feff000 - 000000003ff00000 (usable)
init_memory_mapping: 0000000000000000-000000003ff00000
0000000000 - 003ff00000 page 4k
kernel direct mapping tables up to 3ff00000 @ 20a3000-22a5000
last_map_addr: 3ff00000 end: 3ff00000
ACPI: RSDP 000FE020, 0014 (r0 INTEL )
ACPI: RSDT 3FEFDE48, 0050 (r1 INTEL D975XBX 4B9 MSFT 1000013)
ACPI: FACP 3FEFCF10, 0074 (r1 INTEL D975XBX 4B9 MSFT 1000013)
ACPI: DSDT 3FEF8010, 3E70 (r1 INTEL D975XBX 4B9 MSFT 1000013)
ACPI: FACS 3FEDFC40, 0040
ACPI: APIC 3FEFCE10, 0078 (r1 INTEL D975XBX 4B9 MSFT 1000013)
ACPI: WDDT 3FEF7F90, 0040 (r1 INTEL D975XBX 4B9 MSFT 1000013)
ACPI: MCFG 3FEF7F10, 003C (r1 INTEL D975XBX 4B9 MSFT 1000013)
ACPI: ASF! 3FEFCD10, 00A6 (r32 INTEL D975XBX 4B9 MSFT 1000013)
ACPI: HPET 3FEF7E90, 0038 (r1 INTEL D975XBX 4B9 MSFT 1000013)
ACPI: SSDT 3FEFDC10, 01BC (r1 INTEL CpuPm 4B9 MSFT 1000013)
ACPI: SSDT 3FEFDA10, 01B7 (r1 INTEL Cpu0Ist 4B9 MSFT 1000013)
ACPI: SSDT 3FEFD810, 01B7 (r1 INTEL Cpu1Ist 4B9 MSFT 1000013)
ACPI: SSDT 3FEFD610, 01B7 (r1 INTEL Cpu2Ist 4B9 MSFT 1000013)
ACPI: SSDT 3FEFD410, 01B7 (r1 INTEL Cpu3Ist 4B9 MSFT 1000013)
ACPI: Local APIC address 0xfee00000
No NUMA configuration found
Faking a node at 0000000000000000-000000003ff00000
Bootmem setup node 0 0000000000000000-000000003ff00000
NODE_DATA [0000000000010000 - 0000000000014fff]
bootmap [0000000000015000 - 000000000001cfdf] pages 8
(5 early reservations) ==> bootmem [0000000000 - 003ff00000]
#0 [0000000000 - 0000001000] BIOS data page ==> [0000000000 - 0000001000]
#1 [0000006000 - 0000008000] TRAMPOLINE ==> [0000006000 - 0000008000]
#2 [0000200000 - 00020a2c58] TEXT DATA BSS ==> [0000200000 - 00020a2c58]
#3 [000009fc00 - 0000100000] BIOS reserved ==> [000009fc00 - 0000100000]
#4 [00020a3000 - 00022a3000] PGTABLE ==> [00020a3000 - 00022a3000]
[ffffe20000000000-ffffe200019fffff] PMD -> [ffff880002400000-ffff880003dfffff] on node 0
Zone PFN ranges:
DMA 0x00000000 -> 0x00001000
DMA32 0x00001000 -> 0x00100000
Normal 0x00100000 -> 0x00100000
Movable zone start PFN for each node
early_node_map[7] active PFN ranges
0: 0x00000000 -> 0x00000001
0: 0x00000006 -> 0x00000008
0: 0x00000010 -> 0x00000092
0: 0x00000100 -> 0x0003ed94
0: 0x0003ee4e -> 0x0003fea2
0: 0x0003fee9 -> 0x0003feed
0: 0x0003feff -> 0x0003ff00
On node 0 totalpages: 261490
DMA zone: 104 pages used for memmap
DMA zone: 99 pages reserved
DMA zone: 3770 pages, LIFO batch:0
DMA32 zone: 6546 pages used for memmap
DMA32 zone: 250971 pages, LIFO batch:31
Normal zone: 0 pages used for memmap
Movable zone: 0 pages used for memmap
ACPI: PM-Timer IO Port: 0x408
ACPI: Local APIC address 0xfee00000
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled)
ACPI: LAPIC (acpi_id[0x03] lapic_id[0x82] disabled)
ACPI: LAPIC (acpi_id[0x04] lapic_id[0x83] disabled)
ACPI: LAPIC_NMI (acpi_id[0x01] dfl dfl lint[0x1])
ACPI: LAPIC_NMI (acpi_id[0x02] dfl dfl lint[0x1])
ACPI: Skipping IOAPIC probe due to 'noapic' option.
ACPI: HPET id: 0x8086a201 base: 0xfed00000
SMP: Allowing 4 CPUs, 2 hotplug CPUs
mapped APIC to ffffffffff5fc000 (fee00000)
Allocating PCI resources starting at 40000000 (gap: 3ff00000:c0100000)
PERCPU: Allocating 1904640 bytes of per cpu data
per cpu data for cpu0 on node0 at 0000000003e00000
per cpu data for cpu1 on node0 at 0000000003fd1000
per cpu data for cpu2 on node0 at 00000000041a2000
per cpu data for cpu3 on node0 at 0000000004373000
NR_CPUS: 8, nr_cpu_ids: 4, nr_node_ids 1
Built 1 zonelists in Node order, mobility grouping on. Total pages: 254741
Policy zone: DMA32
Kernel command line: root=/dev/sda1 earlyprintk=serial,ttyS0,115200 console=ttyS0,115200 console=tty 5 profile=0 debug initcall_debug apic=debug apic=verbose ignore_loglevel sysrq_always_enabled pci=nomsi nosmp nmi_watchdog=0 noapic nolapic_timer lapic hpet=disable idle=poll nopat pci=nomsi
kernel profiling enabled (shift: 0)
debug: sysrq always enabled.
Initializing CPU#0
RCU-based detection of stalled CPUs is enabled.
PID hash table entries: 4096 (order: 12, 32768 bytes)
Fast TSC calibration using PIT
Detected 2933.424 MHz processor.
Console: colour VGA+ 80x25
console handover: boot [earlyser0] -> real [tty0]
console [ttyS0] enabled
Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
... MAX_LOCKDEP_SUBCLASSES: 8
... MAX_LOCK_DEPTH: 48
... MAX_LOCKDEP_KEYS: 8191
... CLASSHASH_SIZE: 4096
... MAX_LOCKDEP_ENTRIES: 8192
... MAX_LOCKDEP_CHAINS: 16384
... CHAINHASH_SIZE: 8192
memory used by lock dependency info: 4351 kB
per task-struct memory footprint: 2688 bytes
Calgary: detecting Calgary via BIOS EBDA area
Calgary: Unable to locate Rio Grande table in EBDA - bailing!
Memory: 928060k/1047552k available (12575k kernel code, 1592k absent, 117900k reserved, 6209k data, 2784k init)
SLUB: Genslabs=13, HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
ODEBUG: selftest passed
Calibrating delay loop (skipped), value calculated using timer frequency.. 5866.84 BogoMIPS (lpj=11733696)
Security Framework initialized
SELinux: Initializing.
SELinux: Starting in enforcing mode
Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
Mount-cache hash table entries: 256
CPU: L1 I Cache: 0K (0 bytes/line), D cache 0K (0 bytes/line)
CPU: L2 Cache: 4096K (64 bytes/line)
CPU: Physical Processor ID: 0
CPU: Processor Core ID: 0
WARNING: polling idle and HT enabled, performance may degrade.
lockdep: fixing up alternatives.
SMP alternatives: switching to UP code
ACPI: Core revision 20080926
ACPI: setting ELCR to 0200 (from 0e00)
Setting APIC routing to flat
SMP mode deactivated.
enabled ExtINT on CPU#0
SMP disabled
calling migration_init+0x0/0x60 @ 1
initcall migration_init+0x0/0x60 returned 1 after 0 usecs
initcall migration_init+0x0/0x60 returned with error code 1
calling spawn_ksoftirqd+0x0/0x60 @ 1
initcall spawn_ksoftirqd+0x0/0x60 returned 0 after 0 usecs
calling init_call_single_data+0x0/0x80 @ 1
initcall init_call_single_data+0x0/0x80 returned 0 after 0 usecs
calling spawn_softlockup_task+0x0/0x90 @ 1
initcall spawn_softlockup_task+0x0/0x90 returned 0 after 3906 usecs
calling relay_init+0x0/0x20 @ 1
initcall relay_init+0x0/0x20 returned 0 after 0 usecs
calling tracer_alloc_buffers+0x0/0x1e0 @ 1
Testing tracer nop: PASSED
initcall tracer_alloc_buffers+0x0/0x1e0 returned 0 after 3906 usecs
Brought up 1 CPUs
Total of 1 processors activated (5866.84 BogoMIPS).
CPU0 attaching NULL sched-domain.
khelper used greatest stack depth: 6080 bytes left
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 1, comm: swapper Not tainted 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff8021aa20>] ? native_sched_clock+0x20/0x80
[<ffffffff8021a7d9>] ? sched_clock+0x9/0x10
[<ffffffff803209a4>] ? proc_register+0x124/0x1f0
[<ffffffff814a1140>] ? early_idt_handler+0x0/0x73
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff814a1140>] ? early_idt_handler+0x0/0x73
[<ffffffff80320b89>] ? create_proc_entry+0x59/0xa0
[<ffffffff802947ec>] ? register_irq_proc+0xbc/0xe0
[<ffffffff814a1140>] ? early_idt_handler+0x0/0x73
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff8029487c>] init_irq_proc+0x6c/0x80
[<ffffffff814a1f65>] kernel_init+0x115/0x190
[<ffffffff80e43aad>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[<ffffffff802149aa>] child_rip+0xa/0x20
[<ffffffff802142be>] ? restore_args+0x0/0x30
[<ffffffff814a1e50>] ? kernel_init+0x0/0x190
[<ffffffff802149a0>] ? child_rip+0x0/0x20
---[ end trace 4eaa2a86a8e2da22 ]---
calling init_cpufreq_transition_notifier_list+0x0/0x20 @ 1
initcall init_cpufreq_transition_notifier_list+0x0/0x20 returned 0 after 0 usecs
calling net_ns_init+0x0/0x180 @ 1
net_namespace: 1096 bytes
initcall net_ns_init+0x0/0x180 returned 0 after 3906 usecs
calling cpufreq_tsc+0x0/0x40 @ 1
initcall cpufreq_tsc+0x0/0x40 returned 0 after 0 usecs
calling init_smp_flush+0x0/0x60 @ 1
initcall init_smp_flush+0x0/0x60 returned 0 after 0 usecs
calling print_banner+0x0/0x10 @ 1
Booting paravirtualized kernel on bare hardware
initcall print_banner+0x0/0x10 returned 0 after 3906 usecs
calling sysctl_init+0x0/0x40 @ 1
initcall sysctl_init+0x0/0x40 returned 0 after 0 usecs
calling ksysfs_init+0x0/0xc0 @ 1
initcall ksysfs_init+0x0/0xc0 returned 0 after 0 usecs
calling init_jiffies_clocksource+0x0/0x20 @ 1
initcall init_jiffies_clocksource+0x0/0x20 returned 0 after 0 usecs
calling pm_init+0x0/0x40 @ 1
initcall pm_init+0x0/0x40 returned 0 after 0 usecs
calling stop_machine_init+0x0/0x50 @ 1
initcall stop_machine_init+0x0/0x50 returned 0 after 0 usecs
calling filelock_init+0x0/0x30 @ 1
initcall filelock_init+0x0/0x30 returned 0 after 0 usecs
calling init_misc_binfmt+0x0/0x50 @ 1
initcall init_misc_binfmt+0x0/0x50 returned 0 after 0 usecs
calling init_script_binfmt+0x0/0x20 @ 1
initcall init_script_binfmt+0x0/0x20 returned 0 after 0 usecs
calling init_elf_binfmt+0x0/0x20 @ 1
initcall init_elf_binfmt+0x0/0x20 returned 0 after 0 usecs
calling init_compat_elf_binfmt+0x0/0x20 @ 1
initcall init_compat_elf_binfmt+0x0/0x20 returned 0 after 0 usecs
calling debugfs_init+0x0/0x60 @ 1
initcall debugfs_init+0x0/0x60 returned 0 after 0 usecs
calling securityfs_init+0x0/0x60 @ 1
initcall securityfs_init+0x0/0x60 returned 0 after 0 usecs
calling random32_init+0x0/0x100 @ 1
initcall random32_init+0x0/0x100 returned 0 after 0 usecs
calling gnttab_init+0x0/0x1c0 @ 1
initcall gnttab_init+0x0/0x1c0 returned -19 after 0 usecs
calling cpufreq_core_init+0x0/0x90 @ 1
initcall cpufreq_core_init+0x0/0x90 returned 0 after 0 usecs
calling cpuidle_init+0x0/0x50 @ 1
initcall cpuidle_init+0x0/0x50 returned 0 after 0 usecs
calling sock_init+0x0/0x60 @ 1
initcall sock_init+0x0/0x60 returned 0 after 0 usecs
calling netpoll_init+0x0/0x50 @ 1
initcall netpoll_init+0x0/0x50 returned 0 after 0 usecs
calling netlink_proto_init+0x0/0x180 @ 1
NET: Registered protocol family 16
initcall netlink_proto_init+0x0/0x180 returned 0 after 3906 usecs
calling bdi_class_init+0x0/0x50 @ 1
initcall bdi_class_init+0x0/0x50 returned 0 after 0 usecs
calling kobject_uevent_init+0x0/0x50 @ 1
initcall kobject_uevent_init+0x0/0x50 returned 0 after 0 usecs
calling pcibus_class_init+0x0/0x20 @ 1
initcall pcibus_class_init+0x0/0x20 returned 0 after 0 usecs
calling pci_driver_init+0x0/0x20 @ 1
initcall pci_driver_init+0x0/0x20 returned 0 after 0 usecs
calling backlight_class_init+0x0/0x50 @ 1
initcall backlight_class_init+0x0/0x50 returned 0 after 0 usecs
calling video_output_class_init+0x0/0x19 @ 1
initcall video_output_class_init+0x0/0x19 returned 0 after 0 usecs
calling xenbus_probe_init+0x0/0x170 @ 1
initcall xenbus_probe_init+0x0/0x170 returned -19 after 0 usecs
calling tty_class_init+0x0/0x40 @ 1
initcall tty_class_init+0x0/0x40 returned 0 after 0 usecs
calling vtconsole_class_init+0x0/0xf0 @ 1
initcall vtconsole_class_init+0x0/0xf0 returned 0 after 0 usecs
calling register_node_type+0x0/0x70 @ 1
initcall register_node_type+0x0/0x70 returned 0 after 0 usecs
calling i2c_init+0x0/0x80 @ 1
initcall i2c_init+0x0/0x80 returned 0 after 0 usecs
calling amd_postcore_init+0x0/0x8d0 @ 1
initcall amd_postcore_init+0x0/0x8d0 returned 0 after 0 usecs
calling arch_kdebugfs_init+0x0/0x30 @ 1
initcall arch_kdebugfs_init+0x0/0x30 returned 0 after 0 usecs
calling mtrr_if_init+0x0/0x80 @ 1
initcall mtrr_if_init+0x0/0x80 returned 0 after 0 usecs
calling ffh_cstate_init+0x0/0x40 @ 1
initcall ffh_cstate_init+0x0/0x40 returned -1 after 0 usecs
initcall ffh_cstate_init+0x0/0x40 returned with error code -1
calling acpi_pci_init+0x0/0x70 @ 1
ACPI: bus type pci registered
initcall acpi_pci_init+0x0/0x70 returned 0 after 0 usecs
calling init_acpi_device_notify+0x0/0x4b @ 1
initcall init_acpi_device_notify+0x0/0x4b returned 0 after 0 usecs
calling setup_vcpu_hotplug_event+0x0/0x30 @ 1
initcall setup_vcpu_hotplug_event+0x0/0x30 returned -19 after 0 usecs
calling dmi_id_init+0x0/0x310 @ 1
initcall dmi_id_init+0x0/0x310 returned 0 after 0 usecs
calling pci_arch_init+0x0/0x50 @ 1
PCI: Using configuration type 1 for base access
initcall pci_arch_init+0x0/0x50 returned 0 after 3906 usecs
calling topology_init+0x0/0x80 @ 1
initcall topology_init+0x0/0x80 returned 0 after 0 usecs
calling mtrr_init_finialize+0x0/0x50 @ 1
initcall mtrr_init_finialize+0x0/0x50 returned 0 after 0 usecs
calling param_sysfs_init+0x0/0x390 @ 1
khelper used greatest stack depth: 5704 bytes left
initcall param_sysfs_init+0x0/0x390 returned 0 after 70312 usecs
calling pm_sysrq_init+0x0/0x20 @ 1
initcall pm_sysrq_init+0x0/0x20 returned 0 after 0 usecs
calling readahead_init+0x0/0x40 @ 1
initcall readahead_init+0x0/0x40 returned 0 after 0 usecs
calling init_bio+0x0/0x100 @ 1
initcall init_bio+0x0/0x100 returned 0 after 0 usecs
calling cryptomgr_init+0x0/0x40 @ 1
initcall cryptomgr_init+0x0/0x40 returned 0 after 0 usecs
calling blk_settings_init+0x0/0x30 @ 1
initcall blk_settings_init+0x0/0x30 returned 0 after 0 usecs
calling blk_ioc_init+0x0/0x30 @ 1
initcall blk_ioc_init+0x0/0x30 returned 0 after 0 usecs
calling blk_softirq_init+0x0/0x70 @ 1
initcall blk_softirq_init+0x0/0x70 returned 0 after 0 usecs
calling genhd_device_init+0x0/0x70 @ 1
initcall genhd_device_init+0x0/0x70 returned 0 after 3906 usecs
calling gpiolib_debugfs_init+0x0/0x30 @ 1
initcall gpiolib_debugfs_init+0x0/0x30 returned 0 after 0 usecs
calling max732x_init+0x0/0x20 @ 1
initcall max732x_init+0x0/0x20 returned 0 after 0 usecs
calling pca953x_init+0x0/0x20 @ 1
initcall pca953x_init+0x0/0x20 returned 0 after 0 usecs
calling pcf857x_init+0x0/0x20 @ 1
initcall pcf857x_init+0x0/0x20 returned 0 after 0 usecs
calling pci_slot_init+0x0/0x50 @ 1
initcall pci_slot_init+0x0/0x50 returned 0 after 0 usecs
calling fbmem_init+0x0/0xa0 @ 1
initcall fbmem_init+0x0/0xa0 returned 0 after 0 usecs
calling acpi_init+0x0/0x234 @ 1
ACPI: EC: Look up EC in DSDT
ACPI: Interpreter enabled
ACPI: (supports S0 S1 S3 S5)
ACPI: Using PIC for interrupt routing
initcall acpi_init+0x0/0x234 returned 0 after 23437 usecs
calling acpi_scan_init+0x0/0x110 @ 1
initcall acpi_scan_init+0x0/0x110 returned 0 after 11718 usecs
calling acpi_ec_init+0x0/0x61 @ 1
initcall acpi_ec_init+0x0/0x61 returned 0 after 0 usecs
calling dock_init+0x0/0x8d @ 1
ACPI: No dock devices found.
initcall dock_init+0x0/0x8d returned 0 after 3906 usecs
calling acpi_pci_root_init+0x0/0x28 @ 1
ACPI: PCI Root Bridge [PCI0] (0000:00)
pci 0000:00:01.0: PME# supported from D0 D3hot D3cold
pci 0000:00:01.0: PME# disabled
pci 0000:00:1b.0: reg 10 64bit mmio: [0x50400000-0x50403fff]
pci 0000:00:1b.0: PME# supported from D0 D3hot D3cold
pci 0000:00:1b.0: PME# disabled
pci 0000:00:1c.0: PME# supported from D0 D3hot D3cold
pci 0000:00:1c.0: PME# disabled
pci 0000:00:1c.4: PME# supported from D0 D3hot D3cold
pci 0000:00:1c.4: PME# disabled
pci 0000:00:1c.5: PME# supported from D0 D3hot D3cold
pci 0000:00:1c.5: PME# disabled
pci 0000:00:1d.0: reg 20 io port: [0x4080-0x409f]
pci 0000:00:1d.1: reg 20 io port: [0x4060-0x407f]
pci 0000:00:1d.2: reg 20 io port: [0x4040-0x405f]
pci 0000:00:1d.3: reg 20 io port: [0x4020-0x403f]
pci 0000:00:1d.7: reg 10 32bit mmio: [0x50404400-0x504047ff]
pci 0000:00:1d.7: PME# supported from D0 D3hot D3cold
pci 0000:00:1d.7: PME# disabled
pci 0000:00:1f.1: reg 10 io port: [0x00-0x07]
pci 0000:00:1f.1: reg 14 io port: [0x00-0x03]
pci 0000:00:1f.1: reg 18 io port: [0x00-0x07]
pci 0000:00:1f.1: reg 1c io port: [0x00-0x03]
pci 0000:00:1f.1: reg 20 io port: [0x40b0-0x40bf]
pci 0000:00:1f.2: reg 10 io port: [0x40c8-0x40cf]
pci 0000:00:1f.2: reg 14 io port: [0x40e4-0x40e7]
pci 0000:00:1f.2: reg 18 io port: [0x40c0-0x40c7]
pci 0000:00:1f.2: reg 1c io port: [0x40e0-0x40e3]
pci 0000:00:1f.2: reg 20 io port: [0x40a0-0x40af]
pci 0000:00:1f.2: reg 24 32bit mmio: [0x50404000-0x504043ff]
pci 0000:00:1f.2: PME# supported from D3hot
pci 0000:00:1f.2: PME# disabled
pci 0000:00:1f.3: reg 20 io port: [0x4000-0x401f]
pci 0000:01:00.0: reg 10 64bit mmio: [0x40000000-0x4fffffff]
pci 0000:01:00.0: reg 18 64bit mmio: [0x50300000-0x5030ffff]
pci 0000:01:00.0: reg 20 io port: [0x3000-0x30ff]
pci 0000:01:00.0: reg 30 32bit mmio: [0xfffe0000-0xffffffff]
pci 0000:01:00.0: supports D1 D2
pci 0000:01:00.1: reg 10 64bit mmio: [0x50310000-0x5031ffff]
pci 0000:01:00.1: supports D1 D2
pci 0000:01:00.0: disabling ASPM on pre-1.1 PCIe device. You can enable it with 'pcie_aspm=force'
pci 0000:00:01.0: bridge io port: [0x3000-0x3fff]
pci 0000:00:01.0: bridge 32bit mmio: [0x50300000-0x503fffff]
pci 0000:00:01.0: bridge 64bit mmio pref: [0x40000000-0x4fffffff]
pci 0000:02:00.0: reg 10 64bit mmio: [0x50200000-0x502fffff]
pci 0000:02:00.0: supports D1 D2
pci 0000:02:00.0: PME# supported from D0 D1 D2
pci 0000:02:00.0: PME# disabled
pci 0000:02:00.0: disabling ASPM on pre-1.1 PCIe device. You can enable it with 'pcie_aspm=force'
pci 0000:00:1c.0: bridge 32bit mmio: [0x50200000-0x502fffff]
pci 0000:04:00.0: reg 10 32bit mmio: [0x50100000-0x5011ffff]
pci 0000:04:00.0: reg 18 io port: [0x2000-0x201f]
pci 0000:04:00.0: PME# supported from D0 D3hot D3cold
pci 0000:04:00.0: PME# disabled
pci 0000:04:00.0: disabling ASPM on pre-1.1 PCIe device. You can enable it with 'pcie_aspm=force'
pci 0000:00:1c.5: bridge io port: [0x2000-0x2fff]
pci 0000:00:1c.5: bridge 32bit mmio: [0x50100000-0x501fffff]
pci 0000:05:02.0: reg 10 32bit mmio: [0x50000000-0x50007fff]
pci 0000:05:04.0: reg 10 32bit mmio: [0x5000c000-0x5000c7ff]
pci 0000:05:04.0: reg 14 32bit mmio: [0x50008000-0x5000bfff]
pci 0000:05:04.0: supports D1 D2
pci 0000:05:04.0: PME# supported from D0 D1 D2 D3hot
pci 0000:05:04.0: PME# disabled
pci 0000:05:05.0: reg 10 io port: [0x1018-0x101f]
pci 0000:05:05.0: reg 14 io port: [0x1024-0x1027]
pci 0000:05:05.0: reg 18 io port: [0x1010-0x1017]
pci 0000:05:05.0: reg 1c io port: [0x1020-0x1023]
pci 0000:05:05.0: reg 20 io port: [0x1000-0x100f]
pci 0000:05:05.0: reg 24 32bit mmio: [0x5000c800-0x5000cbff]
pci 0000:05:05.0: reg 30 32bit mmio: [0xfff80000-0xffffffff]
pci 0000:05:05.0: supports D1 D2
pci 0000:00:1e.0: transparent bridge
pci 0000:00:1e.0: bridge io port: [0x1000-0x1fff]
pci 0000:00:1e.0: bridge 32bit mmio: [0x50000000-0x500fffff]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.P32_._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PEX0._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PEX4._PRT]
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PEX5._PRT]
initcall acpi_pci_root_init+0x0/0x28 returned 0 after 304688 usecs
calling acpi_pci_link_init+0x0/0x63 @ 1
ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 7 9 10 *11 12)
ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 7 9 *10 11 12)
ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 7 9 *10 11 12)
ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 7 *9 10 11 12)
ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 7 9 10 11 12) *0, disabled.
ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 7 9 10 11 12) *0, disabled.
ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 7 *9 10 11 12)
ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 7 9 10 *11 12)
initcall acpi_pci_link_init+0x0/0x63 returned 0 after 46875 usecs
calling acpi_power_init+0x0/0x77 @ 1
initcall acpi_power_init+0x0/0x77 returned 0 after 0 usecs
calling acpi_system_init+0x0/0x265 @ 1
initcall acpi_system_init+0x0/0x265 returned 0 after 0 usecs
calling acpi_wmi_init+0x0/0x4f @ 1
ACPI: WMI: Mapper loaded
initcall acpi_wmi_init+0x0/0x4f returned 0 after 3906 usecs
calling pnp_init+0x0/0x20 @ 1
initcall pnp_init+0x0/0x20 returned 0 after 0 usecs
calling setup_shutdown_event+0x0/0x20 @ 1
initcall setup_shutdown_event+0x0/0x20 returned 0 after 0 usecs
calling misc_init+0x0/0xb0 @ 1
initcall misc_init+0x0/0xb0 returned 0 after 0 usecs
calling cn_init+0x0/0xf0 @ 1
initcall cn_init+0x0/0xf0 returned 0 after 0 usecs
calling tifm_init+0x0/0x90 @ 1
initcall tifm_init+0x0/0x90 returned 0 after 0 usecs
calling phy_init+0x0/0x40 @ 1
initcall phy_init+0x0/0x40 returned 0 after 0 usecs
Clocksource tsc unstable (delta = 82414432 ns)
calling init_scsi+0x0/0xb0 @ 1
SCSI subsystem initialized
initcall init_scsi+0x0/0xb0 returned 0 after 3906 usecs
calling ata_init+0x0/0x3c0 @ 1
libata version 3.00 loaded.
initcall ata_init+0x0/0x3c0 returned 0 after 3906 usecs
calling init_pcmcia_cs+0x0/0x30 @ 1
initcall init_pcmcia_cs+0x0/0x30 returned 0 after 0 usecs
calling usb_init+0x0/0x120 @ 1
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
initcall usb_init+0x0/0x120 returned 0 after 11718 usecs
calling serio_init+0x0/0xb0 @ 1
initcall serio_init+0x0/0xb0 returned 0 after 0 usecs
calling gameport_init+0x0/0xb0 @ 1
initcall gameport_init+0x0/0xb0 returned 0 after 0 usecs
calling input_init+0x0/0x130 @ 1
initcall input_init+0x0/0x130 returned 0 after 0 usecs
calling rtc_init+0x0/0x70 @ 1
initcall rtc_init+0x0/0x70 returned 0 after 0 usecs
calling tps_init+0x0/0xe0 @ 1
tps65010: version 2 May 2005
tps65010: no chip?
initcall tps_init+0x0/0xe0 returned -19 after 35156 usecs
calling hwmon_init+0x0/0x50 @ 1
initcall hwmon_init+0x0/0x50 returned 0 after 0 usecs
calling thermal_init+0x0/0x60 @ 1
initcall thermal_init+0x0/0x60 returned 0 after 0 usecs
calling md_init+0x0/0xe0 @ 1
initcall md_init+0x0/0xe0 returned 0 after 0 usecs
calling mmc_init+0x0/0x90 @ 1
initcall mmc_init+0x0/0x90 returned 0 after 0 usecs
calling leds_init+0x0/0x40 @ 1
initcall leds_init+0x0/0x40 returned 0 after 0 usecs
calling dma_bus_init+0x0/0x40 @ 1
initcall dma_bus_init+0x0/0x40 returned 0 after 0 usecs
calling dca_init+0x0/0x20 @ 1
dca service started, version 1.4
initcall dca_init+0x0/0x20 returned 0 after 3906 usecs
calling pci_subsys_init+0x0/0x130 @ 1
PCI: Using ACPI for IRQ routing
initcall pci_subsys_init+0x0/0x130 returned 0 after 0 usecs
calling proto_init+0x0/0x30 @ 1
initcall proto_init+0x0/0x30 returned 0 after 0 usecs
calling net_dev_init+0x0/0x180 @ 1
initcall net_dev_init+0x0/0x180 returned 0 after 0 usecs
calling neigh_init+0x0/0x80 @ 1
initcall neigh_init+0x0/0x80 returned 0 after 0 usecs
calling fib_rules_init+0x0/0xb0 @ 1
initcall fib_rules_init+0x0/0xb0 returned 0 after 0 usecs
calling pktsched_init+0x0/0xd0 @ 1
initcall pktsched_init+0x0/0xd0 returned 0 after 0 usecs
calling tc_filter_init+0x0/0x50 @ 1
initcall tc_filter_init+0x0/0x50 returned 0 after 0 usecs
calling tc_action_init+0x0/0x50 @ 1
initcall tc_action_init+0x0/0x50 returned 0 after 0 usecs
calling genl_init+0x0/0xe0 @ 1
initcall genl_init+0x0/0xe0 returned 0 after 15625 usecs
calling irda_init+0x0/0xb0 @ 1
NET: Registered protocol family 23
initcall irda_init+0x0/0xb0 returned 0 after 0 usecs
calling atm_init+0x0/0xd0 @ 1
NET: Registered protocol family 8
NET: Registered protocol family 20
initcall atm_init+0x0/0xd0 returned 0 after 7812 usecs
calling wireless_nlevent_init+0x0/0x50 @ 1
initcall wireless_nlevent_init+0x0/0x50 returned 0 after 0 usecs
calling rfkill_init+0x0/0x90 @ 1
initcall rfkill_init+0x0/0x90 returned 0 after 0 usecs
calling sysctl_init+0x0/0x50 @ 1
initcall sysctl_init+0x0/0x50 returned 0 after 0 usecs
calling xen_mc_debugfs+0x0/0x120 @ 1
initcall xen_mc_debugfs+0x0/0x120 returned 0 after 0 usecs
calling xen_mmu_debugfs+0x0/0x2c0 @ 1
initcall xen_mmu_debugfs+0x0/0x2c0 returned 0 after 0 usecs
calling xen_spinlock_debugfs+0x0/0x250 @ 1
initcall xen_spinlock_debugfs+0x0/0x250 returned 0 after 0 usecs
calling pci_iommu_init+0x0/0x20 @ 1
initcall pci_iommu_init+0x0/0x20 returned 0 after 0 usecs
calling print_all_ICs+0x0/0x500 @ 1
printing PIC contents
... PIC IMR: fdfa
... PIC IRR: 0c00
... PIC ISR: 0000
... PIC ELCR: 0200
printing local APIC contents on CPU#0/0:
... APIC ID: 00000000 (0)
... APIC VERSION: 00050014
... APIC TASKPRI: 00000000 (00)
... APIC PROCPRI: 00000000
... APIC LDR: 01000000
... APIC DFR: ffffffff
... APIC SPIV: 000001ff
... APIC ISR field:
0123456789abcdef0123456789abcdef
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
... APIC TMR field:
0123456789abcdef0123456789abcdef
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
... APIC IRR field:
0123456789abcdef0123456789abcdef
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
... APIC ESR: 00000000
... APIC ICR: 00000200
... APIC ICR2: 01000000
... APIC LVTT: 00010000
... APIC LVTPC: 00010000
... APIC LVT0: 00001700
... APIC LVT1: 00000400
... APIC LVTERR: 000000fe
... APIC TMICT: 00000000
... APIC TMCCT: 00000000
... APIC TDCR: 00000000
number of MP IRQ sources: 0.
testing the IO APIC.......................
IRQ to pin mappings:
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 1, comm: swapper Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff814af540>] ? print_local_APIC+0x0/0x3b0
[<ffffffff80e43aad>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff80e4460f>] ? _spin_unlock_irqrestore+0x5f/0x70
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff814af1ed>] print_all_ICs+0x41d/0x500
[<ffffffff8027334a>] ? getnstimeofday+0x3a/0xc0
[<ffffffff8026f12a>] ? ktime_get_ts+0x4a/0x60
[<ffffffff814aedd0>] ? print_all_ICs+0x0/0x500
[<ffffffff8020a03c>] do_one_initcall+0x3c/0x180
[<ffffffff814a1140>] ? early_idt_handler+0x0/0x73
[<ffffffff80291da2>] ? irq_to_desc+0x42/0x50
[<ffffffff814a1140>] ? early_idt_handler+0x0/0x73
[<ffffffff814a1f83>] kernel_init+0x133/0x190
[<ffffffff80e43aad>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[<ffffffff802149aa>] child_rip+0xa/0x20
[<ffffffff802142be>] ? restore_args+0x0/0x30
[<ffffffff814a1e50>] ? kernel_init+0x0/0x190
[<ffffffff802149a0>] ? child_rip+0x0/0x20
---[ end trace 4eaa2a86a8e2da22 ]---
.................................... done.
initcall print_all_ICs+0x0/0x500 returned 0 after 136719 usecs
calling hpet_late_init+0x0/0x1c0 @ 1
initcall hpet_late_init+0x0/0x1c0 returned -19 after 0 usecs
calling clocksource_done_booting+0x0/0x20 @ 1
initcall clocksource_done_booting+0x0/0x20 returned 0 after 0 usecs
calling rb_init_debugfs+0x0/0x50 @ 1
initcall rb_init_debugfs+0x0/0x50 returned 0 after 0 usecs
calling tracer_init_debugfs+0x0/0x310 @ 1
initcall tracer_init_debugfs+0x0/0x310 returned 0 after 0 usecs
calling init_pipe_fs+0x0/0x60 @ 1
initcall init_pipe_fs+0x0/0x60 returned 0 after 0 usecs
calling init_mnt_writers+0x0/0x90 @ 1
initcall init_mnt_writers+0x0/0x90 returned 0 after 0 usecs
calling eventpoll_init+0x0/0xa0 @ 1
initcall eventpoll_init+0x0/0xa0 returned 0 after 0 usecs
calling anon_inode_init+0x0/0x130 @ 1
initcall anon_inode_init+0x0/0x130 returned 0 after 0 usecs
calling pcie_aspm_init+0x0/0x30 @ 1
initcall pcie_aspm_init+0x0/0x30 returned 0 after 3906 usecs
calling acpi_event_init+0x0/0x80 @ 1
initcall acpi_event_init+0x0/0x80 returned 0 after 15625 usecs
calling pnp_system_init+0x0/0x20 @ 1
initcall pnp_system_init+0x0/0x20 returned 0 after 0 usecs
calling pnpacpi_init+0x0/0xa0 @ 1
pnp: PnP ACPI init
ACPI: bus type pnp registered
system 00:01: iomem range 0xf0000000-0xf3ffffff has been reserved
system 00:01: iomem range 0xfed13000-0xfed13fff has been reserved
system 00:01: iomem range 0xfed14000-0xfed17fff has been reserved
system 00:01: iomem range 0xfed18000-0xfed18fff has been reserved
system 00:01: iomem range 0xfed19000-0xfed19fff has been reserved
system 00:01: iomem range 0xfed1c000-0xfed1ffff has been reserved
system 00:01: iomem range 0xfed20000-0xfed3ffff has been reserved
system 00:01: iomem range 0xfed45000-0xfed99fff has been reserved
system 00:01: iomem range 0xc0000-0xdffff has been reserved
system 00:01: iomem range 0xe0000-0xfffff could not be reserved
system 00:06: ioport range 0x500-0x53f has been reserved
system 00:06: ioport range 0x400-0x47f has been reserved
system 00:06: ioport range 0x680-0x6ff has been reserved
pnp: PnP ACPI: found 13 devices
ACPI: ACPI bus type pnp unregistered
initcall pnpacpi_init+0x0/0xa0 returned 0 after 66406 usecs
calling chr_dev_init+0x0/0xe0 @ 1
initcall chr_dev_init+0x0/0xe0 returned 0 after 3906 usecs
calling firmware_class_init+0x0/0x90 @ 1
initcall firmware_class_init+0x0/0x90 returned 0 after 0 usecs
calling loopback_init+0x0/0x20 @ 1
initcall loopback_init+0x0/0x20 returned 0 after 0 usecs
calling cpufreq_gov_performance_init+0x0/0x20 @ 1
initcall cpufreq_gov_performance_init+0x0/0x20 returned 0 after 0 usecs
calling init_acpi_pm_clocksource+0x0/0x100 @ 1
initcall init_acpi_pm_clocksource+0x0/0x100 returned 0 after 3906 usecs
Switched to NOHz mode on CPU #0
calling ssb_modinit+0x0/0x70 @ 1
initcall ssb_modinit+0x0/0x70 returned 0 after 95 usecs
calling pcibios_assign_resources+0x0/0x90 @ 1
pci 0000:00:01.0: PCI bridge, secondary bus 0000:01
pci 0000:00:01.0: IO window: 0x3000-0x3fff
pci 0000:00:01.0: MEM window: 0x50300000-0x503fffff
pci 0000:00:01.0: PREFETCH window: 0x00000040000000-0x0000004fffffff
pci 0000:00:1c.0: PCI bridge, secondary bus 0000:02
pci 0000:00:1c.0: IO window: disabled
pci 0000:00:1c.0: MEM window: 0x50200000-0x502fffff
pci 0000:00:1c.0: PREFETCH window: disabled
pci 0000:00:1c.4: PCI bridge, secondary bus 0000:03
pci 0000:00:1c.4: IO window: disabled
pci 0000:00:1c.4: MEM window: disabled
pci 0000:00:1c.4: PREFETCH window: disabled
pci 0000:00:1c.5: PCI bridge, secondary bus 0000:04
pci 0000:00:1c.5: IO window: 0x2000-0x2fff
pci 0000:00:1c.5: MEM window: 0x50100000-0x501fffff
pci 0000:00:1c.5: PREFETCH window: disabled
pci 0000:00:1e.0: PCI bridge, secondary bus 0000:05
pci 0000:00:1e.0: IO window: 0x1000-0x1fff
pci 0000:00:1e.0: MEM window: 0x50000000-0x500fffff
pci 0000:00:1e.0: PREFETCH window: disabled
ACPI: PCI Interrupt Link [LNKA] enabled at IRQ 11
PCI: setting IRQ 11 as level-triggered
pci 0000:00:01.0: PCI INT A -> Link[LNKA] -> GSI 11 (level, low) -> IRQ 11
pci 0000:00:01.0: setting latency timer to 64
ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 10
PCI: setting IRQ 10 as level-triggered
pci 0000:00:1c.0: PCI INT A -> Link[LNKB] -> GSI 10 (level, low) -> IRQ 10
pci 0000:00:1c.0: setting latency timer to 64
pci 0000:00:1c.4: PCI INT A -> Link[LNKB] -> GSI 10 (level, low) -> IRQ 10
pci 0000:00:1c.4: setting latency timer to 64
pci 0000:00:1c.5: PCI INT B -> Link[LNKA] -> GSI 11 (level, low) -> IRQ 11
pci 0000:00:1c.5: setting latency timer to 64
pci 0000:00:1e.0: setting latency timer to 64
bus: 00 index 0 io port: [0x00-0xffff]
bus: 00 index 1 mmio: [0x000000-0xffffffffffffffff]
bus: 01 index 0 io port: [0x3000-0x3fff]
bus: 01 index 1 mmio: [0x50300000-0x503fffff]
bus: 01 index 2 mmio: [0x40000000-0x4fffffff]
bus: 01 index 3 mmio: [0x0-0x0]
bus: 02 index 0 mmio: [0x0-0x0]
bus: 02 index 1 mmio: [0x50200000-0x502fffff]
bus: 02 index 2 mmio: [0x0-0x0]
bus: 02 index 3 mmio: [0x0-0x0]
bus: 03 index 0 mmio: [0x0-0x0]
bus: 03 index 1 mmio: [0x0-0x0]
bus: 03 index 2 mmio: [0x0-0x0]
bus: 03 index 3 mmio: [0x0-0x0]
bus: 04 index 0 io port: [0x2000-0x2fff]
bus: 04 index 1 mmio: [0x50100000-0x501fffff]
bus: 04 index 2 mmio: [0x0-0x0]
bus: 04 index 3 mmio: [0x0-0x0]
bus: 05 index 0 io port: [0x1000-0x1fff]
bus: 05 index 1 mmio: [0x50000000-0x500fffff]
bus: 05 index 2 mmio: [0x0-0x0]
bus: 05 index 3 io port: [0x00-0xffff]
bus: 05 index 4 mmio: [0x000000-0xffffffffffffffff]
initcall pcibios_assign_resources+0x0/0x90 returned 0 after 229924 usecs
calling inet_init+0x0/0x250 @ 1
NET: Registered protocol family 2
IP route cache hash table entries: 32768 (order: 6, 262144 bytes)
TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
TCP bind hash table entries: 65536 (order: 10, 4718592 bytes)
TCP: Hash tables configured (established 131072 bind 65536)
TCP reno registered
initcall inet_init+0x0/0x250 returned 0 after 78074 usecs
calling af_unix_init+0x0/0x70 @ 1
NET: Registered protocol family 1
initcall af_unix_init+0x0/0x70 returned 0 after 3036 usecs
calling default_rootfs+0x0/0x80 @ 1
initcall default_rootfs+0x0/0x80 returned 0 after 68 usecs
calling calgary_fixup_tce_spaces+0x0/0x110 @ 1
initcall calgary_fixup_tce_spaces+0x0/0x110 returned -19 after 1 usecs
calling i8259A_init_sysfs+0x0/0x30 @ 1
initcall i8259A_init_sysfs+0x0/0x30 returned 0 after 250 usecs
calling vsyscall_init+0x0/0x70 @ 1
initcall vsyscall_init+0x0/0x70 returned 0 after 15 usecs
calling sbf_init+0x0/0xe0 @ 1
initcall sbf_init+0x0/0xe0 returned 0 after 1 usecs
calling i8237A_init_sysfs+0x0/0x30 @ 1
initcall i8237A_init_sysfs+0x0/0x30 returned 0 after 156 usecs
calling add_rtc_cmos+0x0/0xb0 @ 1
initcall add_rtc_cmos+0x0/0xb0 returned 0 after 3 usecs
calling cache_sysfs_init+0x0/0x60 @ 1
initcall cache_sysfs_init+0x0/0x60 returned 0 after 1 usecs
calling cpuid_init+0x0/0x100 @ 1
initcall cpuid_init+0x0/0x100 returned 0 after 201 usecs
calling init_lapic_sysfs+0x0/0x30 @ 1
initcall init_lapic_sysfs+0x0/0x30 returned 0 after 148 usecs
calling ioapic_init_sysfs+0x0/0xe0 @ 1
initcall ioapic_init_sysfs+0x0/0xe0 returned 0 after 75 usecs
calling add_pcspkr+0x0/0x30 @ 1
initcall add_pcspkr+0x0/0x30 returned 0 after 113 usecs
calling start_periodic_check_for_corruption+0x0/0x40 @ 1
Scanning for low memory corruption every 60 seconds
initcall start_periodic_check_for_corruption+0x0/0x40 returned 0 after 4549 usecs
calling uv_ptc_init+0x0/0x60 @ 1
initcall uv_ptc_init+0x0/0x60 returned 0 after 1 usecs
calling uv_bau_init+0x0/0x660 @ 1
initcall uv_bau_init+0x0/0x660 returned 0 after 0 usecs
calling sgi_uv_sysfs_init+0x0/0xb0 @ 1
initcall sgi_uv_sysfs_init+0x0/0xb0 returned 0 after 7 usecs
calling audit_classes_init+0x0/0xb0 @ 1
initcall audit_classes_init+0x0/0xb0 returned 0 after 9 usecs
calling start_pageattr_test+0x0/0x50 @ 1
initcall start_pageattr_test+0x0/0x50 returned 0 after 72 usecs
calling pt_dump_init+0x0/0x30 @ 1
initcall pt_dump_init+0x0/0x30 returned 0 after 9 usecs
calling aes_init+0x0/0x20 @ 1
alg: cipher: Test 1 failed on encryption for aes-asm
00000000: 00 01 02 03 04 05 06 07 08 08 08 08 08 08 08 08
initcall aes_init+0x0/0x20 returned 0 after 9831 usecs
calling init+0x0/0x20 @ 1
initcall init+0x0/0x20 returned 0 after 42 usecs
calling init_vdso_vars+0x0/0x220 @ 1
initcall init_vdso_vars+0x0/0x220 returned 0 after 16 usecs
calling ia32_binfmt_init+0x0/0x20 @ 1
initcall ia32_binfmt_init+0x0/0x20 returned 0 after 8 usecs
calling sysenter_setup+0x0/0x380 @ 1
initcall sysenter_setup+0x0/0x380 returned 0 after 4 usecs
calling init_aout_binfmt+0x0/0x20 @ 1
initcall init_aout_binfmt+0x0/0x20 returned 0 after 1 usecs
calling init_sched_debug_procfs+0x0/0x30 @ 1
initcall init_sched_debug_procfs+0x0/0x30 returned 0 after 7 usecs
calling proc_schedstat_init+0x0/0x30 @ 1
initcall proc_schedstat_init+0x0/0x30 returned 0 after 4 usecs
calling proc_execdomains_init+0x0/0x30 @ 1
initcall proc_execdomains_init+0x0/0x30 returned 0 after 4 usecs
calling ioresources_init+0x0/0x40 @ 1
initcall ioresources_init+0x0/0x40 returned 0 after 11 usecs
calling uid_cache_init+0x0/0x80 @ 1
initcall uid_cache_init+0x0/0x80 returned 0 after 7 usecs
calling init_posix_timers+0x0/0x110 @ 1
initcall init_posix_timers+0x0/0x110 returned 0 after 4 usecs
calling init_posix_cpu_timers+0x0/0xe0 @ 1
initcall init_posix_cpu_timers+0x0/0xe0 returned 0 after 1 usecs
calling nsproxy_cache_init+0x0/0x30 @ 1
initcall nsproxy_cache_init+0x0/0x30 returned 0 after 4 usecs
calling create_proc_profile+0x0/0x310 @ 1
initcall create_proc_profile+0x0/0x310 returned 0 after 11 usecs
calling timekeeping_init_device+0x0/0x30 @ 1
initcall timekeeping_init_device+0x0/0x30 returned 0 after 157 usecs
calling init_clocksource_sysfs+0x0/0x60 @ 1
initcall init_clocksource_sysfs+0x0/0x60 returned 0 after 175 usecs
calling init_timer_list_procfs+0x0/0x30 @ 1
initcall init_timer_list_procfs+0x0/0x30 returned 0 after 4 usecs
calling lockdep_proc_init+0x0/0x60 @ 1
initcall lockdep_proc_init+0x0/0x60 returned 0 after 9 usecs
calling futex_init+0x0/0xf0 @ 1
initcall futex_init+0x0/0xf0 returned 0 after 18 usecs
calling proc_dma_init+0x0/0x30 @ 1
initcall proc_dma_init+0x0/0x30 returned 0 after 4 usecs
calling kallsyms_init+0x0/0x30 @ 1
initcall kallsyms_init+0x0/0x30 returned 0 after 3 usecs
calling crash_save_vmcoreinfo_init+0x0/0x470 @ 1
initcall crash_save_vmcoreinfo_init+0x0/0x470 returned 0 after 11 usecs
calling crash_notes_memory_init+0x0/0x40 @ 1
initcall crash_notes_memory_init+0x0/0x40 returned 0 after 2 usecs
calling backtrace_regression_test+0x0/0x100 @ 1
====[ backtrace testing ]===========
Testing a backtrace from process context.
The following trace is a kernel self test and not a bug!
Pid: 1, comm: swapper Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80285160>] ? backtrace_regression_test+0x0/0x100
[<ffffffff80285198>] backtrace_regression_test+0x38/0x100
[<ffffffff8027334a>] ? getnstimeofday+0x3a/0xc0
[<ffffffff8026f12a>] ? ktime_get_ts+0x4a/0x60
[<ffffffff80285160>] ? backtrace_regression_test+0x0/0x100
[<ffffffff8026f151>] ? ktime_get+0x11/0x50
[<ffffffff8020a03c>] do_one_initcall+0x3c/0x180
[<ffffffff814a1140>] ? early_idt_handler+0x0/0x73
[<ffffffff80291da2>] ? irq_to_desc+0x42/0x50
[<ffffffff814a1140>] ? early_idt_handler+0x0/0x73
[<ffffffff814a1f83>] kernel_init+0x133/0x190
[<ffffffff80e43aad>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[<ffffffff802149aa>] child_rip+0xa/0x20
[<ffffffff802142be>] ? restore_args+0x0/0x30
[<ffffffff814a1e50>] ? kernel_init+0x0/0x190
[<ffffffff802149a0>] ? child_rip+0x0/0x20
Testing a backtrace from irq context.
The following trace is a kernel self test and not a bug!
Pid: 4, comm: ksoftirqd/0 Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
<IRQ> [<ffffffff80285149>] backtrace_test_irq_callback+0x9/0x20
[<ffffffff8025a8e9>] tasklet_action+0x79/0x100
[<ffffffff8025a58d>] __do_softirq+0x9d/0x190
[<ffffffff8025a680>] ? ksoftirqd+0x0/0xf0
[<ffffffff80214aac>] call_softirq+0x1c/0x30
<EOI> [<ffffffff80216715>] do_softirq+0x85/0xd0
[<ffffffff8025a6f5>] ksoftirqd+0x75/0xf0
[<ffffffff8026bc2d>] kthread+0x4d/0x80
[<ffffffff802149aa>] child_rip+0xa/0x20
[<ffffffff802142be>] ? restore_args+0x0/0x30
[<ffffffff8026bbe0>] ? kthread+0x0/0x80
[<ffffffff802149a0>] ? child_rip+0x0/0x20
Testing a saved backtrace.
The following trace is a kernel self test and not a bug!
[<ffffffff802201aa>] save_stack_trace+0x2a/0x50
[<ffffffff80285236>] backtrace_regression_test+0xd6/0x100
[<ffffffff8020a03c>] do_one_initcall+0x3c/0x180
[<ffffffff814a1f83>] kernel_init+0x133/0x190
[<ffffffff802149aa>] child_rip+0xa/0x20
[<ffffffffffffffff>] 0xffffffffffffffff
====[ end of backtrace testing ]====
initcall backtrace_regression_test+0x0/0x100 returned 0 after 191082 usecs
calling ikconfig_init+0x0/0x40 @ 1
initcall ikconfig_init+0x0/0x40 returned 0 after 4 usecs
calling audit_init+0x0/0x170 @ 1
audit: initializing netlink socket (disabled)
type=2000 audit(1227953790.187:1): initialized
audit: cannot initialize inotify handle
initcall audit_init+0x0/0x170 returned 0 after 11710 usecs
calling utsname_sysctl_init+0x0/0x20 @ 1
initcall utsname_sysctl_init+0x0/0x20 returned 0 after 21 usecs
calling init_lstats_procfs+0x0/0x30 @ 1
initcall init_lstats_procfs+0x0/0x30 returned 0 after 4 usecs
calling init_stack_trace+0x0/0x20 @ 1
Testing tracer sysprof: PASSED
initcall init_stack_trace+0x0/0x20 returned 0 after 103900 usecs
calling init_irqsoff_tracer+0x0/0x20 @ 1
Testing tracer irqsoff: PASSED
initcall init_irqsoff_tracer+0x0/0x20 returned 0 after 2908 usecs
calling init_bts_trace+0x0/0x20 @ 1
initcall init_bts_trace+0x0/0x20 returned 0 after 1 usecs
calling init_power_trace+0x0/0x20 @ 1
initcall init_power_trace+0x0/0x20 returned 0 after 1 usecs
calling init_per_zone_pages_min+0x0/0x60 @ 1
initcall init_per_zone_pages_min+0x0/0x60 returned 0 after 32 usecs
calling pdflush_init+0x0/0x20 @ 1
initcall pdflush_init+0x0/0x20 returned 0 after 62 usecs
calling kswapd_init+0x0/0x70 @ 1
initcall kswapd_init+0x0/0x70 returned 0 after 33 usecs
calling setup_vmstat+0x0/0xc0 @ 1
initcall setup_vmstat+0x0/0xc0 returned 0 after 15 usecs
calling mm_sysfs_init+0x0/0x30 @ 1
initcall mm_sysfs_init+0x0/0x30 returned 0 after 6 usecs
calling proc_vmalloc_init+0x0/0x30 @ 1
initcall proc_vmalloc_init+0x0/0x30 returned 0 after 4 usecs
calling init_tmpfs+0x0/0xf0 @ 1
initcall init_tmpfs+0x0/0xf0 returned 0 after 55 usecs
calling slab_proc_init+0x0/0x30 @ 1
initcall slab_proc_init+0x0/0x30 returned 0 after 4 usecs
calling slab_sysfs_init+0x0/0x100 @ 1
initcall slab_sysfs_init+0x0/0x100 returned 0 after 13731 usecs
calling fasync_init+0x0/0x30 @ 1
initcall fasync_init+0x0/0x30 returned 0 after 1218 usecs
calling proc_filesystems_init+0x0/0x30 @ 1
initcall proc_filesystems_init+0x0/0x30 returned 0 after 8 usecs
calling proc_locks_init+0x0/0x30 @ 1
initcall proc_locks_init+0x0/0x30 returned 0 after 4 usecs
calling init_sys32_ioctl+0x0/0x90 @ 1
initcall init_sys32_ioctl+0x0/0x90 returned 0 after 13 usecs
calling init_mbcache+0x0/0x20 @ 1
initcall init_mbcache+0x0/0x20 returned 0 after 1 usecs
calling dquot_init+0x0/0x120 @ 1
VFS: Disk quotas dquot_6.5.1
Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
initcall dquot_init+0x0/0x120 returned 0 after 7858 usecs
calling init_v1_quota_format+0x0/0x20 @ 1
initcall init_v1_quota_format+0x0/0x20 returned 0 after 1 usecs
calling dnotify_init+0x0/0x30 @ 1
initcall dnotify_init+0x0/0x30 returned 0 after 145 usecs
calling proc_cmdline_init+0x0/0x30 @ 1
initcall proc_cmdline_init+0x0/0x30 returned 0 after 4 usecs
calling proc_cpuinfo_init+0x0/0x30 @ 1
initcall proc_cpuinfo_init+0x0/0x30 returned 0 after 4 usecs
calling proc_devices_init+0x0/0x30 @ 1
initcall proc_devices_init+0x0/0x30 returned 0 after 4 usecs
calling proc_interrupts_init+0x0/0x30 @ 1
initcall proc_interrupts_init+0x0/0x30 returned 0 after 4 usecs
calling proc_loadavg_init+0x0/0x30 @ 1
initcall proc_loadavg_init+0x0/0x30 returned 0 after 4 usecs
calling proc_meminfo_init+0x0/0x30 @ 1
initcall proc_meminfo_init+0x0/0x30 returned 0 after 8 usecs
calling proc_stat_init+0x0/0x30 @ 1
initcall proc_stat_init+0x0/0x30 returned 0 after 4 usecs
calling proc_uptime_init+0x0/0x30 @ 1
initcall proc_uptime_init+0x0/0x30 returned 0 after 4 usecs
calling proc_version_init+0x0/0x30 @ 1
initcall proc_version_init+0x0/0x30 returned 0 after 4 usecs
calling proc_kcore_init+0x0/0x50 @ 1
initcall proc_kcore_init+0x0/0x50 returned 0 after 3 usecs
calling proc_kmsg_init+0x0/0x30 @ 1
initcall proc_kmsg_init+0x0/0x30 returned 0 after 3 usecs
calling configfs_init+0x0/0xf0 @ 1
initcall configfs_init+0x0/0xf0 returned 0 after 159 usecs
calling init_devpts_fs+0x0/0x50 @ 1
initcall init_devpts_fs+0x0/0x50 returned 0 after 30 usecs
calling init_dlm+0x0/0xa0 @ 1
DLM (built Nov 29 2008 11:12:21) installed
initcall init_dlm+0x0/0xa0 returned 0 after 4279 usecs
calling init_ext3_fs+0x0/0x80 @ 1
initcall init_ext3_fs+0x0/0x80 returned 0 after 304 usecs
calling init_ext4_fs+0x0/0xa0 @ 1
initcall init_ext4_fs+0x0/0xa0 returned 0 after 729 usecs
calling journal_init+0x0/0xb0 @ 1
initcall journal_init+0x0/0xb0 returned 0 after 578 usecs
calling journal_init+0x0/0x110 @ 1
initcall journal_init+0x0/0x110 returned 0 after 619 usecs
calling init_ext2_fs+0x0/0x80 @ 1
initcall init_ext2_fs+0x0/0x80 returned 0 after 296 usecs
calling init_cramfs_fs+0x0/0x40 @ 1
initcall init_cramfs_fs+0x0/0x40 returned 0 after 19 usecs
calling init_ramfs_fs+0x0/0x20 @ 1
initcall init_ramfs_fs+0x0/0x20 returned 0 after 1 usecs
calling init_minix_fs+0x0/0x70 @ 1
initcall init_minix_fs+0x0/0x70 returned 0 after 145 usecs
calling init_fat_fs+0x0/0x60 @ 1
initcall init_fat_fs+0x0/0x60 returned 0 after 288 usecs
calling init_vfat_fs+0x0/0x20 @ 1
initcall init_vfat_fs+0x0/0x20 returned 0 after 1 usecs
calling init_msdos_fs+0x0/0x20 @ 1
initcall init_msdos_fs+0x0/0x20 returned 0 after 1 usecs
calling init_bfs_fs+0x0/0x70 @ 1
initcall init_bfs_fs+0x0/0x70 returned 0 after 144 usecs
calling init_iso9660_fs+0x0/0x90 @ 1
initcall init_iso9660_fs+0x0/0x90 returned 0 after 156 usecs
calling init_hfsplus_fs+0x0/0x70 @ 1
initcall init_hfsplus_fs+0x0/0x70 returned 0 after 144 usecs
calling init_hfs_fs+0x0/0x70 @ 1
initcall init_hfs_fs+0x0/0x70 returned 0 after 145 usecs
calling vxfs_init+0x0/0x70 @ 1
initcall vxfs_init+0x0/0x70 returned 0 after 145 usecs
calling init_nfs_fs+0x0/0x130 @ 1
initcall init_nfs_fs+0x0/0x130 returned 0 after 919 usecs
calling init_nfsd+0x0/0x100 @ 1
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
initcall init_nfsd+0x0/0x100 returned 0 after 6195 usecs
calling init_nlm+0x0/0x30 @ 1
initcall init_nlm+0x0/0x30 returned 0 after 26 usecs
calling init_nls_cp437+0x0/0x20 @ 1
initcall init_nls_cp437+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp737+0x0/0x20 @ 1
initcall init_nls_cp737+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp775+0x0/0x20 @ 1
initcall init_nls_cp775+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp852+0x0/0x20 @ 1
initcall init_nls_cp852+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp855+0x0/0x20 @ 1
initcall init_nls_cp855+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp860+0x0/0x20 @ 1
initcall init_nls_cp860+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp864+0x0/0x20 @ 1
initcall init_nls_cp864+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp865+0x0/0x20 @ 1
initcall init_nls_cp865+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp866+0x0/0x20 @ 1
initcall init_nls_cp866+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp874+0x0/0x20 @ 1
initcall init_nls_cp874+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp932+0x0/0x20 @ 1
initcall init_nls_cp932+0x0/0x20 returned 0 after 1 usecs
calling init_nls_euc_jp+0x0/0x50 @ 1
initcall init_nls_euc_jp+0x0/0x50 returned 0 after 1 usecs
calling init_nls_cp936+0x0/0x20 @ 1
initcall init_nls_cp936+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp949+0x0/0x20 @ 1
initcall init_nls_cp949+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp950+0x0/0x20 @ 1
initcall init_nls_cp950+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp1251+0x0/0x20 @ 1
initcall init_nls_cp1251+0x0/0x20 returned 0 after 1 usecs
calling init_nls_ascii+0x0/0x20 @ 1
initcall init_nls_ascii+0x0/0x20 returned 0 after 1 usecs
calling init_nls_iso8859_3+0x0/0x20 @ 1
initcall init_nls_iso8859_3+0x0/0x20 returned 0 after 1 usecs
calling init_nls_iso8859_4+0x0/0x20 @ 1
initcall init_nls_iso8859_4+0x0/0x20 returned 0 after 1 usecs
calling init_nls_iso8859_7+0x0/0x20 @ 1
initcall init_nls_iso8859_7+0x0/0x20 returned 0 after 1 usecs
calling init_nls_cp1255+0x0/0x20 @ 1
initcall init_nls_cp1255+0x0/0x20 returned 0 after 1 usecs
calling init_nls_iso8859_13+0x0/0x20 @ 1
initcall init_nls_iso8859_13+0x0/0x20 returned 0 after 1 usecs
calling init_nls_iso8859_14+0x0/0x20 @ 1
initcall init_nls_iso8859_14+0x0/0x20 returned 0 after 1 usecs
calling init_nls_iso8859_15+0x0/0x20 @ 1
initcall init_nls_iso8859_15+0x0/0x20 returned 0 after 1 usecs
calling init_nls_utf8+0x0/0x30 @ 1
initcall init_nls_utf8+0x0/0x30 returned 0 after 1 usecs
calling init_hpfs_fs+0x0/0x70 @ 1
initcall init_hpfs_fs+0x0/0x70 returned 0 after 168 usecs
calling init_ntfs_fs+0x0/0x270 @ 1
NTFS driver 2.1.29 [Flags: R/O DEBUG].
initcall init_ntfs_fs+0x0/0x270 returned 0 after 4178 usecs
calling init_efs_fs+0x0/0x70 @ 1
EFS: 1.0a - http://aeschi.ch.eu.org/efs/
initcall init_efs_fs+0x0/0x70 returned 0 after 3773 usecs
calling init_affs_fs+0x0/0x70 @ 1
initcall init_affs_fs+0x0/0x70 returned 0 after 145 usecs
calling init_romfs_fs+0x0/0x70 @ 1
initcall init_romfs_fs+0x0/0x70 returned 0 after 144 usecs
calling init_qnx4_fs+0x0/0x80 @ 1
QNX4 filesystem 0.2.3 registered.
initcall init_qnx4_fs+0x0/0x80 returned 0 after 3169 usecs
calling init_autofs4_fs+0x0/0x30 @ 1
initcall init_autofs4_fs+0x0/0x30 returned 0 after 95 usecs
calling fuse_init+0x0/0x140 @ 1
fuse init (API version 7.10)
initcall fuse_init+0x0/0x140 returned 0 after 3288 usecs
calling init_omfs_fs+0x0/0x20 @ 1
initcall init_omfs_fs+0x0/0x20 returned 0 after 2 usecs
calling init_jfs_fs+0x0/0x290 @ 1
JFS: nTxBlock = 7250, nTxLock = 58003
initcall init_jfs_fs+0x0/0x290 returned 0 after 8323 usecs
calling init_xfs_fs+0x0/0xc0 @ 1
SGI XFS with security attributes, realtime, large block/inode numbers, no debug enabled
SGI XFS Quota Management subsystem
initcall init_xfs_fs+0x0/0xc0 returned 0 after 13819 usecs
calling init_befs_fs+0x0/0x90 @ 1
BeFS version: 0.9.3
initcall init_befs_fs+0x0/0x90 returned 0 after 1977 usecs
calling ocfs2_init+0x0/0x210 @ 1
OCFS2 1.5.0
initcall ocfs2_init+0x0/0x210 returned 0 after 1629 usecs
calling ocfs2_stack_glue_init+0x0/0xa0 @ 1
initcall ocfs2_stack_glue_init+0x0/0xa0 returned 0 after 25 usecs
calling o2cb_stack_init+0x0/0x20 @ 1
ocfs2: Registered cluster interface o2cb
initcall o2cb_stack_init+0x0/0x20 returned 0 after 3616 usecs
calling init_o2nm+0x0/0xb0 @ 1
OCFS2 Node Manager 1.5.0
initcall init_o2nm+0x0/0xb0 returned 0 after 3092 usecs
calling dlm_init+0x0/0x290 @ 1
OCFS2 DLM 1.5.0
initcall dlm_init+0x0/0x290 returned 0 after 2137 usecs
calling init_dlmfs_fs+0x0/0xf0 @ 1
OCFS2 DLMFS 1.5.0
OCFS2 User DLM kernel interface loaded
initcall init_dlmfs_fs+0x0/0xf0 returned 0 after 5282 usecs
calling ipc_init+0x0/0x30 @ 1
msgmni has been set to 1812
initcall ipc_init+0x0/0x30 returned 0 after 2532 usecs
calling ipc_sysctl_init+0x0/0x20 @ 1
initcall ipc_sysctl_init+0x0/0x20 returned 0 after 45 usecs
calling init_mqueue_fs+0x0/0xe0 @ 1
initcall init_mqueue_fs+0x0/0xe0 returned 0 after 203 usecs
calling key_proc_init+0x0/0x40 @ 1
initcall key_proc_init+0x0/0x40 returned 0 after 6 usecs
calling init_sel_fs+0x0/0x70 @ 1
initcall init_sel_fs+0x0/0x70 returned 0 after 235 usecs
calling selnl_init+0x0/0x50 @ 1
initcall selnl_init+0x0/0x50 returned 0 after 18 usecs
calling sel_netif_init+0x0/0x70 @ 1
initcall sel_netif_init+0x0/0x70 returned 0 after 4 usecs
calling sel_netnode_init+0x0/0xb0 @ 1
initcall sel_netnode_init+0x0/0xb0 returned 0 after 4 usecs
calling sel_netport_init+0x0/0xb0 @ 1
initcall sel_netport_init+0x0/0xb0 returned 0 after 4 usecs
calling aurule_init+0x0/0x40 @ 1
initcall aurule_init+0x0/0x40 returned 0 after 1 usecs
calling crypto_algapi_init+0x0/0x10 @ 1
initcall crypto_algapi_init+0x0/0x10 returned 0 after 14 usecs
calling chainiv_module_init+0x0/0x20 @ 1
initcall chainiv_module_init+0x0/0x20 returned 0 after 2 usecs
calling eseqiv_module_init+0x0/0x20 @ 1
initcall eseqiv_module_init+0x0/0x20 returned 0 after 1 usecs
calling seqiv_module_init+0x0/0x20 @ 1
initcall seqiv_module_init+0x0/0x20 returned 0 after 1 usecs
calling hmac_module_init+0x0/0x20 @ 1
initcall hmac_module_init+0x0/0x20 returned 0 after 1 usecs
calling crypto_null_mod_init+0x0/0x90 @ 1
alg: No test for cipher_null (cipher_null-generic)
alg: No test for digest_null (digest_null-generic)
alg: No test for compress_null (compress_null-generic)
initcall crypto_null_mod_init+0x0/0x90 returned 0 after 13915 usecs
calling md4_mod_init+0x0/0x20 @ 1
initcall md4_mod_init+0x0/0x20 returned 0 after 53 usecs
calling md5_mod_init+0x0/0x20 @ 1
initcall md5_mod_init+0x0/0x20 returned 0 after 50 usecs
calling rmd128_mod_init+0x0/0x20 @ 1
initcall rmd128_mod_init+0x0/0x20 returned 0 after 54 usecs
calling rmd160_mod_init+0x0/0x20 @ 1
initcall rmd160_mod_init+0x0/0x20 returned 0 after 57 usecs
calling rmd320_mod_init+0x0/0x20 @ 1
initcall rmd320_mod_init+0x0/0x20 returned 0 after 55 usecs
calling sha1_generic_mod_init+0x0/0x20 @ 1
initcall sha1_generic_mod_init+0x0/0x20 returned 0 after 49 usecs
calling sha256_generic_mod_init+0x0/0x50 @ 1
initcall sha256_generic_mod_init+0x0/0x50 returned 0 after 99 usecs
calling wp512_mod_init+0x0/0x90 @ 1
initcall wp512_mod_init+0x0/0x90 returned 0 after 193 usecs
calling crypto_ecb_module_init+0x0/0x20 @ 1
initcall crypto_ecb_module_init+0x0/0x20 returned 0 after 1 usecs
calling crypto_cbc_module_init+0x0/0x20 @ 1
initcall crypto_cbc_module_init+0x0/0x20 returned 0 after 1 usecs
calling crypto_pcbc_module_init+0x0/0x20 @ 1
initcall crypto_pcbc_module_init+0x0/0x20 returned 0 after 1 usecs
calling crypto_cts_module_init+0x0/0x20 @ 1
initcall crypto_cts_module_init+0x0/0x20 returned 0 after 1 usecs
calling crypto_module_init+0x0/0x20 @ 1
initcall crypto_module_init+0x0/0x20 returned 0 after 1 usecs
calling crypto_module_init+0x0/0x20 @ 1
initcall crypto_module_init+0x0/0x20 returned 0 after 1 usecs
calling crypto_ctr_module_init+0x0/0x50 @ 1
initcall crypto_ctr_module_init+0x0/0x50 returned 0 after 2 usecs
calling crypto_gcm_module_init+0x0/0x70 @ 1
initcall crypto_gcm_module_init+0x0/0x70 returned 0 after 3 usecs
calling cryptd_init+0x0/0xc0 @ 1
initcall cryptd_init+0x0/0xc0 returned 0 after 31 usecs
calling des_generic_mod_init+0x0/0x50 @ 1
initcall des_generic_mod_init+0x0/0x50 returned 0 after 122 usecs
calling fcrypt_mod_init+0x0/0x20 @ 1
alg: No test for fcrypt (fcrypt-generic)
initcall fcrypt_mod_init+0x0/0x20 returned 0 after 3663 usecs
calling blowfish_mod_init+0x0/0x20 @ 1
initcall blowfish_mod_init+0x0/0x20 returned 0 after 494 usecs
calling twofish_mod_init+0x0/0x20 @ 1
initcall twofish_mod_init+0x0/0x20 returned 0 after 73 usecs
calling serpent_mod_init+0x0/0x50 @ 1
initcall serpent_mod_init+0x0/0x50 returned 0 after 116 usecs
calling aes_init+0x0/0x360 @ 1
initcall aes_init+0x0/0x360 returned 0 after 75 usecs
calling camellia_init+0x0/0x20 @ 1
initcall camellia_init+0x0/0x20 returned 0 after 58 usecs
calling cast5_mod_init+0x0/0x20 @ 1
initcall cast5_mod_init+0x0/0x20 returned 0 after 55 usecs
calling cast6_mod_init+0x0/0x20 @ 1
initcall cast6_mod_init+0x0/0x20 returned 0 after 59 usecs
calling arc4_init+0x0/0x20 @ 1
initcall arc4_init+0x0/0x20 returned 0 after 61 usecs
calling tea_mod_init+0x0/0x90 @ 1
initcall tea_mod_init+0x0/0x90 returned 0 after 154 usecs
calling anubis_mod_init+0x0/0x20 @ 1
initcall anubis_mod_init+0x0/0x20 returned 0 after 75 usecs
calling salsa20_generic_mod_init+0x0/0x20 @ 1
initcall salsa20_generic_mod_init+0x0/0x20 returned 0 after 43 usecs
calling deflate_mod_init+0x0/0x20 @ 1
initcall deflate_mod_init+0x0/0x20 returned 0 after 362 usecs
calling michael_mic_init+0x0/0x20 @ 1
initcall michael_mic_init+0x0/0x20 returned 0 after 49 usecs
calling crc32c_mod_init+0x0/0x50 @ 1
initcall crc32c_mod_init+0x0/0x50 returned 0 after 120 usecs
calling crypto_authenc_module_init+0x0/0x20 @ 1
initcall crypto_authenc_module_init+0x0/0x20 returned 0 after 2 usecs
calling krng_mod_init+0x0/0x20 @ 1
alg: No test for stdrng (krng)
initcall krng_mod_init+0x0/0x20 returned 0 after 2813 usecs
calling proc_genhd_init+0x0/0x40 @ 1
initcall proc_genhd_init+0x0/0x40 returned 0 after 9 usecs
calling bsg_init+0x0/0x150 @ 1
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 254)
initcall bsg_init+0x0/0x150 returned 0 after 6259 usecs
calling noop_init+0x0/0x20 @ 1
io scheduler noop registered
initcall noop_init+0x0/0x20 returned 0 after 2600 usecs
calling as_init+0x0/0x20 @ 1
io scheduler anticipatory registered
initcall as_init+0x0/0x20 returned 0 after 3260 usecs
calling deadline_init+0x0/0x20 @ 1
io scheduler deadline registered
initcall deadline_init+0x0/0x20 returned 0 after 2938 usecs
calling cfq_init+0x0/0xa0 @ 1
io scheduler cfq registered (default)
initcall cfq_init+0x0/0xa0 returned 0 after 3654 usecs
calling debug_objects_init_debugfs+0x0/0x70 @ 1
initcall debug_objects_init_debugfs+0x0/0x70 returned 0 after 11 usecs
calling init_kmp+0x0/0x20 @ 1
initcall init_kmp+0x0/0x20 returned 0 after 1 usecs
calling init_bm+0x0/0x20 @ 1
initcall init_bm+0x0/0x20 returned 0 after 1 usecs
calling init_fsm+0x0/0x20 @ 1
initcall init_fsm+0x0/0x20 returned 0 after 1 usecs
calling percpu_counter_startup+0x0/0x20 @ 1
initcall percpu_counter_startup+0x0/0x20 returned 0 after 2 usecs
calling dynamic_printk_init+0x0/0xc0 @ 1
initcall dynamic_printk_init+0x0/0xc0 returned 0 after 1986 usecs
calling pci_init+0x0/0x50 @ 1
pci 0000:01:00.0: Boot video device
initcall pci_init+0x0/0x50 returned 0 after 3410 usecs
calling pci_proc_init+0x0/0x70 @ 1
initcall pci_proc_init+0x0/0x70 returned 0 after 121 usecs
calling pcie_portdrv_init+0x0/0x60 @ 1
pcieport-driver 0000:00:01.0: setting latency timer to 64
pcieport-driver 0000:00:01.0: found MSI capability
pci_express 0000:00:01.0:pcie00: allocate port service
pcieport-driver 0000:00:1c.0: setting latency timer to 64
pcieport-driver 0000:00:1c.0: found MSI capability
pci_express 0000:00:1c.0:pcie00: allocate port service
pci_express 0000:00:1c.0:pcie02: allocate port service
pcieport-driver 0000:00:1c.4: setting latency timer to 64
pcieport-driver 0000:00:1c.4: found MSI capability
pci_express 0000:00:1c.4:pcie00: allocate port service
pci_express 0000:00:1c.4:pcie02: allocate port service
pcieport-driver 0000:00:1c.5: setting latency timer to 64
pcieport-driver 0000:00:1c.5: found MSI capability
pci_express 0000:00:1c.5:pcie00: allocate port service
pci_express 0000:00:1c.5:pcie02: allocate port service
initcall pcie_portdrv_init+0x0/0x60 returned 0 after 73188 usecs
calling pci_hotplug_init+0x0/0x60 @ 1
pci_hotplug: PCI Hot Plug PCI Core version: 0.5
initcall pci_hotplug_init+0x0/0x60 returned 0 after 4208 usecs
calling zt5550_init+0x0/0x90 @ 1
cpcihp_zt5550: ZT5550 CompactPCI Hot Plug Driver version: 0.2
initcall zt5550_init+0x0/0x90 returned 0 after 5483 usecs
calling cpcihp_generic_init+0x0/0x520 @ 1
cpcihp_generic: Generic port I/O CompactPCI Hot Plug Driver version: 0.1
cpcihp_generic: not configured, disabling.
initcall cpcihp_generic_init+0x0/0x520 returned -22 after 10107 usecs
initcall cpcihp_generic_init+0x0/0x520 returned with error code -22
calling pcied_init+0x0/0x90 @ 1
pciehp: PCI Express Hot Plug Controller Driver version: 0.4
initcall pcied_init+0x0/0x90 returned 0 after 5595 usecs
calling shpcd_init+0x0/0x70 @ 1
shpchp: Standard Hot Plug PCI Controller Driver version: 0.4
initcall shpcd_init+0x0/0x70 returned 0 after 5399 usecs
calling corgibl_init+0x0/0x20 @ 1
initcall corgibl_init+0x0/0x20 returned 0 after 82 usecs
calling progearbl_init+0x0/0x70 @ 1
ALI M7101 PMU not found.
initcall progearbl_init+0x0/0x70 returned 0 after 2452 usecs
calling mbp_init+0x0/0xf0 @ 1
initcall mbp_init+0x0/0xf0 returned -19 after 2 usecs
calling kb3886_init+0x0/0x40 @ 1
initcall kb3886_init+0x0/0x40 returned -19 after 1 usecs
calling display_class_init+0x0/0x80 @ 1
initcall display_class_init+0x0/0x80 returned 0 after 78 usecs
calling arcfb_init+0x0/0x80 @ 1
initcall arcfb_init+0x0/0x80 returned -6 after 1 usecs
initcall arcfb_init+0x0/0x80 returned with error code -6
calling cyber2000fb_init+0x0/0xe0 @ 1
initcall cyber2000fb_init+0x0/0xe0 returned 0 after 89 usecs
calling pm2fb_init+0x0/0x180 @ 1
initcall pm2fb_init+0x0/0x180 returned 0 after 87 usecs
calling pm3fb_init+0x0/0x130 @ 1
initcall pm3fb_init+0x0/0x130 returned 0 after 87 usecs
calling nvidiafb_init+0x0/0x2e0 @ 1
nvidiafb_setup START
initcall nvidiafb_init+0x0/0x2e0 returned 0 after 1995 usecs
calling atyfb_init+0x0/0x210 @ 1
initcall atyfb_init+0x0/0x210 returned 0 after 92 usecs
calling sisfb_init+0x0/0x830 @ 1
initcall sisfb_init+0x0/0x830 returned 0 after 87 usecs
calling kyrofb_init+0x0/0x120 @ 1
initcall kyrofb_init+0x0/0x120 returned 0 after 115 usecs
calling savagefb_init+0x0/0x80 @ 1
initcall savagefb_init+0x0/0x80 returned 0 after 94 usecs
calling gxfb_init+0x0/0x90 @ 1
initcall gxfb_init+0x0/0x90 returned 0 after 88 usecs
calling lxfb_init+0x0/0x120 @ 1
initcall lxfb_init+0x0/0x120 returned 0 after 91 usecs
calling neofb_init+0x0/0x170 @ 1
initcall neofb_init+0x0/0x170 returned 0 after 88 usecs
calling imsttfb_init+0x0/0x120 @ 1
initcall imsttfb_init+0x0/0x120 returned 0 after 88 usecs
calling vt8623fb_init+0x0/0xa0 @ 1
initcall vt8623fb_init+0x0/0xa0 returned 0 after 88 usecs
calling tridentfb_init+0x0/0x230 @ 1
initcall tridentfb_init+0x0/0x230 returned 0 after 89 usecs
calling vmlfb_init+0x0/0xa0 @ 1
vmlfb: initializing
initcall vmlfb_init+0x0/0xa0 returned 0 after 1931 usecs
calling cr_pll_init+0x0/0x110 @ 1
Could not find Carillo Ranch MCH device.
initcall cr_pll_init+0x0/0x110 returned -19 after 3621 usecs
calling arkfb_init+0x0/0xa0 @ 1
initcall arkfb_init+0x0/0xa0 returned 0 after 88 usecs
calling hecubafb_init+0x0/0x20 @ 1
initcall hecubafb_init+0x0/0x20 returned 0 after 80 usecs
calling metronomefb_init+0x0/0x20 @ 1
initcall metronomefb_init+0x0/0x20 returned 0 after 81 usecs
calling s1d13xxxfb_init+0x0/0x30 @ 1
initcall s1d13xxxfb_init+0x0/0x30 returned 0 after 81 usecs
calling mb862xxfb_init+0x0/0x20 @ 1
initcall mb862xxfb_init+0x0/0x20 returned 0 after 88 usecs
calling uvesafb_init+0x0/0x400 @ 1
uvesafb: failed to execute /sbin/v86d
uvesafb: make sure that the v86d helper is installed and executable
uvesafb: Getting VBE info block failed (eax=0x4f00, err=-2)
uvesafb: vbe_init() failed with -22
uvesafb: probe of uvesafb.0 failed with error -22
initcall uvesafb_init+0x0/0x400 returned 0 after 22356 usecs
calling efifb_init+0x0/0x200 @ 1
initcall efifb_init+0x0/0x200 returned -19 after 1 usecs
calling acpi_reserve_resources+0x0/0xeb @ 1
initcall acpi_reserve_resources+0x0/0xeb returned 0 after 4 usecs
calling acpi_ac_init+0x0/0x28 @ 1
initcall acpi_ac_init+0x0/0x28 returned 0 after 107 usecs
calling acpi_button_init+0x0/0x5e @ 1
input: Power Button (FF) as /class/input/input0
ACPI: Power Button (FF) [PWRF]
input: Sleep Button (CM) as /class/input/input1
ACPI: Sleep Button (CM) [SLPB]
initcall acpi_button_init+0x0/0x5e returned 0 after 14390 usecs
calling acpi_video_init+0x0/0x5e @ 1
initcall acpi_video_init+0x0/0x5e returned 0 after 100 usecs
calling irqrouter_init_sysfs+0x0/0x38 @ 1
initcall irqrouter_init_sysfs+0x0/0x38 returned 0 after 154 usecs
calling acpi_processor_init+0x0/0x107 @ 1
processor ACPI_CPU:00: registered as cooling_device0
initcall acpi_processor_init+0x0/0x107 returned 0 after 5017 usecs
calling acpi_container_init+0x0/0x42 @ 1
initcall acpi_container_init+0x0/0x42 returned 0 after 2873 usecs
calling acpi_thermal_init+0x0/0x83 @ 1
initcall acpi_thermal_init+0x0/0x83 returned 0 after 117 usecs
calling toshiba_acpi_init+0x0/0x461 @ 1
initcall toshiba_acpi_init+0x0/0x461 returned -19 after 4 usecs
calling rand_initialize+0x0/0x30 @ 1
initcall rand_initialize+0x0/0x30 returned 0 after 13 usecs
calling tty_init+0x0/0x110 @ 1
initcall tty_init+0x0/0x110 returned 0 after 26682 usecs
calling pty_init+0x0/0x5c0 @ 1
initcall pty_init+0x0/0x5c0 returned 0 after 62442 usecs
calling sysrq_init+0x0/0x30 @ 1
initcall sysrq_init+0x0/0x30 returned 0 after 15 usecs
calling nozomi_init+0x0/0x170 @ 1
Initializing Nozomi driver 2.1d (build date: Nov 29 2008 11:10:19)
initcall nozomi_init+0x0/0x170 returned 0 after 5937 usecs
calling xen_init+0x0/0xb0 @ 1
initcall xen_init+0x0/0xb0 returned -19 after 1 usecs
calling raw_init+0x0/0xf0 @ 1
initcall raw_init+0x0/0xf0 returned 0 after 310 usecs
calling r3964_init+0x0/0x50 @ 1
r3964: Philips r3964 Driver $Revision: 1.10 $
initcall r3964_init+0x0/0x50 returned 0 after 4049 usecs
calling applicom_init+0x0/0x550 @ 1
Applicom driver: $Id: ac.c,v 1.30 2000/03/22 16:03:57 dwmw2 Exp $
ac.o: No PCI boards found.
ac.o: For an ISA board you must supply memory and irq parameters.
initcall applicom_init+0x0/0x550 returned -6 after 13894 usecs
initcall applicom_init+0x0/0x550 returned with error code -6
calling hpet_init+0x0/0x80 @ 1
initcall hpet_init+0x0/0x80 returned 0 after 225 usecs
calling nvram_init+0x0/0xa0 @ 1
Non-volatile memory driver v1.2
initcall nvram_init+0x0/0xa0 returned 0 after 2940 usecs
calling i8k_init+0x0/0x270 @ 1
initcall i8k_init+0x0/0x270 returned -19 after 3 usecs
calling mod_init+0x0/0x230 @ 1
initcall mod_init+0x0/0x230 returned -19 after 147 usecs
calling mod_init+0x0/0xd0 @ 1
initcall mod_init+0x0/0xd0 returned -19 after 42 usecs
calling pc8736x_gpio_init+0x0/0x4a0 @ 1
platform pc8736x_gpio.0: NatSemi pc8736x GPIO Driver Initializing
platform pc8736x_gpio.0: no device found
initcall pc8736x_gpio_init+0x0/0x4a0 returned -19 after 9564 usecs
calling nsc_gpio_init+0x0/0x20 @ 1
nsc_gpio initializing
initcall nsc_gpio_init+0x0/0x20 returned 0 after 2009 usecs
calling tlclk_init+0x0/0x1e0 @ 1
telclk_interrup = 0xf non-mcpbl0010 hw.
initcall tlclk_init+0x0/0x1e0 returned -6 after 3544 usecs
initcall tlclk_init+0x0/0x1e0 returned with error code -6
calling hangcheck_init+0x0/0x90 @ 1
Hangcheck: starting hangcheck timer 0.9.0 (tick is 180 seconds, margin is 60 seconds).
Hangcheck: Using get_cycles().
initcall hangcheck_init+0x0/0x90 returned 0 after 10289 usecs
calling init_tis+0x0/0xb0 @ 1
initcall init_tis+0x0/0xb0 returned 0 after 95 usecs
calling init_inf+0x0/0x20 @ 1
initcall init_inf+0x0/0x20 returned 0 after 84 usecs
calling cn_proc_init+0x0/0x40 @ 1
initcall cn_proc_init+0x0/0x40 returned 0 after 3 usecs
calling serial8250_init+0x0/0x150 @ 1
Serial: 8250/16550 driver4 ports, IRQ sharing enabled
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
initcall serial8250_init+0x0/0x150 returned 0 after 10145 usecs
calling serial8250_pci_init+0x0/0x20 @ 1
initcall serial8250_pci_init+0x0/0x20 returned 0 after 98 usecs
calling jsm_init_module+0x0/0x60 @ 1
initcall jsm_init_module+0x0/0x60 returned 0 after 100 usecs
calling topology_sysfs_init+0x0/0x50 @ 1
initcall topology_sysfs_init+0x0/0x50 returned 0 after 13 usecs
calling floppy_init+0x0/0x1180 @ 1
Floppy drive(s): fd0 is 1.44M
FDC 0 is a post-1991 82077
initcall floppy_init+0x0/0x1180 returned 0 after 24818 usecs
calling loop_init+0x0/0x1e0 @ 1
loop: module loaded
initcall loop_init+0x0/0x1e0 returned 0 after 3723 usecs
calling cpqarray_init+0x0/0x2d0 @ 1
Compaq SMART2 Driver (v 2.6.0)
initcall cpqarray_init+0x0/0x2d0 returned -19 after 2943 usecs
calling cciss_init+0x0/0x30 @ 1
HP CISS Driver (v 3.6.20)
initcall cciss_init+0x0/0x30 returned 0 after 2446 usecs
calling DAC960_init_module+0x0/0x60 @ 1
initcall DAC960_init_module+0x0/0x60 returned 0 after 197 usecs
calling mm_init+0x0/0x1d0 @ 1
MM: desc_per_page = 128
initcall mm_init+0x0/0x1d0 returned 0 after 2285 usecs
calling init_cryptoloop+0x0/0x40 @ 1
initcall init_cryptoloop+0x0/0x40 returned 0 after 1 usecs
calling carm_init+0x0/0x20 @ 1
initcall carm_init+0x0/0x20 returned 0 after 89 usecs
calling xlblk_init+0x0/0x90 @ 1
initcall xlblk_init+0x0/0x90 returned -19 after 1 usecs
calling asus_laptop_init+0x0/0x330 @ 1
initcall asus_laptop_init+0x0/0x330 returned -19 after 174 usecs
calling eeepc_laptop_init+0x0/0x240 @ 1
initcall eeepc_laptop_init+0x0/0x240 returned -19 after 170 usecs
calling msi_init+0x0/0x180 @ 1
initcall msi_init+0x0/0x180 returned -19 after 1 usecs
calling acer_wmi_init+0x0/0x630 @ 1
acer-wmi: Acer Laptop ACPI-WMI Extras
acer-wmi: No or unsupported WMI interface, unable to load
initcall acer_wmi_init+0x0/0x630 returned -19 after 8418 usecs
calling hp_wmi_init+0x0/0x160 @ 1
initcall hp_wmi_init+0x0/0x160 returned 0 after 1 usecs
calling ioc4_init+0x0/0x20 @ 1
initcall ioc4_init+0x0/0x20 returned 0 after 89 usecs
calling sony_laptop_init+0x0/0xa0 @ 1
initcall sony_laptop_init+0x0/0xa0 returned 0 after 94 usecs
calling acpi_pcc_init+0x0/0x30 @ 1
initcall acpi_pcc_init+0x0/0x30 returned 0 after 90 usecs
calling intel_menlow_module_init+0x0/0x80 @ 1
initcall intel_menlow_module_init+0x0/0x80 returned -19 after 9 usecs
calling enclosure_init+0x0/0x20 @ 1
initcall enclosure_init+0x0/0x20 returned 0 after 96 usecs
calling gru_init+0x0/0x540 @ 1
initcall gru_init+0x0/0x540 returned 0 after 1 usecs
calling ilo_init+0x0/0xa0 @ 1
initcall ilo_init+0x0/0xa0 returned 0 after 166 usecs
calling c2port_init+0x0/0x60 @ 1
Silicon Labs C2 port support v. 0.51.0 - (C) 2007 Rodolfo Giometti
initcall c2port_init+0x0/0x60 returned 0 after 5903 usecs
calling duramar2150_c2port_init+0x0/0x70 @ 1
c2port c2port0: C2 port uc added
c2port c2port0: uc flash has 30 blocks x 512 bytes (15360 bytes total)
initcall duramar2150_c2port_init+0x0/0x70 returned 0 after 9219 usecs
calling sm501_base_init+0x0/0x30 @ 1
initcall sm501_base_init+0x0/0x30 returned 0 after 168 usecs
calling wm8400_module_init+0x0/0x40 @ 1
initcall wm8400_module_init+0x0/0x40 returned 0 after 84 usecs
calling da903x_init+0x0/0x20 @ 1
initcall da903x_init+0x0/0x20 returned 0 after 81 usecs
calling e1000_init_module+0x0/0xa0 @ 1
Intel(R) PRO/1000 Network Driver - version 7.3.20-k3-NAPI
Copyright (c) 1999-2006 Intel Corporation.
initcall e1000_init_module+0x0/0xa0 returned 0 after 8925 usecs
calling e1000_init_module+0x0/0x70 @ 1
e1000e: Intel(R) PRO/1000 Network Driver - 0.3.3.3-k6
e1000e: Copyright (c) 1999-2008 Intel Corporation.
e1000e 0000:04:00.0: PCI INT A -> Link[LNKB] -> GSI 10 (level, low) -> IRQ 10
e1000e 0000:04:00.0: setting latency timer to 64
0000:04:00.0: 0000:04:00.0: Failed to initialize MSI interrupts. Falling back to legacy interrupts.
0000:04:00.0: eth0: (PCI Express:2.5GB/s:Width x1) 00:16:76:ab:6e:84
0000:04:00.0: eth0: Intel(R) PRO/1000 Network Connection
0000:04:00.0: eth0: MAC: 2, PHY: 2, PBA No: ffffff-0ff
initcall e1000_init_module+0x0/0x70 returned 0 after 156059 usecs
calling igb_init_module+0x0/0x60 @ 1
Intel(R) Gigabit Ethernet Network Driver - version 1.2.45-k2
Copyright (c) 2008 Intel Corporation.
initcall igb_init_module+0x0/0x60 returned 0 after 8756 usecs
calling bonding_init+0x0/0x9b0 @ 1
Ethernet Channel Bonding Driver: v3.3.0 (June 10, 2008)
bonding: Warning: either miimon or arp_interval and arp_ip_target module parameters must be specified, otherwise bonding will not detect link failures! see bonding.txt for details.
initcall bonding_init+0x0/0x9b0 returned 0 after 20844 usecs
calling atl2_init_module+0x0/0x50 @ 1
Atheros(R) L2 Ethernet Driver - version 2.2.3
Copyright (c) 2007 Atheros Corporation.
initcall atl2_init_module+0x0/0x50 returned 0 after 7672 usecs
calling atl1e_init_module+0x0/0x20 @ 1
initcall atl1e_init_module+0x0/0x20 returned 0 after 88 usecs
calling jme_init_module+0x0/0x30 @ 1
jme: JMicron JMC250 gigabit ethernet driver version 1.0.3
initcall jme_init_module+0x0/0x30 returned 0 after 5142 usecs
calling rr_init_module+0x0/0x20 @ 1
initcall rr_init_module+0x0/0x20 returned 0 after 88 usecs
calling gem_init+0x0/0x20 @ 1
initcall gem_init+0x0/0x20 returned 0 after 91 usecs
calling vortex_init+0x0/0xd0 @ 1
initcall vortex_init+0x0/0xd0 returned 0 after 90 usecs
calling typhoon_init+0x0/0x20 @ 1
initcall typhoon_init+0x0/0x20 returned 0 after 92 usecs
calling ne2k_pci_init+0x0/0x20 @ 1
initcall ne2k_pci_init+0x0/0x20 returned 0 after 88 usecs
calling pcnet32_init_module+0x0/0x150 @ 1
pcnet32.c:v1.35 21.Apr.2008 tsbogend@alpha.franken.de
initcall pcnet32_init_module+0x0/0x150 returned 0 after 4804 usecs
calling eepro100_init_module+0x0/0x20 @ 1
initcall eepro100_init_module+0x0/0x20 returned 0 after 90 usecs
calling e100_init_module+0x0/0x60 @ 1
e100: Intel(R) PRO/100 Network Driver, 3.5.23-k6-NAPI
e100: Copyright(c) 1999-2006 Intel Corporation
initcall e100_init_module+0x0/0x60 returned 0 after 8928 usecs
calling tlan_probe+0x0/0x120 @ 1
ThunderLAN driver v1.15
TLAN: 0 devices installed, PCI: 0 EISA: 0
initcall tlan_probe+0x0/0x120 returned -19 after 6124 usecs
calling epic_init+0x0/0x20 @ 1
initcall epic_init+0x0/0x20 returned 0 after 88 usecs
calling sis900_init_module+0x0/0x20 @ 1
initcall sis900_init_module+0x0/0x20 returned 0 after 88 usecs
calling r6040_init+0x0/0x20 @ 1
initcall r6040_init+0x0/0x20 returned 0 after 94 usecs
calling yellowfin_init+0x0/0x20 @ 1
initcall yellowfin_init+0x0/0x20 returned 0 after 88 usecs
calling ns83820_init+0x0/0x30 @ 1
ns83820.c: National Semiconductor DP83820 10/100/1000 driver.
initcall ns83820_init+0x0/0x30 returned 0 after 5479 usecs
calling tg3_init+0x0/0x20 @ 1
initcall tg3_init+0x0/0x20 returned 0 after 96 usecs
calling skge_init_module+0x0/0x20 @ 1
initcall skge_init_module+0x0/0x20 returned 0 after 88 usecs
calling sky2_init_module+0x0/0x60 @ 1
sky2 driver version 1.22
initcall sky2_init_module+0x0/0x60 returned 0 after 2342 usecs
calling velocity_init_module+0x0/0x50 @ 1
initcall velocity_init_module+0x0/0x50 returned 0 after 89 usecs
calling starfire_init+0x0/0x20 @ 1
initcall starfire_init+0x0/0x20 returned 0 after 88 usecs
calling marvell_init+0x0/0x90 @ 1
initcall marvell_init+0x0/0x90 returned 0 after 489 usecs
calling lxt_init+0x0/0x50 @ 1
initcall lxt_init+0x0/0x50 returned 0 after 170 usecs
calling smsc_init+0x0/0x70 @ 1
initcall smsc_init+0x0/0x70 returned 0 after 250 usecs
calling vsc8244_init+0x0/0x20 @ 1
initcall vsc8244_init+0x0/0x20 returned 0 after 81 usecs
calling broadcom_init+0x0/0xd0 @ 1
initcall broadcom_init+0x0/0xd0 returned 0 after 489 usecs
calling ip175c_init+0x0/0x20 @ 1
initcall ip175c_init+0x0/0x20 returned 0 after 80 usecs
calling realtek_init+0x0/0x20 @ 1
initcall realtek_init+0x0/0x20 returned 0 after 80 usecs
calling fixed_mdio_bus_init+0x0/0x110 @ 1
Fixed MDIO Bus: probed
initcall fixed_mdio_bus_init+0x0/0x110 returned 0 after 5513 usecs
calling sundance_init+0x0/0x20 @ 1
initcall sundance_init+0x0/0x20 returned 0 after 101 usecs
calling hamachi_init+0x0/0x20 @ 1
initcall hamachi_init+0x0/0x20 returned 0 after 90 usecs
calling net_olddevs_init+0x0/0xb0 @ 1
initcall net_olddevs_init+0x0/0xb0 returned 0 after 3 usecs
calling sb1000_init+0x0/0x20 @ 1
initcall sb1000_init+0x0/0x20 returned 0 after 90 usecs
calling init_nic+0x0/0x20 @ 1
initcall init_nic+0x0/0x20 returned 0 after 90 usecs
calling ql3xxx_init_module+0x0/0x20 @ 1
initcall ql3xxx_init_module+0x0/0x20 returned 0 after 88 usecs
calling ppp_init+0x0/0xb0 @ 1
PPP generic driver version 2.4.2
initcall ppp_init+0x0/0xb0 returned 0 after 3126 usecs
calling ppp_async_init+0x0/0x40 @ 1
initcall ppp_async_init+0x0/0x40 returned 0 after 1 usecs
calling ppp_sync_init+0x0/0x40 @ 1
initcall ppp_sync_init+0x0/0x40 returned 0 after 1 usecs
calling bsdcomp_init+0x0/0x40 @ 1
PPP BSD Compression module registered
initcall bsdcomp_init+0x0/0x40 returned 0 after 3362 usecs
calling ppp_mppe_init+0x0/0x120 @ 1
PPP MPPE Compression module registered
initcall ppp_mppe_init+0x0/0x120 returned 0 after 3550 usecs
calling pppox_init+0x0/0x20 @ 1
NET: Registered protocol family 24
initcall pppox_init+0x0/0x20 returned 0 after 3107 usecs
calling pppoe_init+0x0/0xb0 @ 1
initcall pppoe_init+0x0/0xb0 returned 0 after 9 usecs
calling netif_init+0x0/0x80 @ 1
initcall netif_init+0x0/0x80 returned -19 after 0 usecs
calling ifb_init_module+0x0/0xf0 @ 1
initcall ifb_init_module+0x0/0xf0 returned 0 after 864 usecs
calling macvlan_init_module+0x0/0x60 @ 1
initcall macvlan_init_module+0x0/0x60 returned 0 after 2 usecs
calling cp_init+0x0/0x20 @ 1
initcall cp_init+0x0/0x20 returned 0 after 93 usecs
calling rtl8139_init_module+0x0/0x20 @ 1
initcall rtl8139_init_module+0x0/0x20 returned 0 after 96 usecs
calling tun_init+0x0/0xb0 @ 1
tun: Universal TUN/TAP device driver, 1.6
tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
initcall tun_init+0x0/0xb0 returned 0 after 8611 usecs
calling veth_init+0x0/0x20 @ 1
initcall veth_init+0x0/0x20 returned 0 after 2 usecs
calling rio_init+0x0/0x20 @ 1
initcall rio_init+0x0/0x20 returned 0 after 93 usecs
calling rtl8169_init_module+0x0/0x20 @ 1
initcall rtl8169_init_module+0x0/0x20 returned 0 after 89 usecs
calling xl_pci_init+0x0/0x20 @ 1
initcall xl_pci_init+0x0/0x20 returned 0 after 88 usecs
calling hdlc_module_init+0x0/0x50 @ 1
HDLC support module revision 1.22
initcall hdlc_module_init+0x0/0x50 returned 0 after 3025 usecs
calling mod_init+0x0/0x20 @ 1
initcall mod_init+0x0/0x20 returned 0 after 1 usecs
calling sync_ppp_init+0x0/0x70 @ 1
Cronyx Ltd, Synchronous PPP and CISCO HDLC (c) 1994
Linux port (c) 1998 Building Number Three Ltd & Jan "Yenya" Kasprzak.
initcall sync_ppp_init+0x0/0x70 returned 0 after 10598 usecs
calling init_lmc+0x0/0x20 @ 1
initcall init_lmc+0x0/0x20 returned 0 after 88 usecs
calling wanxl_init_module+0x0/0x20 @ 1
initcall wanxl_init_module+0x0/0x20 returned 0 after 88 usecs
calling pci200_init_module+0x0/0x50 @ 1
initcall pci200_init_module+0x0/0x50 returned 0 after 92 usecs
calling catc_init+0x0/0x40 @ 1
usbcore: registered new interface driver catc
catc: v2.8:CATC EL1210A NetMate USB Ethernet driver
initcall catc_init+0x0/0x40 returned 0 after 8710 usecs
calling kaweth_init+0x0/0x20 @ 1
usbcore: registered new interface driver kaweth
initcall kaweth_init+0x0/0x20 returned 0 after 4289 usecs
calling pegasus_init+0x0/0x1f0 @ 1
pegasus: v0.6.14 (2006/09/27), Pegasus/Pegasus II USB Ethernet driver
usbcore: registered new interface driver pegasus
initcall pegasus_init+0x0/0x1f0 returned 0 after 10477 usecs
calling hso_init+0x0/0x1e0 @ 1
hso: drivers/net/usb/hso.c: 1.2 Option Wireless
usbcore: registered new interface driver hso
initcall hso_init+0x0/0x1e0 returned 0 after 8254 usecs
calling cdc_init+0x0/0x20 @ 1
usbcore: registered new interface driver cdc_ether
initcall cdc_init+0x0/0x20 returned 0 after 4547 usecs
calling dm9601_init+0x0/0x20 @ 1
usbcore: registered new interface driver dm9601
initcall dm9601_init+0x0/0x20 returned 0 after 4289 usecs
calling plusb_init+0x0/0x20 @ 1
usbcore: registered new interface driver plusb
initcall plusb_init+0x0/0x20 returned 0 after 4204 usecs
calling rndis_init+0x0/0x20 @ 1
usbcore: registered new interface driver rndis_host
initcall rndis_init+0x0/0x20 returned 0 after 4643 usecs
calling zaurus_init+0x0/0x20 @ 1
usbcore: registered new interface driver zaurus
initcall zaurus_init+0x0/0x20 returned 0 after 4294 usecs
calling mcs7830_init+0x0/0x20 @ 1
usbcore: registered new interface driver MOSCHIP usb-ethernet driver
initcall mcs7830_init+0x0/0x20 returned 0 after 6075 usecs
calling usbnet_init+0x0/0x30 @ 1
initcall usbnet_init+0x0/0x30 returned 0 after 3 usecs
calling strip_init_driver+0x0/0x70 @ 1
STRIP: Version 1.3A-STUART.CHESHIRE (unlimited channels)
initcall strip_init_driver+0x0/0x70 returned 0 after 4972 usecs
calling init_orinoco+0x0/0x20 @ 1
orinoco 0.15 (David Gibson <hermes@gibson.dropbear.id.au>, Pavel Roskin <proski@gnu.org>, et al)
initcall init_orinoco+0x0/0x20 returned 0 after 8366 usecs
calling init_hermes+0x0/0x10 @ 1
initcall init_hermes+0x0/0x10 returned 0 after 1 usecs
calling init_hermes_dld+0x0/0x10 @ 1
initcall init_hermes_dld+0x0/0x10 returned 0 after 0 usecs
calling orinoco_plx_init+0x0/0x30 @ 1
orinoco_plx 0.15 (Pavel Roskin <proski@gnu.org>, David Gibson <hermes@gibson.dropbear.id.au>, Daniel Barlow <dan@telent.net>)
initcall orinoco_plx_init+0x0/0x30 returned 0 after 10907 usecs
calling orinoco_pci_init+0x0/0x30 @ 1
orinoco_pci 0.15 (Pavel Roskin <proski@gnu.org>, David Gibson <hermes@gibson.dropbear.id.au> & Jean Tourrilhes <jt@hpl.hp.com>)
initcall orinoco_pci_init+0x0/0x30 returned 0 after 11082 usecs
calling orinoco_tmd_init+0x0/0x30 @ 1
orinoco_tmd 0.15 (Joerg Dorchain <joerg@dorchain.net>)
initcall orinoco_tmd_init+0x0/0x30 returned 0 after 4888 usecs
calling orinoco_nortel_init+0x0/0x30 @ 1
orinoco_nortel 0.15 (Tobias Hoffmann & Christoph Jungegger <disdos@traum404.de>)
initcall orinoco_nortel_init+0x0/0x30 returned 0 after 7086 usecs
calling atmel_init_module+0x0/0x20 @ 1
initcall atmel_init_module+0x0/0x20 returned 0 after 88 usecs
calling hostap_init+0x0/0x50 @ 1
initcall hostap_init+0x0/0x50 returned 0 after 4 usecs
calling init_prism2_plx+0x0/0x20 @ 1
initcall init_prism2_plx+0x0/0x20 returned 0 after 93 usecs
calling init_prism2_pci+0x0/0x20 @ 1
initcall init_prism2_pci+0x0/0x20 returned 0 after 88 usecs
calling rndis_wlan_init+0x0/0x20 @ 1
usbcore: registered new interface driver rndis_wlan
initcall rndis_wlan_init+0x0/0x20 returned 0 after 4628 usecs
calling zd1201_init+0x0/0x20 @ 1
usbcore: registered new interface driver zd1201
initcall zd1201_init+0x0/0x20 returned 0 after 4288 usecs
calling lbs_init_module+0x0/0xf0 @ 1
initcall lbs_init_module+0x0/0xf0 returned 0 after 8 usecs
calling if_usb_init_module+0x0/0xd0 @ 1
usbcore: registered new interface driver usb8xxx
initcall if_usb_init_module+0x0/0xd0 returned 0 after 4373 usecs
calling dmfe_init_module+0x0/0x100 @ 1
dmfe: Davicom DM9xxx net driver, version 1.36.4 (2002-01-17)
initcall dmfe_init_module+0x0/0x100 returned 0 after 5397 usecs
calling w840_init+0x0/0x30 @ 1
winbond-840.c:v1.01-e (2.4 port) Sep-11-2006 Donald Becker <becker@scyld.com>
http://www.scyld.com/network/drivers.html
initcall w840_init+0x0/0x30 returned 0 after 10771 usecs
calling de_init+0x0/0x20 @ 1
initcall de_init+0x0/0x20 returned 0 after 87 usecs
calling tulip_init+0x0/0x40 @ 1
initcall tulip_init+0x0/0x40 returned 0 after 89 usecs
calling de4x5_module_init+0x0/0x20 @ 1
initcall de4x5_module_init+0x0/0x20 returned 0 after 87 usecs
calling uli526x_init_module+0x0/0xb0 @ 1
uli526x: ULi M5261/M5263 net driver, version 0.9.3 (2005-7-29)
initcall uli526x_init_module+0x0/0xb0 returned 0 after 5567 usecs
calling yam_init_driver+0x0/0x150 @ 1
YAM driver version 0.8 by F1OAT/F6FBB
initcall yam_init_driver+0x0/0x150 returned 0 after 5178 usecs
calling bpq_init_driver+0x0/0x70 @ 1
AX.25: bpqether driver version 004
initcall bpq_init_driver+0x0/0x70 returned 0 after 3099 usecs
calling init_baycomserfdx+0x0/0x120 @ 1
baycom_ser_fdx: (C) 1996-2000 Thomas Sailer, HB9JNX/AE4WA
baycom_ser_fdx: version 0.10 compiled 11:12:29 Nov 29 2008
initcall init_baycomserfdx+0x0/0x120 returned 0 after 12265 usecs
calling hdlcdrv_init_driver+0x0/0x30 @ 1
hdlcdrv: (C) 1996-2000 Thomas Sailer HB9JNX/AE4WA
hdlcdrv: version 0.8 compiled 11:12:32 Nov 29 2008
initcall hdlcdrv_init_driver+0x0/0x30 returned 0 after 8839 usecs
calling init_baycomserhdx+0x0/0x110 @ 1
baycom_ser_hdx: (C) 1996-2000 Thomas Sailer, HB9JNX/AE4WA
baycom_ser_hdx: version 0.10 compiled 11:12:35 Nov 29 2008
initcall init_baycomserhdx+0x0/0x110 returned 0 after 12484 usecs
calling stir_init+0x0/0x20 @ 1
usbcore: registered new interface driver stir4200
initcall stir_init+0x0/0x20 returned 0 after 4487 usecs
calling nsc_ircc_init+0x0/0x240 @ 1
initcall nsc_ircc_init+0x0/0x240 returned -19 after 361 usecs
calling w83977af_init+0x0/0x650 @ 1
initcall w83977af_init+0x0/0x650 returned -19 after 59 usecs
calling smsc_ircc_init+0x0/0x670 @ 1
initcall smsc_ircc_init+0x0/0x670 returned -19 after 283 usecs
calling vlsi_mod_init+0x0/0x170 @ 1
initcall vlsi_mod_init+0x0/0x170 returned 0 after 102 usecs
calling via_ircc_init+0x0/0x30 @ 1
initcall via_ircc_init+0x0/0x30 returned 0 after 90 usecs
calling irtty_sir_init+0x0/0x60 @ 1
initcall irtty_sir_init+0x0/0x60 returned 0 after 1 usecs
calling sir_wq_init+0x0/0x40 @ 1
initcall sir_wq_init+0x0/0x40 returned 0 after 33 usecs
calling esi_sir_init+0x0/0x20 @ 1
initcall esi_sir_init+0x0/0x20 returned 0 after 1 usecs
calling litelink_sir_init+0x0/0x20 @ 1
initcall litelink_sir_init+0x0/0x20 returned 0 after 1 usecs
calling girbil_sir_init+0x0/0x20 @ 1
initcall girbil_sir_init+0x0/0x20 returned 0 after 1 usecs
calling act200l_sir_init+0x0/0x20 @ 1
initcall act200l_sir_init+0x0/0x20 returned 0 after 1 usecs
calling toim3232_sir_init+0x0/0x30 @ 1
initcall toim3232_sir_init+0x0/0x30 returned 0 after 1 usecs
calling ks959_init+0x0/0x20 @ 1
usbcore: registered new interface driver ks959-sir
initcall ks959_init+0x0/0x20 returned 0 after 4548 usecs
calling init_netconsole+0x0/0x260 @ 1
console [netcon0] enabled
netconsole: network logging started
initcall init_netconsole+0x0/0x260 returned 0 after 5551 usecs
calling saa7146_vv_init_module+0x0/0x10 @ 1
initcall saa7146_vv_init_module+0x0/0x10 returned 0 after 0 usecs
calling videodev_init+0x0/0xa0 @ 1
Linux video capture interface: v2.00
initcall videodev_init+0x0/0xa0 returned 0 after 3358 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 163 usecs
calling bttv_init_module+0x0/0x110 @ 1
bttv: driver version 0.9.17 loaded
bttv: using 8 buffers with 2080k (520 pages) each for capture
initcall bttv_init_module+0x0/0x110 returned 0 after 8685 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 172 usecs
calling tda9875_init+0x0/0x20 @ 1
initcall tda9875_init+0x0/0x20 returned 0 after 81 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 163 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 159 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 160 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 164 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 199 usecs
calling v4l2_i2c_drv_init+0x0/0x80 @ 1
initcall v4l2_i2c_drv_init+0x0/0x80 returned 0 after 81 usecs
calling v4l2_i2c_drv_init+0x0/0x80 @ 1
initcall v4l2_i2c_drv_init+0x0/0x80 returned 0 after 81 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 198 usecs
calling saa7191_init+0x0/0x20 @ 1
initcall saa7191_init+0x0/0x20 returned 0 after 82 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 161 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 168 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 165 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 162 usecs
calling stradis_init+0x0/0x50 @ 1
initcall stradis_init+0x0/0x50 returned 0 after 91 usecs
calling cpia_init+0x0/0x80 @ 1
V4L-Driver for Vision CPiA based cameras v1.2.3
Since in-kernel colorspace conversion is not allowed, it is disabled by default now. Users should fix the applications in case they don't work without conversion reenabled by setting the 'colorspace_conv' module parameter to 1
initcall cpia_init+0x0/0x80 returned 0 after 23589 usecs
calling usb_cpia_init+0x0/0x60 @ 1
USB driver for Vision CPiA based cameras v1.2.3
usbcore: registered new interface driver cpia
initcall usb_cpia_init+0x0/0x60 returned 0 after 8330 usecs
calling saa7134_init+0x0/0x50 @ 1
saa7130/34: v4l2 driver version 0.2.14 loaded
initcall saa7134_init+0x0/0x50 returned 0 after 4135 usecs
calling empress_register+0x0/0x20 @ 1
initcall empress_register+0x0/0x20 returned 0 after 1 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 166 usecs
calling tvp5150_init+0x0/0x20 @ 1
initcall tvp5150_init+0x0/0x20 returned 0 after 82 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 162 usecs
calling v4l2_i2c_drv_init+0x0/0x80 @ 1
initcall v4l2_i2c_drv_init+0x0/0x80 returned 0 after 82 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 165 usecs
calling v4l2_i2c_drv_init+0x0/0x80 @ 1
initcall v4l2_i2c_drv_init+0x0/0x80 returned 0 after 81 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 162 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 162 usecs
calling v4l2_i2c_drv_init+0x0/0x80 @ 1
initcall v4l2_i2c_drv_init+0x0/0x80 returned 0 after 90 usecs
calling v4l2_i2c_drv_init+0x0/0x80 @ 1
initcall v4l2_i2c_drv_init+0x0/0x80 returned 0 after 82 usecs
calling cpia2_init+0x0/0x1c0 @ 1
cpia2: V4L-Driver for Vision CPiA2 based cameras v2.0.0
usbcore: registered new interface driver cpia2
initcall cpia2_init+0x0/0x1c0 returned 0 after 9091 usecs
calling mxb_init_module+0x0/0x60 @ 1
saa7146: register extension 'Multimedia eXtension Board'.
initcall mxb_init_module+0x0/0x60 returned 0 after 5144 usecs
calling v4l2_i2c_drv_init+0x0/0x110 @ 1
initcall v4l2_i2c_drv_init+0x0/0x110 returned 0 after 162 usecs
calling v4l2_i2c_drv_init+0x0/0x80 @ 1
initcall v4l2_i2c_drv_init+0x0/0x80 returned 0 after 86 usecs
calling v4l2_i2c_drv_init+0x0/0x80 @ 1
initcall v4l2_i2c_drv_init+0x0/0x80 returned 0 after 87 usecs
calling cafe_init+0x0/0x90 @ 1
Marvell M88ALP01 'CAFE' Camera Controller version 2
initcall cafe_init+0x0/0x90 returned 0 after 4652 usecs
calling ov7670_mod_init+0x0/0x30 @ 1
OmniVision ov7670 sensor driver, at your service
initcall ov7670_mod_init+0x0/0x30 returned 0 after 4372 usecs
calling dabusb_init+0x0/0xf0 @ 1
usbcore: registered new interface driver dabusb
dabusb: v1.54:DAB-USB Interface Driver for Linux (c)1999
initcall dabusb_init+0x0/0xf0 returned 0 after 9321 usecs
calling module_start+0x0/0xc0 @ 1
ivtv: Start initialization, version 1.4.0
ivtv: End initialization
initcall module_start+0x0/0xc0 returned 0 after 6209 usecs
calling ivtvfb_init+0x0/0x730 @ 1
ivtvfb: no cards foundinitcall ivtvfb_init+0x0/0x730 returned -19 after 1995 usecs
calling sh_mobile_ceu_init+0x0/0x20 @ 1
initcall sh_mobile_ceu_init+0x0/0x20 returned 0 after 81 usecs
calling soc_camera_init+0x0/0x50 @ 1
initcall soc_camera_init+0x0/0x50 returned 0 after 163 usecs
calling mt9m001_mod_init+0x0/0x20 @ 1
initcall mt9m001_mod_init+0x0/0x20 returned 0 after 82 usecs
calling mt9m111_mod_init+0x0/0x20 @ 1
initcall mt9m111_mod_init+0x0/0x20 returned 0 after 81 usecs
calling soc_camera_platform_module_init+0x0/0x20 @ 1
initcall soc_camera_platform_module_init+0x0/0x20 returned 0 after 100 usecs
calling dsbr100_init+0x0/0x40 @ 1
usbcore: registered new interface driver dsbr100
dsbr100: v0.41:D-Link DSB-R100 USB FM radio driver
initcall dsbr100_init+0x0/0x40 returned 0 after 8840 usecs
calling si470x_module_init+0x0/0x30 @ 1
USB radio driver for Si470x FM Radio Receivers, Version 1.0.8
usbcore: registered new interface driver radio-si470x
initcall si470x_module_init+0x0/0x30 returned 0 after 10188 usecs
calling amradio_init+0x0/0x50 @ 1
usbcore: registered new interface driver radio-mr800
radio_mr800: 0.01 AverMedia MR 800 USB FM radio driver
initcall amradio_init+0x0/0x50 returned 0 after 9524 usecs
calling zatm_init_module+0x0/0x20 @ 1
initcall zatm_init_module+0x0/0x20 returned 0 after 89 usecs
calling uPD98402_module_init+0x0/0x10 @ 1
initcall uPD98402_module_init+0x0/0x10 returned 0 after 1 usecs
calling amb_module_init+0x0/0x180 @ 1
Madge ATM Ambassador driver version 1.2.4
amb: debug bitmap is 0
initcall amb_module_init+0x0/0x180 returned 0 after 5868 usecs
calling ia_module_init+0x0/0x80 @ 1
initcall ia_module_init+0x0/0x80 returned 0 after 94 usecs
calling fore200e_module_init+0x0/0x30 @ 1
fore200e: FORE Systems 200E-series ATM driver - version 0.3e
initcall fore200e_module_init+0x0/0x30 returned 0 after 5396 usecs
calling eni_init+0x0/0x20 @ 1
initcall eni_init+0x0/0x20 returned 0 after 99 usecs
calling adummy_init+0x0/0xc0 @ 1
adummy: version 1.0
initcall adummy_init+0x0/0xc0 returned 0 after 1949 usecs
calling atmtcp_init+0x0/0x20 @ 1
initcall atmtcp_init+0x0/0x20 returned 0 after 1 usecs
calling firestream_init_module+0x0/0x20 @ 1
initcall firestream_init_module+0x0/0x20 returned 0 after 95 usecs
calling lanai_module_init+0x0/0x40 @ 1
initcall lanai_module_init+0x0/0x40 returned 0 after 89 usecs
calling scsi_tgt_init+0x0/0xa0 @ 1
initcall scsi_tgt_init+0x0/0xa0 returned 0 after 399 usecs
calling raid_init+0x0/0x20 @ 1
initcall raid_init+0x0/0x20 returned 0 after 80 usecs
calling spi_transport_init+0x0/0x30 @ 1
initcall spi_transport_init+0x0/0x30 returned 0 after 155 usecs
calling fc_transport_init+0x0/0x50 @ 1
initcall fc_transport_init+0x0/0x50 returned 0 after 321 usecs
calling iscsi_transport_init+0x0/0x170 @ 1
Loading iSCSI transport class v2.0-870.
initcall iscsi_transport_init+0x0/0x170 returned 0 after 3995 usecs
calling srp_transport_init+0x0/0x50 @ 1
initcall srp_transport_init+0x0/0x50 returned 0 after 173 usecs
calling iscsi_tcp_init+0x0/0x50 @ 1
iscsi: registered transport (tcp)
initcall iscsi_tcp_init+0x0/0x50 returned 0 after 3124 usecs
calling BusLogic_init+0x0/0x1320 @ 1
initcall BusLogic_init+0x0/0x1320 returned 0 after 48 usecs
calling adpt_init+0x0/0x1140 @ 1
Loading Adaptec I2O RAID: Version 2.4 Build 5go
Detecting Adaptec I2O RAID controllers...
initcall adpt_init+0x0/0x1140 returned -19 after 7912 usecs
calling arcmsr_module_init+0x0/0x20 @ 1
initcall arcmsr_module_init+0x0/0x20 returned 0 after 94 usecs
calling ahc_linux_init+0x0/0x70 @ 1
initcall ahc_linux_init+0x0/0x70 returned 0 after 172 usecs
calling ahd_linux_init+0x0/0x90 @ 1
initcall ahd_linux_init+0x0/0x90 returned 0 after 104 usecs
calling aac_init+0x0/0x80 @ 1
Adaptec aacraid driver 1.1-5[2456]-ms
initcall aac_init+0x0/0x80 returned 0 after 3462 usecs
calling qla1280_init+0x0/0x20 @ 1
initcall qla1280_init+0x0/0x20 returned 0 after 94 usecs
calling qla2x00_module_init+0x0/0x1b0 @ 1
QLogic Fibre Channel HBA Driver: 8.02.01-k9
initcall qla2x00_module_init+0x0/0x1b0 returned 0 after 4132 usecs
calling qla4xxx_module_init+0x0/0x160 @ 1
iscsi: registered transport (qla4xxx)
QLogic iSCSI HBA Driver
initcall qla4xxx_module_init+0x0/0x160 returned 0 after 5884 usecs
calling dmx3191d_init+0x0/0x20 @ 1
initcall dmx3191d_init+0x0/0x20 returned 0 after 99 usecs
calling sym2_init+0x0/0x120 @ 1
initcall sym2_init+0x0/0x120 returned 0 after 94 usecs
calling init_this_scsi_driver+0x0/0x110 @ 1
initcall init_this_scsi_driver+0x0/0x110 returned -19 after 7 usecs
calling dc395x_module_init+0x0/0x20 @ 1
initcall dc395x_module_init+0x0/0x20 returned 0 after 90 usecs
calling dc390_module_init+0x0/0xb0 @ 1
DC390: clustering now enabled by default. If you get problems load
with "disable_clustering=1" and report to maintainers
initcall dc390_module_init+0x0/0xb0 returned 0 after 11227 usecs
calling megaraid_init+0x0/0xd0 @ 1
initcall megaraid_init+0x0/0xd0 returned 0 after 103 usecs
calling atp870u_init+0x0/0x20 @ 1
initcall atp870u_init+0x0/0x20 returned 0 after 90 usecs
calling gdth_init+0x0/0xf0 @ 1
GDT-HA: Storage RAID Controller Driver. Version: 3.05
initcall gdth_init+0x0/0xf0 returned 0 after 4808 usecs
calling twa_init+0x0/0x30 @ 1
3ware 9000 Storage Controller device driver for Linux v2.26.02.011.
initcall twa_init+0x0/0x30 returned 0 after 5988 usecs
calling stex_init+0x0/0x30 @ 1
stex: Promise SuperTrak EX Driver version: 3.6.0000.1
initcall stex_init+0x0/0x30 returned 0 after 4819 usecs
calling init_st+0x0/0x1b0 @ 1
st: Version 20080504, fixed bufsize 32768, s/g segs 256
Driver 'st' needs updating - please use bus_type methods
initcall init_st+0x0/0x1b0 returned 0 after 10019 usecs
calling init_osst+0x0/0x150 @ 1
osst :I: Tape driver with OnStream support version 0.99.4
osst :I: $Id: osst.c,v 1.73 2005/01/01 21:13:34 wriede Exp $
Driver 'osst' needs updating - please use bus_type methods
initcall init_osst+0x0/0x150 returned 0 after 15644 usecs
calling init_sd+0x0/0xd0 @ 1
Driver 'sd' needs updating - please use bus_type methods
initcall init_sd+0x0/0xd0 returned 0 after 5137 usecs
calling init_sr+0x0/0x60 @ 1
Driver 'sr' needs updating - please use bus_type methods
initcall init_sr+0x0/0x60 returned 0 after 5050 usecs
calling init_sg+0x0/0x170 @ 1
initcall init_sg+0x0/0x170 returned 0 after 109 usecs
calling init_ch_module+0x0/0xc0 @ 1
SCSI Media Changer driver v0.25
Driver 'ch' needs updating - please use bus_type methods
initcall init_ch_module+0x0/0xc0 returned 0 after 8054 usecs
calling ses_init+0x0/0x50 @ 1
Driver 'ses' needs updating - please use bus_type methods
initcall ses_init+0x0/0x50 returned 0 after 5132 usecs
calling ahci_init+0x0/0x20 @ 1
initcall ahci_init+0x0/0x20 returned 0 after 95 usecs
calling k2_sata_init+0x0/0x20 @ 1
initcall k2_sata_init+0x0/0x20 returned 0 after 94 usecs
calling piix_init+0x0/0x30 @ 1
ata_piix 0000:00:1f.1: version 2.12
ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 10
ata_piix 0000:00:1f.1: PCI INT A -> Link[LNKC] -> GSI 10 (level, low) -> IRQ 10
ata_piix 0000:00:1f.1: setting latency timer to 64
scsi0 : ata_piix
scsi1 : ata_piix
ata1: PATA max UDMA/100 cmd 0x1f0 ctl 0x3f6 bmdma 0x40b0 irq 14
ata2: PATA max UDMA/100 cmd 0x170 ctl 0x376 bmdma 0x40b8 irq 15
ata2: port disabled. ignoring.
ACPI: PCI Interrupt Link [LNKD] enabled at IRQ 9
PCI: setting IRQ 9 as level-triggered
ata_piix 0000:00:1f.2: PCI INT B -> Link[LNKD] -> GSI 9 (level, low) -> IRQ 9
ata_piix 0000:00:1f.2: MAP [ P0 P2 P1 P3 ]
ata_piix 0000:00:1f.2: setting latency timer to 64
scsi2 : ata_piix
scsi3 : ata_piix
ata3: SATA max UDMA/133 cmd 0x40c8 ctl 0x40e4 bmdma 0x40a0 irq 9
ata4: SATA max UDMA/133 cmd 0x40c0 ctl 0x40e0 bmdma 0x40a8 irq 9
ata3.00: ATA-7: HDT722516DLA380, V43OA96A, max UDMA/133
ata3.00: 321672960 sectors, multi 16: LBA48 NCQ (depth 0/32)
ata3.00: configured for UDMA/133
ata4.00: ATA-7: HDT722516DLA380, V43OA96A, max UDMA/133
ata4.00: 321672960 sectors, multi 16: LBA48 NCQ (depth 0/32)
ata4.01: ATAPI: PLEXTOR DVDR PX-755A, 1.03, max UDMA/66
ata4.00: configured for UDMA/133
ata4.01: configured for UDMA/66
isa bounce pool size: 16 pages
scsi 2:0:0:0: Direct-Access ATA HDT722516DLA380 V43O PQ: 0 ANSI: 5
sd 2:0:0:0: [sda] 321672960 512-byte hardware sectors: (164 GB/153 GiB)
sd 2:0:0:0: [sda] Write Protect is off
sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
sd 2:0:0:0: [sda] 321672960 512-byte hardware sectors: (164 GB/153 GiB)
sd 2:0:0:0: [sda] Write Protect is off
sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
sda: sda1 sda2
sd 2:0:0:0: [sda] Attached SCSI disk
sd 2:0:0:0: Attached scsi generic sg0 type 0
scsi 3:0:0:0: Direct-Access ATA HDT722516DLA380 V43O PQ: 0 ANSI: 5
sd 3:0:0:0: [sdb] 321672960 512-byte hardware sectors: (164 GB/153 GiB)
sd 3:0:0:0: [sdb] Write Protect is off
sd 3:0:0:0: [sdb] Mode Sense: 00 3a 00 00
sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
sd 3:0:0:0: [sdb] 321672960 512-byte hardware sectors: (164 GB/153 GiB)
sd 3:0:0:0: [sdb] Write Protect is off
sd 3:0:0:0: [sdb] Mode Sense: 00 3a 00 00
sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
sdb: sdb1
sd 3:0:0:0: [sdb] Attached SCSI disk
sd 3:0:0:0: Attached scsi generic sg1 type 0
scsi 3:0:1:0: CD-ROM PLEXTOR DVDR PX-755A 1.03 PQ: 0 ANSI: 5
sr0: scsi3-mmc drive: 40x/40x writer cd/rw xa/form2 cdda tray
Uniform CD-ROM driver Revision: 3.20
sr 3:0:1:0: Attached scsi CD-ROM sr0
sr 3:0:1:0: Attached scsi generic sg2 type 5
initcall piix_init+0x0/0x30 returned 0 after 814080 usecs
calling pdc_ata_init+0x0/0x20 @ 1
initcall pdc_ata_init+0x0/0x20 returned 0 after 103 usecs
calling sil_init+0x0/0x20 @ 1
sata_sil 0000:05:05.0: version 2.3
sata_sil 0000:05:05.0: PCI INT A -> Link[LNKB] -> GSI 10 (level, low) -> IRQ 10
sata_sil 0000:05:05.0: Applying R_ERR on DMA activate FIS errata fix
scsi4 : sata_sil
scsi5 : sata_sil
scsi6 : sata_sil
scsi7 : sata_sil
ata5: SATA max UDMA/100 mmio m1024@0x5000c800 tf 0x5000c880 irq 10
ata6: SATA max UDMA/100 mmio m1024@0x5000c800 tf 0x5000c8c0 irq 10
ata7: SATA max UDMA/100 mmio m1024@0x5000c800 tf 0x5000ca80 irq 10
ata8: SATA max UDMA/100 mmio m1024@0x5000c800 tf 0x5000cac0 irq 10
ata5: SATA link down (SStatus 0 SControl 310)
ata6: SATA link down (SStatus 0 SControl 310)
ata7: SATA link down (SStatus 0 SControl 310)
ata8: SATA link down (SStatus 0 SControl 310)
initcall sil_init+0x0/0x20 returned 0 after 1311670 usecs
calling vsc_sata_init+0x0/0x20 @ 1
initcall vsc_sata_init+0x0/0x20 returned 0 after 90 usecs
calling sis_init+0x0/0x20 @ 1
initcall sis_init+0x0/0x20 returned 0 after 94 usecs
calling nv_init+0x0/0x20 @ 1
initcall nv_init+0x0/0x20 returned 0 after 100 usecs
calling mv_init+0x0/0x60 @ 1
initcall mv_init+0x0/0x60 returned 0 after 177 usecs
calling inic_init+0x0/0x20 @ 1
initcall inic_init+0x0/0x20 returned 0 after 108 usecs
calling adma_ata_init+0x0/0x20 @ 1
initcall adma_ata_init+0x0/0x20 returned 0 after 93 usecs
calling ali_init+0x0/0x20 @ 1
initcall ali_init+0x0/0x20 returned 0 after 135 usecs
calling amd_init+0x0/0x20 @ 1
initcall amd_init+0x0/0x20 returned 0 after 90 usecs
calling artop_init+0x0/0x20 @ 1
initcall artop_init+0x0/0x20 returned 0 after 89 usecs
calling atiixp_init+0x0/0x20 @ 1
initcall atiixp_init+0x0/0x20 returned 0 after 90 usecs
calling cmd64x_init+0x0/0x20 @ 1
initcall cmd64x_init+0x0/0x20 returned 0 after 112 usecs
calling cs5520_init+0x0/0x20 @ 1
initcall cs5520_init+0x0/0x20 returned 0 after 89 usecs
calling cs5530_init+0x0/0x20 @ 1
initcall cs5530_init+0x0/0x20 returned 0 after 89 usecs
calling cy82c693_init+0x0/0x20 @ 1
initcall cy82c693_init+0x0/0x20 returned 0 after 88 usecs
calling efar_init+0x0/0x20 @ 1
initcall efar_init+0x0/0x20 returned 0 after 93 usecs
calling hpt36x_init+0x0/0x20 @ 1
initcall hpt36x_init+0x0/0x20 returned 0 after 89 usecs
calling hpt37x_init+0x0/0x20 @ 1
initcall hpt37x_init+0x0/0x20 returned 0 after 94 usecs
calling it821x_init+0x0/0x20 @ 1
initcall it821x_init+0x0/0x20 returned 0 after 89 usecs
calling jmicron_init+0x0/0x20 @ 1
initcall jmicron_init+0x0/0x20 returned 0 after 89 usecs
calling ninja32_init+0x0/0x20 @ 1
initcall ninja32_init+0x0/0x20 returned 0 after 89 usecs
calling ns87410_init+0x0/0x20 @ 1
initcall ns87410_init+0x0/0x20 returned 0 after 89 usecs
calling ns87415_init+0x0/0x20 @ 1
initcall ns87415_init+0x0/0x20 returned 0 after 93 usecs
calling opti_init+0x0/0x20 @ 1
initcall opti_init+0x0/0x20 returned 0 after 90 usecs
calling oldpiix_init+0x0/0x20 @ 1
initcall oldpiix_init+0x0/0x20 returned 0 after 90 usecs
calling pdc2027x_init+0x0/0x20 @ 1
initcall pdc2027x_init+0x0/0x20 returned 0 after 90 usecs
calling pdc202xx_init+0x0/0x20 @ 1
initcall pdc202xx_init+0x0/0x20 returned 0 after 90 usecs
calling rz1000_init+0x0/0x20 @ 1
initcall rz1000_init+0x0/0x20 returned 0 after 94 usecs
calling sc1200_init+0x0/0x20 @ 1
initcall sc1200_init+0x0/0x20 returned 0 after 90 usecs
calling serverworks_init+0x0/0x20 @ 1
initcall serverworks_init+0x0/0x20 returned 0 after 90 usecs
calling sil680_init+0x0/0x20 @ 1
initcall sil680_init+0x0/0x20 returned 0 after 99 usecs
calling via_init+0x0/0x20 @ 1
initcall via_init+0x0/0x20 returned 0 after 90 usecs
calling sis_init+0x0/0x20 @ 1
initcall sis_init+0x0/0x20 returned 0 after 94 usecs
calling triflex_init+0x0/0x20 @ 1
initcall triflex_init+0x0/0x20 returned 0 after 89 usecs
calling pata_platform_init+0x0/0x20 @ 1
initcall pata_platform_init+0x0/0x20 returned 0 after 80 usecs
calling pacpi_init+0x0/0x20 @ 1
initcall pacpi_init+0x0/0x20 returned 0 after 92 usecs
calling ata_generic_init+0x0/0x20 @ 1
initcall ata_generic_init+0x0/0x20 returned 0 after 91 usecs
calling fw_core_init+0x0/0xc0 @ 1
initcall fw_core_init+0x0/0xc0 returned 0 after 95 usecs
calling fw_ohci_init+0x0/0x20 @ 1
firewire_ohci 0000:05:04.0: PCI INT A -> Link[LNKC] -> GSI 10 (level, low) -> IRQ 10
firewire_ohci: Added fw-ohci device 0000:05:04.0, OHCI version 1.10
initcall fw_ohci_init+0x0/0x20 returned 0 after 82766 usecs
calling uio_init+0x0/0x10 @ 1
initcall uio_init+0x0/0x10 returned 0 after 1 usecs
calling hilscher_init_module+0x0/0x20 @ 1
initcall hilscher_init_module+0x0/0x20 returned 0 after 90 usecs
calling uio_pdrv_init+0x0/0x20 @ 1
initcall uio_pdrv_init+0x0/0x20 returned 0 after 86 usecs
calling uio_pdrv_genirq_init+0x0/0x20 @ 1
initcall uio_pdrv_genirq_init+0x0/0x20 returned 0 after 81 usecs
calling smx_ce_init_module+0x0/0x20 @ 1
initcall smx_ce_init_module+0x0/0x20 returned 0 after 81 usecs
calling cdrom_init+0x0/0x10 @ 1
initcall cdrom_init+0x0/0x10 returned 0 after 1 usecs
calling aoe_init+0x0/0xc0 @ 1
aoe: AoE v47 initialised.
initcall aoe_init+0x0/0xc0 returned 0 after 3251 usecs
calling mon_init+0x0/0x140 @ 1
initcall mon_init+0x0/0x140 returned 0 after 199 usecs
calling ehci_hcd_init+0x0/0x120 @ 1
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ACPI: PCI Interrupt Link [LNKH] enabled at IRQ 11
ehci_hcd 0000:00:1d.7: PCI INT A -> Link[LNKH] -> GSI 11 (level, low) -> IRQ 11
ehci_hcd 0000:00:1d.7: setting latency timer to 64
ehci_hcd 0000:00:1d.7: EHCI Host Controller
ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 1
ehci_hcd 0000:00:1d.7: debug port 1
ehci_hcd 0000:00:1d.7: cache line size of 32 is not supported
ehci_hcd 0000:00:1d.7: irq 11, io mem 0x50404400
ehci_hcd 0000:00:1d.7: USB 2.0 started, EHCI 1.00
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 8 ports detected
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: EHCI Host Controller
usb usb1: Manufacturer: Linux 2.6.28-rc6-tip-01066-gb8cb0e0-dirty ehci_hcd
usb usb1: SerialNumber: 0000:00:1d.7
initcall ehci_hcd_init+0x0/0x120 returned 0 after 99380 usecs
calling isp116x_init+0x0/0x40 @ 1
116x: driver isp116x-hcd, 03 Nov 2005
initcall isp116x_init+0x0/0x40 returned 0 after 3445 usecs
calling ohci_hcd_mod_init+0x0/0x140 @ 1
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
initcall ohci_hcd_mod_init+0x0/0x140 returned 0 after 5064 usecs
calling uhci_hcd_init+0x0/0x100 @ 1
uhci_hcd: USB Universal Host Controller Interface driver
uhci_hcd 0000:00:1d.0: PCI INT A -> Link[LNKH] -> GSI 11 (level, low) -> IRQ 11
uhci_hcd 0000:00:1d.0: setting latency timer to 64
uhci_hcd 0000:00:1d.0: UHCI Host Controller
uhci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2
uhci_hcd 0000:00:1d.0: detected 2 ports
uhci_hcd 0000:00:1d.0: irq 11, io base 0x00004080
usb usb2: configuration #1 chosen from 1 choice
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 2 ports detected
usb usb2: New USB device found, idVendor=1d6b, idProduct=0001
usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb2: Product: UHCI Host Controller
usb usb2: Manufacturer: Linux 2.6.28-rc6-tip-01066-gb8cb0e0-dirty uhci_hcd
usb usb2: SerialNumber: 0000:00:1d.0
uhci_hcd 0000:00:1d.1: PCI INT B -> Link[LNKD] -> GSI 9 (level, low) -> IRQ 9
uhci_hcd 0000:00:1d.1: setting latency timer to 64
uhci_hcd 0000:00:1d.1: UHCI Host Controller
uhci_hcd 0000:00:1d.1: new USB bus registered, assigned bus number 3
uhci_hcd 0000:00:1d.1: detected 2 ports
uhci_hcd 0000:00:1d.1: irq 9, io base 0x00004060
usb usb3: configuration #1 chosen from 1 choice
hub 3-0:1.0: USB hub found
hub 3-0:1.0: 2 ports detected
usb usb3: New USB device found, idVendor=1d6b, idProduct=0001
usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb3: Product: UHCI Host Controller
usb usb3: Manufacturer: Linux 2.6.28-rc6-tip-01066-gb8cb0e0-dirty uhci_hcd
usb usb3: SerialNumber: 0000:00:1d.1
uhci_hcd 0000:00:1d.2: PCI INT C -> Link[LNKC] -> GSI 10 (level, low) -> IRQ 10
uhci_hcd 0000:00:1d.2: setting latency timer to 64
uhci_hcd 0000:00:1d.2: UHCI Host Controller
uhci_hcd 0000:00:1d.2: new USB bus registered, assigned bus number 4
uhci_hcd 0000:00:1d.2: detected 2 ports
uhci_hcd 0000:00:1d.2: irq 10, io base 0x00004040
usb usb4: configuration #1 chosen from 1 choice
hub 4-0:1.0: USB hub found
hub 4-0:1.0: 2 ports detected
usb usb4: New USB device found, idVendor=1d6b, idProduct=0001
usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb4: Product: UHCI Host Controller
usb usb4: Manufacturer: Linux 2.6.28-rc6-tip-01066-gb8cb0e0-dirty uhci_hcd
usb usb4: SerialNumber: 0000:00:1d.2
uhci_hcd 0000:00:1d.3: PCI INT D -> Link[LNKA] -> GSI 11 (level, low) -> IRQ 11
uhci_hcd 0000:00:1d.3: setting latency timer to 64
uhci_hcd 0000:00:1d.3: UHCI Host Controller
uhci_hcd 0000:00:1d.3: new USB bus registered, assigned bus number 5
uhci_hcd 0000:00:1d.3: detected 2 ports
uhci_hcd 0000:00:1d.3: irq 11, io base 0x00004020
usb usb5: configuration #1 chosen from 1 choice
hub 5-0:1.0: USB hub found
hub 5-0:1.0: 2 ports detected
usb usb5: New USB device found, idVendor=1d6b, idProduct=0001
usb usb5: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb5: Product: UHCI Host Controller
usb usb5: Manufacturer: Linux 2.6.28-rc6-tip-01066-gb8cb0e0-dirty uhci_hcd
usb usb5: SerialNumber: 0000:00:1d.3
initcall uhci_hcd_init+0x0/0x100 returned 0 after 261315 usecs
calling sl811h_init+0x0/0x40 @ 1
sl811: driver sl811-hcd, 19 May 2005
initcall sl811h_init+0x0/0x40 returned 0 after 3414 usecs
calling r8a66597_init+0x0/0x40 @ 1
r8a66597_hcd: driver r8a66597_hcd, 10 Apr 2008
initcall r8a66597_init+0x0/0x40 returned 0 after 4409 usecs
calling c67x00_init+0x0/0x20 @ 1
firewire_core: created device fw0: GUID 0090270001ab6fc2, S400
initcall c67x00_init+0x0/0x20 returned 0 after 5569 usecs
calling acm_init+0x0/0x150 @ 1
usbcore: registered new interface driver cdc_acm
cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters
initcall acm_init+0x0/0x150 returned 0 after 11804 usecs
calling usblp_init+0x0/0x20 @ 1
usbcore: registered new interface driver usblp
initcall usblp_init+0x0/0x20 returned 0 after 4208 usecs
calling wdm_init+0x0/0x20 @ 1
usbcore: registered new interface driver cdc_wdm
initcall wdm_init+0x0/0x20 returned 0 after 4397 usecs
calling usbtmc_init+0x0/0x40 @ 1
usbcore: registered new interface driver usbtmc
initcall usbtmc_init+0x0/0x40 returned 0 after 4296 usecs
calling usb_usual_init+0x0/0x50 @ 1
usbcore: registered new interface driver libusual
initcall usb_usual_init+0x0/0x50 returned 0 after 4477 usecs
calling usb_mdc800_init+0x0/0x270 @ 1
usbcore: registered new interface driver mdc800
mdc800: v0.7.5 (30/10/2000):USB Driver for Mustek MDC800 Digital Camera
initcall usb_mdc800_init+0x0/0x270 returned 0 after 10544 usecs
calling microtek_drv_init+0x0/0x20 @ 1
usbcore: registered new interface driver microtekX6
initcall microtek_drv_init+0x0/0x20 returned 0 after 4635 usecs
calling adu_init+0x0/0xa0 @ 1
drivers/usb/misc/adutux.c : adu_init : enter
usbcore: registered new interface driver adutux
adutux adutux (see www.ontrak.net) v0.0.13
adutux is an experimental driver. Use at your own risk
drivers/usb/misc/adutux.c : adu_init : leave, return value 0
initcall adu_init+0x0/0xa0 returned 0 after 22472 usecs
calling berry_init+0x0/0x20 @ 1
usbcore: registered new interface driver berry_charge
initcall berry_init+0x0/0x20 returned 0 after 4807 usecs
calling usb_cytherm_init+0x0/0x60 @ 1
usbcore: registered new interface driver cytherm
cytherm: v1.0:Cypress USB Thermometer driver
initcall usb_cytherm_init+0x0/0x60 returned 0 after 8341 usecs
calling emi26_init+0x0/0x20 @ 1
usbcore: registered new interface driver emi26 - firmware loader
initcall emi26_init+0x0/0x20 returned 0 after 5730 usecs
calling emi62_init+0x0/0x40 @ 1
usbcore: registered new interface driver emi62 - firmware loader
initcall emi62_init+0x0/0x40 returned 0 after 5735 usecs
calling usb_idmouse_init+0x0/0x50 @ 1
idmouse: 0.6:Siemens ID Mouse FingerTIP Sensor Driver
usbcore: registered new interface driver idmouse
initcall usb_idmouse_init+0x0/0x50 returned 0 after 9093 usecs
calling iowarrior_init+0x0/0x20 @ 1
usbcore: registered new interface driver iowarrior
initcall iowarrior_init+0x0/0x20 returned 0 after 4564 usecs
calling usb_lcd_init+0x0/0x40 @ 1
usbcore: registered new interface driver usblcd
initcall usb_lcd_init+0x0/0x40 returned 0 after 4293 usecs
calling usb_led_init+0x0/0x40 @ 1
usbcore: registered new interface driver usbled
initcall usb_led_init+0x0/0x40 returned 0 after 4293 usecs
calling lego_usb_tower_init+0x0/0x90 @ 1
drivers/usb/misc/legousbtower.c: lego_usb_tower_init: enter
usbcore: registered new interface driver legousbtower
legousbtower: v0.96:LEGO USB Tower Driver
drivers/usb/misc/legousbtower.c: lego_usb_tower_init: leave, return value 0
initcall lego_usb_tower_init+0x0/0x90 returned 0 after 20314 usecs
calling init_phidget+0x0/0x40 @ 1
initcall init_phidget+0x0/0x40 returned 0 after 81 usecs
calling interfacekit_init+0x0/0x40 @ 1
usbcore: registered new interface driver phidgetkit
initcall interfacekit_init+0x0/0x40 returned 0 after 4632 usecs
calling phidget_servo_init+0x0/0x40 @ 1
usbcore: registered new interface driver phidgetservo
initcall phidget_servo_init+0x0/0x40 returned 0 after 4801 usecs
calling usb_sevseg_init+0x0/0x40 @ 1
usbcore: registered new interface driver usbsevseg
initcall usb_sevseg_init+0x0/0x40 returned 0 after 4545 usecs
calling vstusb_init+0x0/0x50 @ 1
usbcore: registered new interface driver vstusb
initcall vstusb_init+0x0/0x50 returned 0 after 4319 usecs
calling cxacru_init+0x0/0x20 @ 1
usbcore: registered new interface driver cxacru
initcall cxacru_init+0x0/0x20 returned 0 after 4297 usecs
calling speedtch_usb_init+0x0/0x40 @ 1
drivers/usb/atm/speedtch.c: speedtch_usb_init: driver version 1.10
usbcore: registered new interface driver speedtch
initcall speedtch_usb_init+0x0/0x40 returned 0 after 10274 usecs
calling usbatm_usb_init+0x0/0x70 @ 1
drivers/usb/atm/usbatm.c: usbatm_usb_init: driver version 1.10
initcall usbatm_usb_init+0x0/0x70 returned 0 after 5477 usecs
calling xusbatm_init+0x0/0x140 @ 1
drivers/usb/atm/xusbatm.c: xusbatm_init
xusbatm: malformed module parameters
initcall xusbatm_init+0x0/0x140 returned -22 after 6806 usecs
initcall xusbatm_init+0x0/0x140 returned with error code -22
calling i8042_init+0x0/0x420 @ 1
PNP: PS/2 Controller [PNP0303:PS2K,PNP0f03:PS2M] at 0x60,0x64 irq 1,12
serio: i8042 KBD port at 0x60,0x64 irq 1
serio: i8042 AUX port at 0x60,0x64 irq 12
initcall i8042_init+0x0/0x420 returned 0 after 16594 usecs
calling serport_init+0x0/0x40 @ 1
initcall serport_init+0x0/0x40 returned 0 after 1 usecs
calling ct82c710_init+0x0/0x1d0 @ 1
initcall ct82c710_init+0x0/0x1d0 returned -19 after 14 usecs
calling pcips2_init+0x0/0x20 @ 1
initcall pcips2_init+0x0/0x20 returned 0 after 299 usecs
calling serio_raw_init+0x0/0x20 @ 1
initcall serio_raw_init+0x0/0x20 returned 0 after 83 usecs
calling l4_init+0x0/0x2b0 @ 1
initcall l4_init+0x0/0x2b0 returned -19 after 8 usecs
calling mousedev_init+0x0/0xa0 @ 1
mice: PS/2 mouse device common for all mice
initcall mousedev_init+0x0/0xa0 returned 0 after 4079 usecs
calling joydev_init+0x0/0x20 @ 1
initcall joydev_init+0x0/0x20 returned 0 after 2 usecs
calling evdev_init+0x0/0x20 @ 1
initcall evdev_init+0x0/0x20 returned 0 after 26406 usecs
calling evbug_init+0x0/0x20 @ 1
evbug.c: Connected device: input0 (Power Button (FF) at LNXPWRBN/button/input0)
evbug.c: Connected device: input1 (Sleep Button (CM) at PNP0C0E/button/input0)
initcall evbug_init+0x0/0x20 returned 0 after 37783 usecs
calling atkbd_init+0x0/0x30 @ 1
initcall atkbd_init+0x0/0x30 returned 0 after 88 usecs
calling xtkbd_init+0x0/0x20 @ 1
initcall xtkbd_init+0x0/0x20 returned 0 after 106 usecs
calling skbd_init+0x0/0x20 @ 1
initcall skbd_init+0x0/0x20 returned 0 after 92 usecs
calling gpio_keys_init+0x0/0x20 @ 1
initcall gpio_keys_init+0x0/0x20 returned 0 after 88 usecs
calling atp_init+0x0/0x20 @ 1
usbcore: registered new interface driver appletouch
initcall atp_init+0x0/0x20 returned 0 after 4665 usecs
calling bcm5974_init+0x0/0x20 @ 1
usbcore: registered new interface driver bcm5974
initcall bcm5974_init+0x0/0x20 returned 0 after 4395 usecs
calling psmouse_init+0x0/0x80 @ 1
initcall psmouse_init+0x0/0x80 returned 0 after 125 usecs
calling sermouse_init+0x0/0x20 @ 1
initcall sermouse_init+0x0/0x20 returned 0 after 95 usecs
calling vsxxxaa_init+0x0/0x20 @ 1
initcall vsxxxaa_init+0x0/0x20 returned 0 after 192 usecs
calling gpio_mouse_init+0x0/0x20 @ 1
input: AT Translated Set 2 keyboard as /class/input/input2
initcall gpio_mouse_init+0x0/0x20 returned -19 after 5349 usecs
calling a3d_init+0x0/0x20 @ 1
initcall a3d_init+0x0/0x20 returned 0 after 83 usecs
calling adi_init+0x0/0x20 @ 1
initcall adi_init+0x0/0x20 returned 0 after 85 usecs
calling analog_init+0x0/0x130 @ 1
initcall analog_init+0x0/0x130 returned 0 after 96 usecs
calling grip_init+0x0/0x20 @ 1
initcall grip_init+0x0/0x20 returned 0 after 84 usecs
calling iforce_init+0x0/0x10 @ 1
initcall iforce_init+0x0/0x10 returned 0 after 1 usecs
calling interact_init+0x0/0x20 @ 1
initcall interact_init+0x0/0x20 returned 0 after 186 usecs
calling joydump_init+0x0/0x20 @ 1
initcall joydump_init+0x0/0x20 returned 0 after 93 usecs
calling sw_init+0x0/0x20 @ 1
evbug.c: Connected device: input2 (AT Translated Set 2 keyboard at isa0060/serio0/input0)
initcall sw_init+0x0/0x20 returned 0 after 7952 usecs
calling spaceball_init+0x0/0x20 @ 1
initcall spaceball_init+0x0/0x20 returned 0 after 231 usecs
calling spaceorb_init+0x0/0x20 @ 1
initcall spaceorb_init+0x0/0x20 returned 0 after 144 usecs
calling stinger_init+0x0/0x20 @ 1
initcall stinger_init+0x0/0x20 returned 0 after 161 usecs
calling twidjoy_init+0x0/0x20 @ 1
initcall twidjoy_init+0x0/0x20 returned 0 after 146 usecs
calling warrior_init+0x0/0x20 @ 1
initcall warrior_init+0x0/0x20 returned 0 after 143 usecs
calling usb_xpad_init+0x0/0x40 @ 1
usbcore: registered new interface driver xpad
xpad: X-Box pad driver
initcall usb_xpad_init+0x0/0x40 returned 0 after 6296 usecs
calling gtco_init+0x0/0x60 @ 1
usbcore: registered new interface driver gtco
GTCO usb driver version: 2.00.0006initcall gtco_init+0x0/0x60 returned 0 after 7104 usecs
calling gunze_init+0x0/0x20 @ 1
initcall gunze_init+0x0/0x20 returned 0 after 146 usecs
calling fujitsu_init+0x0/0x20 @ 1
initcall fujitsu_init+0x0/0x20 returned 0 after 143 usecs
calling inexio_init+0x0/0x20 @ 1
initcall inexio_init+0x0/0x20 returned 0 after 142 usecs
calling mtouch_init+0x0/0x20 @ 1
initcall mtouch_init+0x0/0x20 returned 0 after 143 usecs
calling mk712_init+0x0/0x200 @ 1
mk712: device not present
initcall mk712_init+0x0/0x200 returned -19 after 2335 usecs
calling usbtouch_init+0x0/0x20 @ 1
usbcore: registered new interface driver usbtouchscreen
initcall usbtouch_init+0x0/0x20 returned 0 after 5041 usecs
calling touchit213_init+0x0/0x20 @ 1
initcall touchit213_init+0x0/0x20 returned 0 after 147 usecs
calling pcspkr_init+0x0/0x20 @ 1
input: PC Speaker as /class/input/input3
evbug.c: Connected device: input3 (PC Speaker at isa0061/input0)
initcall pcspkr_init+0x0/0x20 returned 0 after 45735 usecs
calling atlas_acpi_init+0x0/0x40 @ 1
initcall atlas_acpi_init+0x0/0x40 returned 0 after 161 usecs
calling ati_remote2_init+0x0/0x60 @ 1
usbcore: registered new interface driver ati_remote2
ati_remote2: ATI/Philips USB RF remote driver 0.3
initcall ati_remote2_init+0x0/0x60 returned 0 after 9214 usecs
calling powermate_init+0x0/0x20 @ 1
usbcore: registered new interface driver powermate
initcall powermate_init+0x0/0x20 returned 0 after 4625 usecs
calling yealink_dev_init+0x0/0x40 @ 1
usbcore: registered new interface driver yealink
yealink: yld-20051230:Yealink phone driver
initcall yealink_dev_init+0x0/0x40 returned 0 after 8240 usecs
calling cm109_init+0x0/0x100 @ 1
cm109: Keymap for Komunikate KIP1000 phone loaded
usbcore: registered new interface driver cm109
cm109: CM109 phone driver: 20080805 (C) Alfred E. Heggestad
initcall cm109_init+0x0/0x100 returned 0 after 13887 usecs
calling apanel_init+0x0/0x1f0 @ 1
apanel: Fujitsu BIOS signature 'FJKEYINF' not found...
initcall apanel_init+0x0/0x1f0 returned -19 after 5182 usecs
calling cmos_init+0x0/0x60 @ 1
rtc_cmos 00:03: RTC can wake from S4
rtc_cmos 00:03: rtc core: registered rtc_cmos as rtc0
rtc0: alarms up to one month, 114 bytes nvram
initcall cmos_init+0x0/0x60 returned 0 after 12411 usecs
calling ds1286_init+0x0/0x20 @ 1
initcall ds1286_init+0x0/0x20 returned 0 after 139 usecs
calling ds1374_init+0x0/0x20 @ 1
initcall ds1374_init+0x0/0x20 returned 0 after 150 usecs
calling ds1742_init+0x0/0x20 @ 1
initcall ds1742_init+0x0/0x20 returned 0 after 139 usecs
calling isl1208_init+0x0/0x20 @ 1
initcall isl1208_init+0x0/0x20 returned 0 after 146 usecs
calling m41t80_rtc_init+0x0/0x20 @ 1
initcall m41t80_rtc_init+0x0/0x20 returned 0 after 83 usecs
calling m48t35_init+0x0/0x20 @ 1
initcall m48t35_init+0x0/0x20 returned 0 after 140 usecs
calling m48t59_rtc_init+0x0/0x20 @ 1
initcall m48t59_rtc_init+0x0/0x20 returned 0 after 140 usecs
calling pcf8563_init+0x0/0x20 @ 1
initcall pcf8563_init+0x0/0x20 returned 0 after 139 usecs
calling pcf8583_init+0x0/0x20 @ 1
initcall pcf8583_init+0x0/0x20 returned 0 after 140 usecs
calling rs5c372_init+0x0/0x20 @ 1
initcall rs5c372_init+0x0/0x20 returned 0 after 144 usecs
calling rx8581_init+0x0/0x20 @ 1
initcall rx8581_init+0x0/0x20 returned 0 after 139 usecs
calling s35390a_rtc_init+0x0/0x20 @ 1
initcall s35390a_rtc_init+0x0/0x20 returned 0 after 146 usecs
calling stk17ta8_init+0x0/0x20 @ 1
initcall stk17ta8_init+0x0/0x20 returned 0 after 84 usecs
calling test_init+0x0/0xd0 @ 1
elantech.c: unexpected magic knock result 0x00, 0x00, 0x14.
rtc-test rtc-test.0: rtc core: registered test as rtc1
rtc-test rtc-test.1: rtc core: registered test as rtc2
initcall test_init+0x0/0xd0 returned 0 after 15514 usecs
calling v3020_init+0x0/0x20 @ 1
initcall v3020_init+0x0/0x20 returned 0 after 141 usecs
calling x1205_init+0x0/0x20 @ 1
initcall x1205_init+0x0/0x20 returned 0 after 141 usecs
calling ali1563_init+0x0/0x20 @ 1
initcall ali1563_init+0x0/0x20 returned 0 after 157 usecs
calling i2c_ali15x3_init+0x0/0x20 @ 1
initcall i2c_ali15x3_init+0x0/0x20 returned 0 after 155 usecs
calling amd756_init+0x0/0x20 @ 1
initcall amd756_init+0x0/0x20 returned 0 after 93 usecs
calling i2c_amd8111_init+0x0/0x20 @ 1
initcall i2c_amd8111_init+0x0/0x20 returned 0 after 199 usecs
calling i2c_sis5595_init+0x0/0x20 @ 1
initcall i2c_sis5595_init+0x0/0x20 returned 0 after 149 usecs
calling i2c_sis630_init+0x0/0x20 @ 1
initcall i2c_sis630_init+0x0/0x20 returned 0 after 150 usecs
calling i2c_vt586b_init+0x0/0x20 @ 1
initcall i2c_vt586b_init+0x0/0x20 returned 0 after 154 usecs
calling i2c_vt596_init+0x0/0x20 @ 1
initcall i2c_vt596_init+0x0/0x20 returned 0 after 150 usecs
calling ocores_i2c_init+0x0/0x20 @ 1
initcall ocores_i2c_init+0x0/0x20 returned 0 after 146 usecs
calling i2c_parport_init+0x0/0x180 @ 1
i2c-parport-light: adapter type unspecified
initcall i2c_parport_init+0x0/0x180 returned -19 after 3880 usecs
calling at24_init+0x0/0x40 @ 1
initcall at24_init+0x0/0x40 returned 0 after 142 usecs
calling max6875_init+0x0/0x20 @ 1
initcall max6875_init+0x0/0x20 returned 0 after 84 usecs
calling pcf8591_init+0x0/0x40 @ 1
initcall pcf8591_init+0x0/0x40 returned 0 after 81 usecs
calling tsl2550_init+0x0/0x20 @ 1
initcall tsl2550_init+0x0/0x20 returned 0 after 85 usecs
calling w1_init+0x0/0xb0 @ 1
Driver for 1-wire Dallas network protocol.
initcall w1_init+0x0/0xb0 returned 0 after 4035 usecs
calling matrox_w1_init+0x0/0x20 @ 1
initcall matrox_w1_init+0x0/0x20 returned 0 after 90 usecs
calling ds_init+0x0/0x40 @ 1
usbcore: registered new interface driver DS9490R
initcall ds_init+0x0/0x40 returned 0 after 4378 usecs
calling w1_gpio_init+0x0/0x20 @ 1
initcall w1_gpio_init+0x0/0x20 returned -19 after 166 usecs
calling w1_therm_init+0x0/0x40 @ 1
initcall w1_therm_init+0x0/0x40 returned 0 after 3 usecs
calling w1_ds2760_init+0x0/0x30 @ 1
1-Wire driver for the DS2760 battery monitor chip - (c) 2004-2005, Szabolcs Gyurko
initcall w1_ds2760_init+0x0/0x30 returned 0 after 7351 usecs
calling w1_bq27000_init+0x0/0x30 @ 1
initcall w1_bq27000_init+0x0/0x30 returned 0 after 1 usecs
calling asb100_init+0x0/0x20 @ 1
initcall asb100_init+0x0/0x20 returned 0 after 81 usecs
calling sensors_w83793_init+0x0/0x20 @ 1
initcall sensors_w83793_init+0x0/0x20 returned 0 after 81 usecs
calling sensors_w83791d_init+0x0/0x20 @ 1
initcall sensors_w83791d_init+0x0/0x20 returned 0 after 81 usecs
calling abituguru_init+0x0/0x1c0 @ 1
initcall abituguru_init+0x0/0x1c0 returned -19 after 1 usecs
calling abituguru3_init+0x0/0x220 @ 1
initcall abituguru3_init+0x0/0x220 returned -19 after 1 usecs
calling ad7418_init+0x0/0x20 @ 1
initcall ad7418_init+0x0/0x20 returned 0 after 86 usecs
calling sensors_adm1021_init+0x0/0x20 @ 1
initcall sensors_adm1021_init+0x0/0x20 returned 0 after 81 usecs
calling sensors_adm1025_init+0x0/0x20 @ 1
initcall sensors_adm1025_init+0x0/0x20 returned 0 after 81 usecs
calling sm_adm1026_init+0x0/0x20 @ 1
initcall sm_adm1026_init+0x0/0x20 returned 0 after 85 usecs
calling sensors_adm1029_init+0x0/0x20 @ 1
initcall sensors_adm1029_init+0x0/0x20 returned 0 after 81 usecs
calling sensors_adm1031_init+0x0/0x20 @ 1
initcall sensors_adm1031_init+0x0/0x20 returned 0 after 81 usecs
calling sensors_adm9240_init+0x0/0x20 @ 1
initcall sensors_adm9240_init+0x0/0x20 returned 0 after 81 usecs
calling adt7473_init+0x0/0x20 @ 1
initcall adt7473_init+0x0/0x20 returned 0 after 80 usecs
calling applesmc_init+0x0/0x620 @ 1
applesmc: supported laptop not found!
applesmc: driver init failed (ret=-19)!
initcall applesmc_init+0x0/0x620 returned -19 after 6896 usecs
calling dme1737_init+0x0/0x180 @ 1
initcall dme1737_init+0x0/0x180 returned 0 after 89 usecs
calling ds1621_init+0x0/0x20 @ 1
initcall ds1621_init+0x0/0x20 returned 0 after 81 usecs
calling f71805f_init+0x0/0x190 @ 1
initcall f71805f_init+0x0/0x190 returned -19 after 15 usecs
calling f71882fg_init+0x0/0x120 @ 1
f71882fg: Not a Fintek device
f71882fg: Not a Fintek device
initcall f71882fg_init+0x0/0x120 returned -19 after 5366 usecs
calling sm_fscpos_init+0x0/0x20 @ 1
initcall sm_fscpos_init+0x0/0x20 returned 0 after 88 usecs
calling sensors_gl518sm_init+0x0/0x20 @ 1
initcall sensors_gl518sm_init+0x0/0x20 returned 0 after 81 usecs
calling hdaps_init+0x0/0x210 @ 1
hdaps: supported laptop not found!
hdaps: driver init failed (ret=-19)!
initcall hdaps_init+0x0/0x210 returned -19 after 6392 usecs
calling i5k_amb_init+0x0/0x80 @ 1
initcall i5k_amb_init+0x0/0x80 returned 0 after 200 usecs
calling k8temp_init+0x0/0x20 @ 1
initcall k8temp_init+0x0/0x20 returned 0 after 91 usecs
calling lis3lv02d_init_module+0x0/0x40 @ 1
lis3lv02d driver loaded.
initcall lis3lv02d_init_module+0x0/0x40 returned 0 after 2357 usecs
calling sensors_lm63_init+0x0/0x20 @ 1
initcall sensors_lm63_init+0x0/0x20 returned 0 after 87 usecs
calling sensors_lm77_init+0x0/0x20 @ 1
initcall sensors_lm77_init+0x0/0x20 returned 0 after 82 usecs
calling sm_lm78_init+0x0/0x460 @ 1
initcall sm_lm78_init+0x0/0x460 returned 0 after 97 usecs
calling sensors_lm83_init+0x0/0x20 @ 1
initcall sensors_lm83_init+0x0/0x20 returned 0 after 81 usecs
calling sm_lm85_init+0x0/0x20 @ 1
initcall sm_lm85_init+0x0/0x20 returned 0 after 81 usecs
calling sensors_lm87_init+0x0/0x20 @ 1
initcall sensors_lm87_init+0x0/0x20 returned 0 after 83 usecs
calling sensors_lm90_init+0x0/0x20 @ 1
initcall sensors_lm90_init+0x0/0x20 returned 0 after 85 usecs
calling sensors_max1619_init+0x0/0x20 @ 1
initcall sensors_max1619_init+0x0/0x20 returned 0 after 81 usecs
calling sensors_max6650_init+0x0/0x20 @ 1
initcall sensors_max6650_init+0x0/0x20 returned 0 after 82 usecs
calling pc87360_init+0x0/0x1c0 @ 1
pc87360: PC8736x not detected, module not inserted.
initcall pc87360_init+0x0/0x1c0 returned -19 after 4555 usecs
calling pc87427_init+0x0/0x140 @ 1
initcall pc87427_init+0x0/0x140 returned -19 after 9 usecs
calling sm_sis5595_init+0x0/0x20 @ 1
initcall sm_sis5595_init+0x0/0x20 returned 0 after 91 usecs
calling sm_smsc47m1_init+0x0/0x250 @ 1
initcall sm_smsc47m1_init+0x0/0x250 returned -19 after 6 usecs
calling smsc47m192_init+0x0/0x20 @ 1
initcall smsc47m192_init+0x0/0x20 returned 0 after 81 usecs
calling sm_thmc50_init+0x0/0x20 @ 1
initcall sm_thmc50_init+0x0/0x20 returned 0 after 87 usecs
calling vt1211_init+0x0/0x190 @ 1
initcall vt1211_init+0x0/0x190 returned -19 after 11 usecs
calling sm_vt8231_init+0x0/0x20 @ 1
initcall sm_vt8231_init+0x0/0x20 returned 0 after 95 usecs
calling sensors_w83627ehf_init+0x0/0x180 @ 1
initcall sensors_w83627ehf_init+0x0/0x180 returned -19 after 18 usecs
calling sensors_w83l785ts_init+0x0/0x20 @ 1
initcall sensors_w83l785ts_init+0x0/0x20 returned 0 after 142 usecs
calling sensors_w83l786ng_init+0x0/0x20 @ 1
initcall sensors_w83l786ng_init+0x0/0x20 returned 0 after 162 usecs
calling pcipcwd_init_module+0x0/0x40 @ 1
initcall pcipcwd_init_module+0x0/0x40 returned 0 after 154 usecs
calling wdtpci_init+0x0/0x20 @ 1
initcall wdtpci_init+0x0/0x20 returned 0 after 96 usecs
calling acq_init+0x0/0x70 @ 1
WDT driver for Acquire single board computer initialising.
acquirewdt: I/O address 0x0043 already in use
acquirewdt: probe of acquirewdt failed with error -5
initcall acq_init+0x0/0x70 returned 0 after 14014 usecs
calling advwdt_init+0x0/0x70 @ 1
WDT driver for Advantech single board computer initialising.
advantechwdt: initialized. timeout=60 sec (nowayout=1)
initcall advwdt_init+0x0/0x70 returned 0 after 10407 usecs
calling watchdog_init+0x0/0x1b0 @ 1
initcall watchdog_init+0x0/0x1b0 returned -19 after 10 usecs
calling alim7101_wdt_init+0x0/0x200 @ 1
alim7101_wdt: Steve Hill <steve@navaho.co.uk>.
alim7101_wdt: ALi M7101 PMU not present - WDT not set
initcall alim7101_wdt_init+0x0/0x200 returned -16 after 8843 usecs
initcall alim7101_wdt_init+0x0/0x200 returned with error code -16
calling sc520_wdt_init+0x0/0x110 @ 1
sc520_wdt: cannot register miscdev on minor=130 (err=-16)
initcall sc520_wdt_init+0x0/0x110 returned -16 after 5068 usecs
initcall sc520_wdt_init+0x0/0x110 returned with error code -16
calling wafwdt_init+0x0/0x190 @ 1
WDT driver for Wafer 5823 single board computer initialising.
Wafer 5823 WDT: I/O address 0x0443 already in use
initcall wafwdt_init+0x0/0x190 returned -5 after 9770 usecs
initcall wafwdt_init+0x0/0x190 returned with error code -5
calling watchdog_init+0x0/0x330 @ 1
initcall watchdog_init+0x0/0x330 returned -19 after 5 usecs
calling iTCO_wdt_init_module+0x0/0x80 @ 1
iTCO_wdt: Intel TCO WatchDog Timer Driver v1.03 (30-Apr-2008)
iTCO_wdt: No card detected
initcall iTCO_wdt_init_module+0x0/0x80 returned 0 after 8045 usecs
calling iTCO_vendor_init_module+0x0/0x20 @ 1
iTCO_vendor_support: vendor-support=0
initcall iTCO_vendor_init_module+0x0/0x20 returned 0 after 3362 usecs
calling it8712f_wdt_init+0x0/0x220 @ 1
initcall it8712f_wdt_init+0x0/0x220 returned -19 after 13 usecs
calling sbc60xxwdt_init+0x0/0x1a0 @ 1
sbc60xxwdt: I/O address 0x0443 already in use
initcall sbc60xxwdt_init+0x0/0x1a0 returned -5 after 4041 usecs
initcall sbc60xxwdt_init+0x0/0x1a0 returned with error code -5
calling cpu5wdt_init_module+0x0/0x160 @ 1
cpu5wdt: sorry, was my fault
cpu5wdt: misc_register failed
initcall cpu5wdt_init_module+0x0/0x160 returned -16 after 5272 usecs
initcall cpu5wdt_init_module+0x0/0x160 returned with error code -16
calling wdt_init+0x0/0x220 @ 1
WDT driver for the Winbond(TM) W83627HF/THF/HG Super I/O chip initialising.
w83627hf/thf/hg WDT: cannot register miscdev on minor=130 (err=-16)
initcall wdt_init+0x0/0x220 returned -16 after 12511 usecs
initcall wdt_init+0x0/0x220 returned with error code -16
calling wdt_init+0x0/0x210 @ 1
w83697hf/hg WDT: WDT driver for W83697HF/HG initializing
w83697hf/hg WDT: Looking for watchdog at address 0x2e
w83697hf/hg WDT: watchdog not found at address 0x2e
w83697hf/hg WDT: No W83697HF/HG could be found
initcall wdt_init+0x0/0x210 returned -5 after 18360 usecs
initcall wdt_init+0x0/0x210 returned with error code -5
calling w83877f_wdt_init+0x0/0x180 @ 1
w83877f_wdt: I/O address 0x0443 already in use
initcall w83877f_wdt_init+0x0/0x180 returned -5 after 4127 usecs
initcall w83877f_wdt_init+0x0/0x180 returned with error code -5
calling w83977f_wdt_init+0x0/0x140 @ 1
W83977F WDT: W83977F WDT driver, v1.00
W83977F WDT: cannot register miscdev on minor=130 (err=-16)
initcall w83977f_wdt_init+0x0/0x140 returned -16 after 8670 usecs
initcall w83977f_wdt_init+0x0/0x140 returned with error code -16
calling zf_init+0x0/0x1a0 @ 1
machzwd: MachZ ZF-Logic Watchdog driver initializing.
machzwd: no ZF-Logic found
initcall zf_init+0x0/0x1a0 returned -19 after 7131 usecs
calling watchdog_init+0x0/0xc0 @ 1
epx_c3: cannot register miscdev on minor=130 (err=-16)
initcall watchdog_init+0x0/0xc0 returned -16 after 4802 usecs
initcall watchdog_init+0x0/0xc0 returned with error code -16
calling telephony_init+0x0/0x50 @ 1
Linux telephony interface: v1.00
initcall telephony_init+0x0/0x50 returned 0 after 2942 usecs
calling raid0_init+0x0/0x20 @ 1
md: raid0 personality registered for level 0
initcall raid0_init+0x0/0x20 returned 0 after 3953 usecs
calling raid_init+0x0/0x20 @ 1
md: raid1 personality registered for level 1
initcall raid_init+0x0/0x20 returned 0 after 3953 usecs
calling raid_init+0x0/0x20 @ 1
md: faulty personality registered for level -5
initcall raid_init+0x0/0x20 returned 0 after 4122 usecs
calling dm_init+0x0/0x70 @ 1
device-mapper: uevent: version 1.0.3
device-mapper: ioctl: 4.14.0-ioctl (2008-04-23) initialised: dm-devel@redhat.com
initcall dm_init+0x0/0x70 returned 0 after 11081 usecs
calling dm_delay_init+0x0/0xe0 @ 1
initcall dm_delay_init+0x0/0xe0 returned 0 after 183 usecs
calling dm_multipath_init+0x0/0x130 @ 1
device-mapper: multipath: version 1.0.5 loaded
initcall dm_multipath_init+0x0/0x130 returned 0 after 4357 usecs
calling dm_rr_init+0x0/0x50 @ 1
device-mapper: multipath round-robin: version 1.0.0 loaded
initcall dm_rr_init+0x0/0x50 returned 0 after 5139 usecs
calling dm_snapshot_init+0x0/0x220 @ 1
initcall dm_snapshot_init+0x0/0x220 returned 0 after 502 usecs
calling dm_mirror_init+0x0/0x40 @ 1
initcall dm_mirror_init+0x0/0x40 returned 0 after 2 usecs
calling dm_dirty_log_init+0x0/0x60 @ 1
initcall dm_dirty_log_init+0x0/0x60 returned 0 after 2 usecs
calling dm_zero_init+0x0/0x40 @ 1
initcall dm_zero_init+0x0/0x40 returned 0 after 2 usecs
calling cpufreq_stats_init+0x0/0xb0 @ 1
initcall cpufreq_stats_init+0x0/0xb0 returned 0 after 4 usecs
calling cpufreq_gov_powersave_init+0x0/0x20 @ 1
initcall cpufreq_gov_powersave_init+0x0/0x20 returned 0 after 1 usecs
calling cpufreq_gov_userspace_init+0x0/0x20 @ 1
initcall cpufreq_gov_userspace_init+0x0/0x20 returned 0 after 1 usecs
calling cpufreq_gov_dbs_init+0x0/0xa0 @ 1
initcall cpufreq_gov_dbs_init+0x0/0xa0 returned 0 after 96 usecs
calling cpufreq_gov_dbs_init+0x0/0x20 @ 1
initcall cpufreq_gov_dbs_init+0x0/0x20 returned 0 after 1 usecs
calling init_ladder+0x0/0x20 @ 1
cpuidle: using governor ladder
initcall init_ladder+0x0/0x20 returned 0 after 2770 usecs
calling init_menu+0x0/0x20 @ 1
cpuidle: using governor menu
initcall init_menu+0x0/0x20 returned 0 after 2602 usecs
calling i7300_idle_init+0x0/0x670 @ 1
initcall i7300_idle_init+0x0/0x670 returned -19 after 49 usecs
calling mmc_test_init+0x0/0x20 @ 1
initcall mmc_test_init+0x0/0x20 returned 0 after 145 usecs
calling sdio_uart_init+0x0/0x130 @ 1
initcall sdio_uart_init+0x0/0x130 returned 0 after 101 usecs
calling sdhci_drv_init+0x0/0x30 @ 1
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
initcall sdhci_drv_init+0x0/0x30 returned 0 after 7820 usecs
calling wbsd_drv_init+0x0/0xd0 @ 1
wbsd: Winbond W83L51xD SD/MMC card interface driver
wbsd: Copyright(c) Pierre Ossman
initcall wbsd_drv_init+0x0/0xd0 returned 0 after 7614 usecs
calling tifm_sd_init+0x0/0x20 @ 1
initcall tifm_sd_init+0x0/0x20 returned 0 after 140 usecs
calling memstick_init+0x0/0xa0 @ 1
initcall memstick_init+0x0/0xa0 returned 0 after 281 usecs
calling mspro_block_init+0x0/0x90 @ 1
initcall mspro_block_init+0x0/0x90 returned 0 after 140 usecs
calling tifm_ms_init+0x0/0x20 @ 1
initcall tifm_ms_init+0x0/0x20 returned 0 after 142 usecs
calling jmb38x_ms_init+0x0/0x20 @ 1
initcall jmb38x_ms_init+0x0/0x20 returned 0 after 171 usecs
calling clevo_mail_led_init+0x0/0xb0 @ 1
initcall clevo_mail_led_init+0x0/0xb0 returned -19 after 2 usecs
calling pca955x_leds_init+0x0/0x20 @ 1
initcall pca955x_leds_init+0x0/0x20 returned 0 after 146 usecs
calling da903x_led_init+0x0/0x20 @ 1
initcall da903x_led_init+0x0/0x20 returned 0 after 145 usecs
calling timer_trig_init+0x0/0x20 @ 1
initcall timer_trig_init+0x0/0x20 returned 0 after 2 usecs
calling heartbeat_trig_init+0x0/0x20 @ 1
initcall heartbeat_trig_init+0x0/0x20 returned 0 after 1 usecs
calling bl_trig_init+0x0/0x20 @ 1
initcall bl_trig_init+0x0/0x20 returned 0 after 1 usecs
calling ib_core_init+0x0/0x50 @ 1
initcall ib_core_init+0x0/0x50 returned 0 after 138 usecs
calling ib_mad_init_module+0x0/0xb0 @ 1
initcall ib_mad_init_module+0x0/0xb0 returned 0 after 211 usecs
calling ib_sa_init+0x0/0xb0 @ 1
initcall ib_sa_init+0x0/0xb0 returned 0 after 99 usecs
calling ib_cm_init+0x0/0x170 @ 1
initcall ib_cm_init+0x0/0x170 returned 0 after 182 usecs
calling iw_cm_init+0x0/0x40 @ 1
initcall iw_cm_init+0x0/0x40 returned 0 after 107 usecs
calling addr_init+0x0/0x50 @ 1
initcall addr_init+0x0/0x50 returned 0 after 93 usecs
calling cma_init+0x0/0xf0 @ 1
initcall cma_init+0x0/0xf0 returned 0 after 206 usecs
calling ib_umad_init+0x0/0xf0 @ 1
initcall ib_umad_init+0x0/0xf0 returned 0 after 160 usecs
calling ib_uverbs_init+0x0/0x180 @ 1
initcall ib_uverbs_init+0x0/0x180 returned 0 after 173 usecs
calling ib_ucm_init+0x0/0xc0 @ 1
initcall ib_ucm_init+0x0/0xc0 returned 0 after 4 usecs
calling ucma_init+0x0/0x60 @ 1
initcall ucma_init+0x0/0x60 returned 0 after 172 usecs
calling mthca_init+0x0/0x160 @ 1
initcall mthca_init+0x0/0x160 returned 0 after 209 usecs
calling infinipath_init+0x0/0xe0 @ 1
initcall infinipath_init+0x0/0xe0 returned 0 after 183 usecs
calling nes_init_module+0x0/0x180 @ 1
initcall nes_init_module+0x0/0x180 returned 0 after 337 usecs
calling srp_init_module+0x0/0x110 @ 1
initcall srp_init_module+0x0/0x110 returned 0 after 194 usecs
calling dcdrbu_init+0x0/0x170 @ 1
initcall dcdrbu_init+0x0/0x170 returned 0 after 168 usecs
calling ibft_init+0x0/0x630 @ 1
No iBFT detected.
initcall ibft_init+0x0/0x630 returned 0 after 1675 usecs
calling dmatest_init+0x0/0x30 @ 1
initcall dmatest_init+0x0/0x30 returned 0 after 2 usecs
calling ioat_init_module+0x0/0x20 @ 1
initcall ioat_init_module+0x0/0x20 returned 0 after 152 usecs
calling oprofile_init+0x0/0x60 @ 1
oprofile: using timer interrupt.
initcall oprofile_init+0x0/0x60 returned 0 after 2950 usecs
calling sysctl_core_init+0x0/0x30 @ 1
initcall sysctl_core_init+0x0/0x30 returned 0 after 190 usecs
calling flow_cache_init+0x0/0x1e0 @ 1
initcall flow_cache_init+0x0/0x1e0 returned 0 after 221 usecs
calling pg_init+0x0/0x2e0 @ 1
pktgen v2.70: Packet Generator for packet performance testing.
initcall pg_init+0x0/0x2e0 returned 0 after 5588 usecs
calling llc_init+0x0/0x20 @ 1
initcall llc_init+0x0/0x20 returned 0 after 2 usecs
calling snap_init+0x0/0x40 @ 1
initcall snap_init+0x0/0x40 returned 0 after 2 usecs
calling rif_init+0x0/0xa0 @ 1
initcall rif_init+0x0/0xa0 returned 0 after 30 usecs
calling blackhole_module_init+0x0/0x20 @ 1
initcall blackhole_module_init+0x0/0x20 returned 0 after 1 usecs
calling gact_init_module+0x0/0x20 @ 1
GACT probability on
initcall gact_init_module+0x0/0x20 returned 0 after 1839 usecs
calling mirred_init_module+0x0/0x20 @ 1
Mirror/redirect action on
initcall mirred_init_module+0x0/0x20 returned 0 after 2345 usecs
calling nat_init_module+0x0/0x20 @ 1
initcall nat_init_module+0x0/0x20 returned 0 after 1 usecs
calling pedit_init_module+0x0/0x20 @ 1
initcall pedit_init_module+0x0/0x20 returned 0 after 1 usecs
calling simp_init_module+0x0/0x40 @ 1
Simple TC action Loaded
initcall simp_init_module+0x0/0x40 returned 0 after 2162 usecs
calling cbq_module_init+0x0/0x20 @ 1
initcall cbq_module_init+0x0/0x20 returned 0 after 1 usecs
calling htb_module_init+0x0/0x20 @ 1
initcall htb_module_init+0x0/0x20 returned 0 after 1 usecs
calling ingress_module_init+0x0/0x20 @ 1
initcall ingress_module_init+0x0/0x20 returned 0 after 1 usecs
calling teql_init+0x0/0xf0 @ 1
input: ImPS/2 Generic Wheel Mouse as /class/input/input4
initcall teql_init+0x0/0xf0 returned 0 after 5809 usecs
calling netem_module_init+0x0/0x20 @ 1
netem: version 1.2
initcall netem_module_init+0x0/0x20 returned 0 after 1740 usecs
calling init_u32+0x0/0x50 @ 1
u32 classifier
Performance counters on
input device check on
Actions configured
initcall init_u32+0x0/0x50 returned 0 after 8507 usecs
calling init_route4+0x0/0x20 @ 1
initcall init_route4+0x0/0x20 returned 0 after 1 usecs
calling init_fw+0x0/0x20 @ 1
initcall init_fw+0x0/0x20 returned 0 after 1 usecs
calling init_rsvp+0x0/0x20 @ 1
initcall init_rsvp+0x0/0x20 returned 0 after 1 usecs
calling init_tcindex+0x0/0x20 @ 1
initcall init_tcindex+0x0/0x20 returned 0 after 1 usecs
calling init_rsvp+0x0/0x20 @ 1
initcall init_rsvp+0x0/0x20 returned 0 after 1 usecs
calling cls_flow_init+0x0/0x20 @ 1
initcall cls_flow_init+0x0/0x20 returned 0 after 1 usecs
calling init_em_cmp+0x0/0x20 @ 1
initcall init_em_cmp+0x0/0x20 returned 0 after 1 usecs
calling init_em_nbyte+0x0/0x20 @ 1
initcall init_em_nbyte+0x0/0x20 returned 0 after 1 usecs
calling init_em_text+0x0/0x20 @ 1
initcall init_em_text+0x0/0x20 returned 0 after 1 usecs
calling sysctl_ipv4_init+0x0/0x60 @ 1
initcall sysctl_ipv4_init+0x0/0x60 returned 0 after 776 usecs
calling ipip_init+0x0/0x80 @ 1
IPv4 over IPv4 tunneling driver
initcall ipip_init+0x0/0x80 returned 0 after 3539 usecs
calling ipgre_init+0x0/0xd0 @ 1
GRE over IPv4 tunneling driver
initcall ipgre_init+0x0/0xd0 returned 0 after 3605 usecs
calling init_syncookies+0x0/0x20 @ 1
initcall init_syncookies+0x0/0x20 returned 0 after 20 usecs
calling ah4_init+0x0/0x70 @ 1
initcall ah4_init+0x0/0x70 returned 0 after 2 usecs
calling esp4_init+0x0/0x70 @ 1
initcall esp4_init+0x0/0x70 returned 0 after 1 usecs
calling ipcomp4_init+0x0/0x70 @ 1
initcall ipcomp4_init+0x0/0x70 returned 0 after 1 usecs
calling ipip_init+0x0/0xc0 @ 1
initcall ipip_init+0x0/0xc0 returned 0 after 2 usecs
calling xfrm4_beet_init+0x0/0x20 @ 1
initcall xfrm4_beet_init+0x0/0x20 returned 0 after 1 usecs
calling tunnel4_init+0x0/0x70 @ 1
initcall tunnel4_init+0x0/0x70 returned 0 after 1 usecs
calling xfrm4_transport_init+0x0/0x20 @ 1
initcall xfrm4_transport_init+0x0/0x20 returned 0 after 1 usecs
calling xfrm4_mode_tunnel_init+0x0/0x20 @ 1
initcall xfrm4_mode_tunnel_init+0x0/0x20 returned 0 after 1 usecs
calling bictcp_register+0x0/0x20 @ 1
TCP bic registered
initcall bictcp_register+0x0/0x20 returned 0 after 1740 usecs
calling hstcp_register+0x0/0x20 @ 1
TCP highspeed registered
initcall hstcp_register+0x0/0x20 returned 0 after 2261 usecs
calling hybla_register+0x0/0x20 @ 1
TCP hybla registered
initcall hybla_register+0x0/0x20 returned 0 after 1923 usecs
calling htcp_register+0x0/0x20 @ 1
TCP htcp registered
initcall htcp_register+0x0/0x20 returned 0 after 1824 usecs
calling tcp_vegas_register+0x0/0x20 @ 1
TCP vegas registered
initcall tcp_vegas_register+0x0/0x20 returned 0 after 1907 usecs
calling tcp_veno_register+0x0/0x20 @ 1
TCP veno registered
initcall tcp_veno_register+0x0/0x20 returned 0 after 1839 usecs
calling tcp_yeah_register+0x0/0x20 @ 1
TCP yeah registered
initcall tcp_yeah_register+0x0/0x20 returned 0 after 1842 usecs
calling tcp_illinois_register+0x0/0x20 @ 1
TCP illinois registered
initcall tcp_illinois_register+0x0/0x20 returned 0 after 2177 usecs
calling xfrm_user_init+0x0/0x60 @ 1
Initializing XFRM netlink socket
initcall xfrm_user_init+0x0/0x60 returned 0 after 2950 usecs
calling inet6_init+0x0/0x290 @ 1
NET: Registered protocol family 10
lo: Disabled Privacy Extensions
tunl0: Disabled Privacy Extensions
initcall inet6_init+0x0/0x290 returned 0 after 17450 usecs
calling ah6_init+0x0/0x70 @ 1
initcall ah6_init+0x0/0x70 returned 0 after 1 usecs
calling ipcomp6_init+0x0/0x70 @ 1
initcall ipcomp6_init+0x0/0x70 returned 0 after 1 usecs
calling xfrm6_tunnel_init+0x0/0x120 @ 1
initcall xfrm6_tunnel_init+0x0/0x120 returned 0 after 159 usecs
calling tunnel6_init+0x0/0x70 @ 1
initcall tunnel6_init+0x0/0x70 returned 0 after 1 usecs
calling xfrm6_transport_init+0x0/0x20 @ 1
initcall xfrm6_transport_init+0x0/0x20 returned 0 after 1 usecs
calling xfrm6_mode_tunnel_init+0x0/0x20 @ 1
initcall xfrm6_mode_tunnel_init+0x0/0x20 returned 0 after 1 usecs
calling xfrm6_ro_init+0x0/0x20 @ 1
initcall xfrm6_ro_init+0x0/0x20 returned 0 after 1 usecs
calling xfrm6_beet_init+0x0/0x20 @ 1
initcall xfrm6_beet_init+0x0/0x20 returned 0 after 1 usecs
calling mip6_init+0x0/0xd0 @ 1
Mobile IPv6
initcall mip6_init+0x0/0xd0 returned 0 after 1147 usecs
calling packet_init+0x0/0x50 @ 1
NET: Registered protocol family 17
initcall packet_init+0x0/0x50 returned 0 after 3115 usecs
calling ipsec_pfkey_init+0x0/0xa0 @ 1
NET: Registered protocol family 15
initcall ipsec_pfkey_init+0x0/0xa0 returned 0 after 3111 usecs
calling br_init+0x0/0xe0 @ 1
initcall br_init+0x0/0xe0 returned 0 after 316 usecs
calling dsa_init_module+0x0/0x20 @ 1
initcall dsa_init_module+0x0/0x20 returned 0 after 91 usecs
calling ipx_init+0x0/0x120 @ 1
NET: Registered protocol family 4
evbug.c: Connected device: input4 (ImPS/2 Generic Wheel Mouse at isa0060/serio1/input0)
initcall ipx_init+0x0/0x120 returned 0 after 19948 usecs
calling atalk_init+0x0/0xa0 @ 1
NET: Registered protocol family 5
initcall atalk_init+0x0/0xa0 returned 0 after 23380 usecs
calling x25_init+0x0/0x70 @ 1
NET: Registered protocol family 9
X.25 for Linux Version 0.2
initcall x25_init+0x0/0x70 returned 0 after 5559 usecs
calling nr_proto_init+0x0/0x2c0 @ 1
NET: Registered protocol family 6
initcall nr_proto_init+0x0/0x2c0 returned 0 after 6825 usecs
calling rose_proto_init+0x0/0x2f0 @ 1
NET: Registered protocol family 11
initcall rose_proto_init+0x0/0x2f0 returned 0 after 13490 usecs
calling ax25_init+0x0/0xb0 @ 1
NET: Registered protocol family 3
initcall ax25_init+0x0/0xb0 returned 0 after 3043 usecs
calling can_init+0x0/0x120 @ 1
can: controller area network core (rev 20071116 abi 8)
NET: Registered protocol family 29
initcall can_init+0x0/0x120 returned 0 after 8078 usecs
calling raw_module_init+0x0/0x50 @ 1
can: raw protocol (rev 20071116)
initcall raw_module_init+0x0/0x50 returned 0 after 2924 usecs
calling irlan_init+0x0/0x250 @ 1
initcall irlan_init+0x0/0x250 returned 0 after 2126 usecs
calling irnet_init+0x0/0x20 @ 1
initcall irnet_init+0x0/0x20 returned 0 after 136 usecs
calling ircomm_init+0x0/0xa0 @ 1
IrCOMM protocol (Dag Brattli)
initcall ircomm_init+0x0/0xa0 returned 0 after 2689 usecs
calling ircomm_tty_init+0x0/0x180 @ 1
initcall ircomm_tty_init+0x0/0x180 returned 0 after 3790 usecs
calling init_sunrpc+0x0/0x80 @ 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
initcall init_sunrpc+0x0/0x80 returned 0 after 7804 usecs
calling init_rpcsec_gss+0x0/0x50 @ 1
initcall init_rpcsec_gss+0x0/0x50 returned 0 after 18 usecs
calling init_kerberos_module+0x0/0x40 @ 1
initcall init_kerberos_module+0x0/0x40 returned 0 after 11 usecs
calling init_spkm3_module+0x0/0x40 @ 1
initcall init_spkm3_module+0x0/0x40 returned 0 after 8 usecs
calling xprt_rdma_init+0x0/0xd0 @ 1
RPC: Registered rdma transport module.
initcall xprt_rdma_init+0x0/0xd0 returned 0 after 3570 usecs
calling svc_rdma_init+0x0/0x180 @ 1
initcall svc_rdma_init+0x0/0x180 returned 0 after 565 usecs
calling af_rxrpc_init+0x0/0x1d0 @ 1
NET: Registered protocol family 33
initcall af_rxrpc_init+0x0/0x1d0 returned 0 after 3457 usecs
calling atm_clip_init+0x0/0xb0 @ 1
initcall atm_clip_init+0x0/0xb0 returned 0 after 176 usecs
calling br2684_init+0x0/0x40 @ 1
initcall br2684_init+0x0/0x40 returned 0 after 4 usecs
calling lane_module_init+0x0/0x60 @ 1
lec.c: Nov 29 2008 11:11:00 initialized
initcall lane_module_init+0x0/0x60 returned 0 after 3534 usecs
calling atm_mpoa_init+0x0/0x40 @ 1
mpc.c: Nov 29 2008 11:10:34 initialized
initcall atm_mpoa_init+0x0/0x40 returned 0 after 3535 usecs
calling econet_proto_init+0x0/0x1f0 @ 1
NET: Registered protocol family 19
initcall econet_proto_init+0x0/0x1f0 returned 0 after 3132 usecs
calling phonet_init+0x0/0x90 @ 1
NET: Registered protocol family 35
initcall phonet_init+0x0/0x90 returned 0 after 3314 usecs
calling pep_register+0x0/0x20 @ 1
initcall pep_register+0x0/0x20 returned 0 after 151 usecs
calling vlan_proto_init+0x0/0xd0 @ 1
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
initcall vlan_proto_init+0x0/0xd0 returned 0 after 10035 usecs
calling dccp_init+0x0/0x3d0 @ 1
initcall dccp_init+0x0/0x3d0 returned 0 after 3254 usecs
calling dccp_v4_init+0x0/0xa0 @ 1
initcall dccp_v4_init+0x0/0xa0 returned 0 after 13296 usecs
calling dccp_v6_init+0x0/0xa0 @ 1
initcall dccp_v6_init+0x0/0xa0 returned 0 after 482 usecs
calling ccid3_module_init+0x0/0x20 @ 1
CCID: Registered CCID 3 (TCP-Friendly Rate Control)
initcall ccid3_module_init+0x0/0x20 returned 0 after 4859 usecs
calling ccid2_module_init+0x0/0x20 @ 1
CCID: Registered CCID 2 (TCP-like)
initcall ccid2_module_init+0x0/0x20 returned 0 after 3406 usecs
calling tfrc_module_init+0x0/0x50 @ 1
initcall tfrc_module_init+0x0/0x50 returned 0 after 450 usecs
calling sctp_init+0x0/0x7d0 @ 1
SCTP: Hash tables configured (established 14563 bind 14563)
sctp_init_sock(sk: ffff88003d548000)
initcall sctp_init+0x0/0x7d0 returned 0 after 40556 usecs
calling ieee80211_init+0x0/0x30 @ 1
ieee80211: 802.11 data/management/control stack, git-1.1.13
ieee80211: Copyright (C) 2004-2005 Intel Corporation <jketreno@linux.intel.com>
initcall ieee80211_init+0x0/0x30 returned 0 after 12138 usecs
calling ieee80211_crypto_init+0x0/0x20 @ 1
ieee80211_crypt: registered algorithm 'NULL'
initcall ieee80211_crypto_init+0x0/0x20 returned 0 after 3954 usecs
calling ieee80211_crypto_wep_init+0x0/0x20 @ 1
ieee80211_crypt: registered algorithm 'WEP'
initcall ieee80211_crypto_wep_init+0x0/0x20 returned 0 after 3872 usecs
calling tipc_init+0x0/0xc0 @ 1
TIPC: Activated (version 1.6.4 compiled Nov 29 2008 11:12:07)
NET: Registered protocol family 30
TIPC: Started in single node mode
initcall tipc_init+0x0/0xc0 returned 0 after 12403 usecs
calling powernowk8_init+0x0/0x90 @ 1
initcall powernowk8_init+0x0/0x90 returned -19 after 1 usecs
calling acpi_cpufreq_init+0x0/0xd0 @ 1
initcall acpi_cpufreq_init+0x0/0xd0 returned 0 after 1775 usecs
calling centrino_init+0x0/0x40 @ 1
initcall centrino_init+0x0/0x40 returned -16 after 1 usecs
initcall centrino_init+0x0/0x40 returned with error code -16
calling hpet_insert_resource+0x0/0x30 @ 1
initcall hpet_insert_resource+0x0/0x30 returned 0 after 4 usecs
calling lapic_insert_resource+0x0/0x50 @ 1
initcall lapic_insert_resource+0x0/0x50 returned 0 after 1 usecs
calling init_lapic_nmi_sysfs+0x0/0x40 @ 1
initcall init_lapic_nmi_sysfs+0x0/0x40 returned 0 after 1 usecs
calling ioapic_insert_resources+0x0/0x60 @ 1
IO APIC resources could be not be allocated.
initcall ioapic_insert_resources+0x0/0x60 returned -1 after 3953 usecs
initcall ioapic_insert_resources+0x0/0x60 returned with error code -1
calling io_apic_bug_finalize+0x0/0x20 @ 1
initcall io_apic_bug_finalize+0x0/0x20 returned 0 after 1 usecs
calling check_early_ioremap_leak+0x0/0x70 @ 1
initcall check_early_ioremap_leak+0x0/0x70 returned 0 after 1 usecs
calling sched_init_debug+0x0/0x30 @ 1
initcall sched_init_debug+0x0/0x30 returned 0 after 12 usecs
calling init_oops_id+0x0/0x30 @ 1
initcall init_oops_id+0x0/0x30 returned 0 after 1 usecs
calling disable_boot_consoles+0x0/0x40 @ 1
initcall disable_boot_consoles+0x0/0x40 returned 0 after 1 usecs
calling pm_qos_power_init+0x0/0x90 @ 1
initcall pm_qos_power_init+0x0/0x90 returned 0 after 492 usecs
calling taskstats_init+0x0/0xb0 @ 1
registered taskstats version 1
initcall taskstats_init+0x0/0xb0 returned 0 after 2786 usecs
calling afs_init+0x0/0x140 @ 1
kAFS: Red Hat AFS client v0.1 registering.
initcall afs_init+0x0/0x140 returned 0 after 4177 usecs
calling random32_reseed+0x0/0xa0 @ 1
initcall random32_reseed+0x0/0xa0 returned 0 after 4 usecs
calling pci_sysfs_init+0x0/0x60 @ 1
initcall pci_sysfs_init+0x0/0x60 returned 0 after 240 usecs
calling acpi_wakeup_device_init+0x0/0xac @ 1
initcall acpi_wakeup_device_init+0x0/0xac returned 0 after 3 usecs
calling acpi_sleep_proc_init+0x0/0x4f @ 1
initcall acpi_sleep_proc_init+0x0/0x4f returned 0 after 8 usecs
calling boot_wait_for_devices+0x0/0x20 @ 1
initcall boot_wait_for_devices+0x0/0x20 returned 0 after 1 usecs
calling seqgen_init+0x0/0x10 @ 1
initcall seqgen_init+0x0/0x10 returned 0 after 10 usecs
calling hd_init+0x0/0x350 @ 1
hd: no drives specified - use hd=cyl,head,sectors on kernel command line
initcall hd_init+0x0/0x350 returned -1 after 6373 usecs
initcall hd_init+0x0/0x350 returned with error code -1
calling scsi_complete_async_scans+0x0/0x100 @ 1
initcall scsi_complete_async_scans+0x0/0x100 returned 0 after 1 usecs
calling rtc_hctosys+0x0/0x1a0 @ 1
rtc_cmos 00:03: setting system clock to 2008-11-29 10:16:44 UTC (1227953804)
initcall rtc_hctosys+0x0/0x1a0 returned 0 after 6683 usecs
calling edd_init+0x0/0x2c0 @ 1
BIOS EDD facility v0.16 2004-Jun-25, 2 devices found
initcall edd_init+0x0/0x2c0 returned 0 after 4848 usecs
calling tcp_congestion_default+0x0/0x20 @ 1
initcall tcp_congestion_default+0x0/0x20 returned 0 after 2 usecs
calling ip_auto_config+0x0/0xeb0 @ 1
initcall ip_auto_config+0x0/0xeb0 returned 0 after 15 usecs
md: Waiting for all devices to be available before autodetect
md: If you don't use raid, use raid=noautodetect
md: Autodetecting RAID arrays.
md: Scanned 0 and added 0 devices.
md: autorun ...
md: ... autorun DONE.
kjournald starting. Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
VFS: Mounted root (ext3 filesystem) readonly.
debug: unmapping init memory ffffffff814a1000..ffffffff81759000
Write protecting the kernel read-only data: 17316k
Testing CPA: undo ffffffff80209000-ffffffff812f2000
Testing CPA: again
khelper used greatest stack depth: 4856 bytes left
uname used greatest stack depth: 4712 bytes left
mount used greatest stack depth: 3640 bytes left
sed used greatest stack depth: 3568 bytes left
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2519, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2519, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2519, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
md: Autodetecting RAID arrays.
md: Scanned 0 and added 0 devices.
md: autorun ...
md: ... autorun DONE.
EXT3 FS on sda1, internal journal
kjournald starting. Commit interval 5 seconds
EXT3 FS on sdb1, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
rc.sysinit used greatest stack depth: 3400 bytes left
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2680, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2680, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2680, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2685, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2685, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2685, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a70a4>] ? __rmqueue_smallest+0x144/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2686, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2686, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2686, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2687, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2687, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2687, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2688, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2688, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2688, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2689, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2689, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2689, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2690, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2690, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2690, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2691, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2691, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2691, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2692, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2692, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2692, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2693, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2693, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2693, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2694, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2694, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2694, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2695, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2695, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2695, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2696, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2696, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2696, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2697, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2697, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2697, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2698, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2698, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2698, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2699, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2699, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2699, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2700, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2700, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2700, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2701, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2701, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2701, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2702, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2702, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2702, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2703, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2703, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2703, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2704, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2704, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2704, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2705, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2705, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2705, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2706, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2706, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2706, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2707, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2707, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2707, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2708, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2708, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2708, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2709, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2709, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2709, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2710, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2710, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2710, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2711, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2711, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2711, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2712, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2712, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2712, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2713, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2713, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2713, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2714, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2714, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2714, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2715, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2715, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2715, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2716, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2716, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2716, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2717, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2717, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2717, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2718, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2718, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2718, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
ADDRCONF(NETDEV_UP): eth0: link is not ready
CPA self-test:
4k 261888 large 0 gb 0 x 261888[ffff880000000000-ffff88003feff000] miss 0
4k 261888 large 0 gb 0 x 261888[ffff880000000000-ffff88003feff000] miss 0
4k 261888 large 0 gb 0 x 261888[ffff880000000000-ffff88003feff000] miss 0
ok.
0000:04:00.0: eth0: Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX
ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2994, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2994, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 2994, comm: sysctl Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3181, comm: distccd Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a2a00>] ? find_get_page+0x0/0xd0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8023f834>] ia32_sysret+0x0/0xa
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3181, comm: distccd Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8023f834>] ia32_sysret+0x0/0xa
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3181, comm: distccd Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8023f834>] ia32_sysret+0x0/0xa
---[ end trace 4eaa2a86a8e2da22 ]---
eth0: no IPv6 routers present
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3011, comm: irqbalance Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3011, comm: irqbalance Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3011, comm: irqbalance Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
evbug.c: Event. Dev: input2, Type: 20, Code: 0, Value: 500
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3613, comm: pgrep Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3613, comm: pgrep Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3613, comm: pgrep Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3620, comm: pgrep Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3620, comm: pgrep Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3620, comm: pgrep Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3617, comm: ps Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff802553fd>] ? release_console_sem+0x20d/0x230
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802baf7f>] ? vma_adjust+0xff/0x470
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e43e36>] ? _spin_unlock+0x26/0x30
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3617, comm: ps Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3617, comm: ps Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3617, comm: ps Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802cbd18>] ? check_bytes_and_report+0x38/0xe0
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff80278148>] ? debug_mutex_init+0x38/0x60
[<ffffffff802ef6d9>] ? seq_open+0x89/0xb0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff80e42503>] ? __mutex_lock_common+0x343/0x430
[<ffffffff802efa69>] ? seq_read+0x39/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3617, comm: ps Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
irq >= NR_IRQS in irq_to_desc: 4352 4352
------------[ cut here ]------------
WARNING: at kernel/irq/handle.c:164 irq_to_desc+0x42/0x50()
Hardware name:
Pid: 3617, comm: ps Tainted: G W 2.6.28-rc6-tip-01066-gb8cb0e0-dirty #1
Call Trace:
[<ffffffff80254b37>] warn_slowpath+0xd7/0x100
[<ffffffff80255e1c>] ? vprintk+0x2dc/0x4d0
[<ffffffff802a703f>] ? __rmqueue_smallest+0xdf/0x160
[<ffffffff80256077>] ? printk+0x67/0x70
[<ffffffff802a8f40>] ? get_page_from_freelist+0x5e0/0x6d0
[<ffffffff80291da2>] irq_to_desc+0x42/0x50
[<ffffffff803234af>] show_stat+0x15f/0x500
[<ffffffff802a71de>] ? __get_free_pages+0xe/0x60
[<ffffffff802efb4e>] ? seq_read+0x11e/0x340
[<ffffffff802efb0a>] seq_read+0xda/0x340
[<ffffffff805cd265>] ? _raw_spin_unlock+0x55/0xa0
[<ffffffff802efa30>] ? seq_read+0x0/0x340
[<ffffffff8031afdd>] proc_reg_read+0x7d/0xc0
[<ffffffff802d565c>] vfs_read+0xbc/0x110
[<ffffffff802d61a0>] sys_read+0x50/0x90
[<ffffffff8021363a>] system_call_fastpath+0x16/0x1b
---[ end trace 4eaa2a86a8e2da22 ]---
gam_server[3555]: segfault at 0 ip 00000031a2e72af9 sp 00007fff89888df0 error 4 in libc-2.5.so[31a2e00000+146000]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] irq: sparseirq enabling v4
2008-11-29 10:02 ` Ingo Molnar
2008-11-29 10:26 ` Ingo Molnar
@ 2008-11-29 10:57 ` Sam Ravnborg
2008-11-29 14:33 ` Ingo Molnar
1 sibling, 1 reply; 20+ messages in thread
From: Sam Ravnborg @ 2008-11-29 10:57 UTC (permalink / raw)
To: Ingo Molnar
Cc: Yinghai Lu, Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
>
> very nice!
>
> All the structural feedback i gave seems to be addressed properly, and
> the patch has shrunk and consolidated nicely. I think we can start
> splitting it up and applying it to tip/irq/sparseirq. We might notice a
> few more details when that happens, on a per patch basis.
Hi Ingo / Yinghai.
Was the concerns raised by Benjamin, davem, others addressed?
Just curious - I have never looked into this part of the kernel.
Sam
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] irq: sparseirq enabling v4
2008-11-29 10:57 ` [PATCH] irq: sparseirq enabling v4 Sam Ravnborg
@ 2008-11-29 14:33 ` Ingo Molnar
2008-11-29 17:54 ` Sam Ravnborg
0 siblings, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2008-11-29 14:33 UTC (permalink / raw)
To: Sam Ravnborg, David S. Miller, Benjamin Herrenschmidt
Cc: Yinghai Lu, Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
* Sam Ravnborg <sam@ravnborg.org> wrote:
> > very nice!
> >
> > All the structural feedback i gave seems to be addressed properly,
> > and the patch has shrunk and consolidated nicely. I think we can
> > start splitting it up and applying it to tip/irq/sparseirq. We might
> > notice a few more details when that happens, on a per patch basis.
>
> Hi Ingo / Yinghai.
>
> Was the concerns raised by Benjamin, davem, others addressed? Just
> curious - I have never looked into this part of the kernel.
(Cc:-ed DaveM and BenH)
I cannot speak for them, but my concens have been addressed. AFAICT the
feedback from non-x86 land centered around two main areas:
1) the SPARSEIRQ generic IRQ layer changes were ugly and complex
That was one of my worries too and it has all been made rather elegant,
simple and fast via the new irq_desc_ptrs[] approach. (It can also be a
speedup on NUMA as irq->desc can now host the irq statistics counters,
etc. - so there will be an incentive for architectures to switch over
to sparse irq_desc[], even if they do not plan to support 4096 CPUs or
more)
2) that x86 should do this all via virtual IRQ remapping
I think this was based on a misunderstanding of what x86 architecture
does currently and where it wants to go with these changes.
Firstly, the x86 architecture already remaps interrupts in a number of
areas: it remaps them on certain 32-bit systems via the use of irq
compression, and it remaps them for virtual MSI irqs as well. (which
are virtual to begin with)
But the problem is not the ability or inability to remap IRQs on x86 -
that can obviously be done (and is being done) in a number of areas
when we want to shape or compress the IRQ space more intelligently.
The problem that is solved here is that we want to enable distros to
build a kernel with NR_CPUS and NR_IRQS set to really high numbers
(4096 for NR_CPUS and 16K for NR_IRQS), and hence the plain static size
of all NR_IRQS arrays in the core kernel become an issue (== megabytes
of RAM wasted even on a plain dual core system). No amount of virtual
IRQ remapping in architecture code can solve that problem - we had to
reduce the size of those core kernel arrays.
If there were any other concerns that i missed, please let us know.
Ingo
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] irq: sparseirq enabling v4
2008-11-29 14:33 ` Ingo Molnar
@ 2008-11-29 17:54 ` Sam Ravnborg
0 siblings, 0 replies; 20+ messages in thread
From: Sam Ravnborg @ 2008-11-29 17:54 UTC (permalink / raw)
To: Ingo Molnar
Cc: David S. Miller, Benjamin Herrenschmidt, Yinghai Lu,
Thomas Gleixner, H. Peter Anvin, Andrew Morton,
linux-kernel@vger.kernel.org
On Sat, Nov 29, 2008 at 03:33:27PM +0100, Ingo Molnar wrote:
>
> I cannot speak for them, but my concens have been addressed. AFAICT the
> feedback from non-x86 land centered around two main areas:
>
....
Hi Ingo,
thanks for a nice summary.
Sam
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH] irq: sparse irq_desc[] support - fix
2008-11-29 10:26 ` Ingo Molnar
@ 2008-12-01 4:44 ` Yinghai Lu
0 siblings, 0 replies; 20+ messages in thread
From: Yinghai Lu @ 2008-12-01 4:44 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H. Peter Anvin, Andrew Morton
Cc: linux-kernel@vger.kernel.org
Impact: fix warning
remove unneeded warning
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
index 2861122..8aa0954 100644
--- a/kernel/irq/handle.c
+++ b/kernel/irq/handle.c
@@ -158,13 +158,7 @@ void __init early_irq_init(void)
struct irq_desc *irq_to_desc(unsigned int irq)
{
- if (irq >= NR_IRQS) {
- printk(KERN_WARNING "irq >= NR_IRQS in irq_to_desc: %d %d\n",
- irq, NR_IRQS);
- WARN_ON(1);
- return NULL;
- }
- return irq_desc_ptrs[irq];
+ return (irq < NR_IRQS) ? irq_desc_ptrs[irq] : NULL;
}
struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu)
^ permalink raw reply related [flat|nested] 20+ messages in thread
end of thread, other threads:[~2008-12-01 4:45 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-24 2:59 [PATCH 1/2] irq: sparseirq enabling Yinghai Lu
2008-11-24 14:40 ` Ingo Molnar
2008-11-24 19:22 ` Yinghai Lu
2008-11-24 22:26 ` Thomas Gleixner
2008-11-25 3:57 ` [PATCH 1/2] irq: sparseirq enabling v2 Yinghai Lu
2008-11-25 3:58 ` [PATCH 2/2] irq: move irq_desc according to smp_affinity v2 Yinghai Lu
2008-11-26 7:48 ` [PATCH 1/2] irq: sparseirq enabling v2 Ingo Molnar
2008-11-26 8:02 ` Yinghai Lu
2008-11-26 8:17 ` Ingo Molnar
2008-11-26 18:33 ` Yinghai Lu
2008-11-27 2:26 ` [PATCH 1/2] irq: sparseirq enabling v3 Yinghai Lu
2008-11-27 2:26 ` [PATCH 2/2] irq: move irq_desc according to smp_affinity v3 Yinghai Lu
2008-11-28 16:34 ` [PATCH 1/2] irq: sparseirq enabling v3 Ingo Molnar
2008-11-29 7:13 ` [PATCH] irq: sparseirq enabling v4 Yinghai Lu
2008-11-29 10:02 ` Ingo Molnar
2008-11-29 10:26 ` Ingo Molnar
2008-12-01 4:44 ` [PATCH] irq: sparse irq_desc[] support - fix Yinghai Lu
2008-11-29 10:57 ` [PATCH] irq: sparseirq enabling v4 Sam Ravnborg
2008-11-29 14:33 ` Ingo Molnar
2008-11-29 17:54 ` Sam Ravnborg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox